summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllen Winter <allen.winter@kdab.com>2022-06-11 11:38:24 -0400
committerAllen Winter <allen.winter@kdab.com>2022-06-11 12:59:14 -0400
commit6b74841772981be4c88dc176634bafd2e6ad7b7c (patch)
tree751d2668b557e4199dedd1d5881fd58e163b04a0
parent3d033a489cba309d98fb52166fbe77908f3305e7 (diff)
parenta8ef3de84cc5740978a49dcf7b8eeb2cd5fc6cb8 (diff)
downloadlibical-git-flexbison.tar.gz
Merge branch 'master' into flexbisonflexbison
-rw-r--r--.cmake-format.py241
-rw-r--r--.codespellrc2
-rw-r--r--.krazy7
-rw-r--r--.mdlrc1
-rw-r--r--.mdlrc.rb4
-rw-r--r--.pre-commit-config.yaml40
-rw-r--r--.pylintrc590
-rw-r--r--.reuse/dep539
-rw-r--r--CMakeLists.txt279
-rw-r--r--ConfigureChecks.cmake27
-rw-r--r--Install.txt4
-rw-r--r--LICENSE.LGPL21.txt516
-rw-r--r--LICENSE.txt (renamed from LICENSE)0
-rw-r--r--LICENSES/BSD-3-Clause.txt11
-rw-r--r--LICENSES/CC0-1.0.txt121
-rw-r--r--LICENSES/LGPL-2.1-only.txt175
-rw-r--r--LICENSES/LicenseRef-APPLEMIT.txt29
-rw-r--r--LICENSES/LicenseRef-CISST.txt157
-rw-r--r--LICENSES/MPL-2.0.txt (renamed from LICENSE.MPL2.txt)0
-rw-r--r--LICENSES/Unlicense.txt10
-rw-r--r--LibIcalConfig.cmake.in3
-rw-r--r--README.md (renamed from ReadMe.txt)44
l---------ReadMe.md1
-rw-r--r--ReleaseNotes.txt106
-rw-r--r--appveyor.yml38
-rw-r--r--cmake/Toolchain-Linux-GCC-i686.cmake29
-rw-r--r--cmake/Toolchain-OSX-GCC-i686.cmake29
-rw-r--r--cmake/Toolchain-QNX-common.cmake (renamed from cmake/Toolchain-QNX66.cmake)30
-rw-r--r--cmake/Toolchain-QNX650-armv7.cmake (renamed from cmake/Toolchain-QNX65.cmake)24
-rw-r--r--cmake/Toolchain-QNX650-x86.cmake88
-rw-r--r--cmake/Toolchain-QNX660-armv7.cmake21
-rw-r--r--cmake/Toolchain-QNX660-common.cmake23
-rw-r--r--cmake/Toolchain-QNX660-x86.cmake21
-rw-r--r--cmake/Toolchain-QNX700-aarch64.cmake22
-rw-r--r--cmake/Toolchain-QNX700-armv7.cmake22
-rw-r--r--cmake/Toolchain-QNX700-common.cmake27
-rw-r--r--cmake/Toolchain-QNX700-x86.cmake22
-rw-r--r--cmake/Toolchain-QNX700-x86_64.cmake22
-rw-r--r--cmake/Toolchain-RPI.cmake30
-rw-r--r--cmake/Toolchain-Yocto.cmake30
-rw-r--r--cmake/Toolchain-android.cmake1688
-rw-r--r--cmake/Toolchain-blackberry-armv7le.cmake30
-rw-r--r--cmake/Toolchain-iMX6.cmake31
-rw-r--r--cmake/Toolchain-iOS.cmake130
-rw-r--r--cmake/Toolchain-jetson-tk1.cmake29
-rw-r--r--cmake/modules/FindBDB.cmake4
-rw-r--r--cmake/modules/FindBerkeleyDB.cmake168
-rw-r--r--cmake/modules/FindGLib.cmake5
-rw-r--r--cmake/modules/FindGObjectIntrospection.cmake8
-rw-r--r--cmake/modules/FindLibXML.cmake5
-rw-r--r--cmake/modules/FindWcecompat.cmake6
-rw-r--r--cmake/modules/GObjectIntrospectionMacros.cmake97
-rw-r--r--cmake/modules/GtkDoc.cmake62
-rw-r--r--cmake/modules/LibIcalMacrosInternal.cmake17
-rw-r--r--cmake/run_test.cmake9
-rw-r--r--config.h.cmake40
-rw-r--r--design-data/CMakeLists.txt3
-rw-r--r--design-data/components.txt5
-rw-r--r--design-data/parameters.csv26
-rw-r--r--design-data/params-in-prop.txt7
-rw-r--r--design-data/properties.csv30
-rw-r--r--design-data/restrictions.csv556
-rw-r--r--design-data/value-types.csv17
-rw-r--r--doc/CMakeLists.txt7
-rw-r--r--doc/Doxyfile.cmake7
-rw-r--r--doc/Mainpage.dox37
-rw-r--r--doc/UsingLibical.md277
-rw-r--r--doc/UsingLibical.txt1371
-rw-r--r--doc/reference/CMakeLists.txt3
-rw-r--r--doc/reference/libical-glib/CMakeLists.txt19
-rw-r--r--examples/CMakeLists.txt7
-rw-r--r--examples/access_components.c18
-rw-r--r--examples/access_properties_and_parameters.c9
-rw-r--r--examples/changenames.pl4
-rw-r--r--examples/errors.c14
-rw-r--r--examples/main.c8
-rw-r--r--examples/parse_text.c7
-rw-r--r--libical.pc.in3
-rw-r--r--scripts/CMakeLists.txt3
-rwxr-xr-xscripts/buildtests.sh73
-rw-r--r--[-rwxr-xr-x]scripts/mkderivedcomponents.pl27
-rw-r--r--[-rwxr-xr-x]scripts/mkderivedparameters.pl10
-rw-r--r--[-rwxr-xr-x]scripts/mkderivedproperties.pl10
-rw-r--r--[-rwxr-xr-x]scripts/mkderivedvalues.pl12
-rw-r--r--[-rwxr-xr-x]scripts/mkrestrictiontable.pl44
-rw-r--r--scripts/readvaluesfile.pl56
-rw-r--r--scripts/set_compiler_env.bat19
-rwxr-xr-xscripts/setup-travis.sh3
-rw-r--r--src/CMakeLists.txt3
-rw-r--r--src/Net-ICal-Libical/Makefile.PL4
-rw-r--r--src/Net-ICal-Libical/README.txt (renamed from src/Net-ICal-Libical/README)0
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical.pm10
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical/Component.pm10
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical/Duration.pm10
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical/Period.pm10
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical/Property.pm10
-rw-r--r--src/Net-ICal-Libical/lib/Net/ICal/Libical/Time.pm10
-rw-r--r--src/Net-ICal-Libical/netical.i13
-rw-r--r--src/Net-ICal-Libical/test/component.pl10
-rw-r--r--[-rwxr-xr-x]src/Net-ICal-Libical/test/libical.pl10
-rw-r--r--[-rwxr-xr-x]src/Net-ICal-Libical/test/swig.pl10
-rw-r--r--src/java/CMakeLists.txt2
-rw-r--r--src/java/ICalDurationType.java3
-rw-r--r--src/java/ICalParameter.java3
-rw-r--r--src/java/ICalPeriodType.java3
-rw-r--r--src/java/ICalProperty.java3
-rw-r--r--src/java/ICalRecurrenceType.java3
-rw-r--r--src/java/ICalTimeType.java4
-rw-r--r--src/java/ICalTriggerType.java4
-rw-r--r--src/java/ICalValue.java3
-rw-r--r--src/java/VAgenda.java5
-rw-r--r--src/java/VAlarm.java5
-rw-r--r--src/java/VCalendar.java5
-rw-r--r--src/java/VComponent.java3
-rw-r--r--src/java/VEvent.java5
-rw-r--r--src/java/VFreeBusy.java9
-rw-r--r--src/java/VQuery.java5
-rw-r--r--src/java/VToDo.java5
-rw-r--r--src/java/jlibical_consts_cxx.h12
-rw-r--r--src/java/jlibical_utils_cxx.cpp13
-rw-r--r--src/java/jlibical_utils_cxx.h13
-rw-r--r--src/java/jniICalDurationType_cxx.cpp13
-rw-r--r--src/java/jniICalDurationType_cxx.h14
-rw-r--r--src/java/jniICalPeriodType_cxx.cpp15
-rw-r--r--src/java/jniICalPeriodType_cxx.h14
-rw-r--r--src/java/jniICalRecurrenceType_cxx.cpp15
-rw-r--r--src/java/jniICalRecurrenceType_cxx.h13
-rw-r--r--src/java/jniICalTimeType_cxx.cpp13
-rw-r--r--src/java/jniICalTimeType_cxx.h13
-rw-r--r--src/java/jniICalTriggerType_cxx.cpp13
-rw-r--r--src/java/jniICalTriggerType_cxx.h14
-rw-r--r--src/java/net_cp_jlibical_ICalParameter_cxx.cpp12
-rw-r--r--src/java/net_cp_jlibical_ICalParameter_cxx.h12
-rw-r--r--src/java/net_cp_jlibical_ICalProperty_cxx.cpp13
-rw-r--r--src/java/net_cp_jlibical_ICalProperty_cxx.h12
-rw-r--r--src/java/net_cp_jlibical_ICalValue_cxx.cpp12
-rw-r--r--src/java/net_cp_jlibical_ICalValue_cxx.h12
-rw-r--r--src/java/net_cp_jlibical_VComponent_cxx.cpp13
-rw-r--r--src/java/net_cp_jlibical_VComponent_cxx.h12
-rw-r--r--src/java/testjni.java7
-rw-r--r--src/libical-glib/CMakeLists.txt58
-rw-r--r--src/libical-glib/api/i-cal-array.xml14
-rw-r--r--src/libical-glib/api/i-cal-attach.xml18
-rw-r--r--src/libical-glib/api/i-cal-comp-iter.xml12
-rw-r--r--src/libical-glib/api/i-cal-component.xml91
-rw-r--r--src/libical-glib/api/i-cal-datetimeperiod.xml12
-rw-r--r--src/libical-glib/api/i-cal-derived-parameter.xml169
-rw-r--r--src/libical-glib/api/i-cal-derived-property.xml12
-rw-r--r--src/libical-glib/api/i-cal-derived-value.xml48
-rw-r--r--src/libical-glib/api/i-cal-duration.xml12
-rw-r--r--src/libical-glib/api/i-cal-enums.xml12
-rw-r--r--src/libical-glib/api/i-cal-error.xml12
-rw-r--r--src/libical-glib/api/i-cal-geo.xml44
-rw-r--r--src/libical-glib/api/i-cal-memory.xml12
-rw-r--r--src/libical-glib/api/i-cal-mime.xml12
-rw-r--r--src/libical-glib/api/i-cal-parameter.xml20
-rw-r--r--src/libical-glib/api/i-cal-parser.xml18
-rw-r--r--src/libical-glib/api/i-cal-period.xml12
-rw-r--r--src/libical-glib/api/i-cal-property.xml12
-rw-r--r--src/libical-glib/api/i-cal-recur-iterator.xml12
-rw-r--r--src/libical-glib/api/i-cal-recur.xml12
-rw-r--r--src/libical-glib/api/i-cal-recurrence.xml12
-rw-r--r--src/libical-glib/api/i-cal-reqstat.xml12
-rw-r--r--src/libical-glib/api/i-cal-restriction.xml12
-rw-r--r--src/libical-glib/api/i-cal-time-span.xml12
-rw-r--r--src/libical-glib/api/i-cal-time.xml18
-rw-r--r--src/libical-glib/api/i-cal-timezone.xml14
-rw-r--r--src/libical-glib/api/i-cal-trigger.xml12
-rw-r--r--src/libical-glib/api/i-cal-unknowntokenhandling.xml12
-rw-r--r--src/libical-glib/api/i-cal-value.xml16
-rw-r--r--src/libical-glib/i-cal-object.c.in107
-rw-r--r--src/libical-glib/i-cal-object.h.in18
-rw-r--r--src/libical-glib/libical-glib.pc.in3
-rw-r--r--src/libical-glib/tools/generator.c49
-rw-r--r--src/libical-glib/tools/generator.h13
-rw-r--r--src/libical-glib/tools/header-forward-declarations-template14
-rw-r--r--src/libical-glib/tools/header-header-template18
-rw-r--r--src/libical-glib/tools/header-template14
-rw-r--r--src/libical-glib/tools/source-template14
-rw-r--r--src/libical-glib/tools/xml-parser.c13
-rw-r--r--src/libical-glib/tools/xml-parser.h12
-rw-r--r--src/libical/CMakeLists.txt35
-rw-r--r--src/libical/astime.h13
-rw-r--r--src/libical/caldate.c20
-rw-r--r--src/libical/ical_file.cmake5
-rw-r--r--src/libical/icalarray.c50
-rw-r--r--src/libical/icalarray.h46
-rw-r--r--src/libical/icalattach.c31
-rw-r--r--src/libical/icalattach.h56
-rw-r--r--src/libical/icalattachimpl.h12
-rw-r--r--src/libical/icalcomponent.c233
-rw-r--r--src/libical/icalcomponent.h42
-rw-r--r--src/libical/icalderivedparameter.c.in13
-rw-r--r--src/libical/icalderivedparameter.h.in13
-rw-r--r--src/libical/icalderivedproperty.c.in12
-rw-r--r--src/libical/icalderivedproperty.h.in13
-rw-r--r--src/libical/icalderivedvalue.c.in33
-rw-r--r--src/libical/icalderivedvalue.h.in12
-rw-r--r--src/libical/icalduration.c17
-rw-r--r--src/libical/icalduration.h49
-rw-r--r--src/libical/icalenums.c27
-rw-r--r--src/libical/icalenums.h19
-rw-r--r--src/libical/icalerror.c28
-rw-r--r--src/libical/icalerror.h65
-rw-r--r--src/libical/icallangbind.c26
-rw-r--r--src/libical/icallangbind.h12
-rw-r--r--src/libical/icalmemory.c155
-rw-r--r--src/libical/icalmemory.h105
-rw-r--r--src/libical/icalmime.c38
-rw-r--r--src/libical/icalmime.h12
-rw-r--r--src/libical/icalparameter.c35
-rw-r--r--src/libical/icalparameter.h134
-rw-r--r--src/libical/icalparameter_cxx.cpp12
-rw-r--r--src/libical/icalparameter_cxx.h12
-rw-r--r--src/libical/icalparameterimpl.h13
-rw-r--r--src/libical/icalparser.c47
-rw-r--r--src/libical/icalparser.h65
-rw-r--r--src/libical/icalperiod.c13
-rw-r--r--src/libical/icalperiod.h27
-rw-r--r--src/libical/icalproperty.c41
-rw-r--r--src/libical/icalproperty.h14
-rw-r--r--src/libical/icalproperty_cxx.cpp12
-rw-r--r--src/libical/icalproperty_cxx.h12
-rw-r--r--src/libical/icalproperty_p.h12
-rw-r--r--src/libical/icalrecur.c63
-rw-r--r--src/libical/icalrecur.h18
-rw-r--r--src/libical/icalrestriction.c.in661
-rw-r--r--src/libical/icalrestriction.h19
-rw-r--r--src/libical/icaltime.c67
-rw-r--r--src/libical/icaltime.h.cmake (renamed from src/libical/icaltime.h)32
-rw-r--r--src/libical/icaltimezone.c98
-rw-r--r--src/libical/icaltimezone.h12
-rw-r--r--src/libical/icaltimezoneimpl.h12
-rw-r--r--src/libical/icaltypes.c12
-rw-r--r--src/libical/icaltypes.h17
-rw-r--r--src/libical/icaltz-util.c72
-rw-r--r--src/libical/icaltz-util.h17
-rw-r--r--src/libical/icalvalue.c99
-rw-r--r--src/libical/icalvalue.h12
-rw-r--r--src/libical/icalvalue_cxx.cpp12
-rw-r--r--src/libical/icalvalue_cxx.h12
-rw-r--r--src/libical/icalvalueimpl.h13
-rw-r--r--src/libical/icalversion.h.cmake12
-rw-r--r--src/libical/icptrholder_cxx.h16
-rw-r--r--src/libical/libical_deprecated.h5
-rw-r--r--src/libical/libical_ical_export.h5
-rw-r--r--src/libical/pvl.c24
-rw-r--r--src/libical/pvl.h12
-rw-r--r--src/libical/qsort_gen.c11
-rw-r--r--src/libical/qsort_gen.h14
-rw-r--r--src/libical/sspm.c114
-rw-r--r--src/libical/sspm.h26
-rw-r--r--src/libical/vcomponent_cxx.cpp12
-rw-r--r--src/libical/vcomponent_cxx.h12
-rw-r--r--src/libicalss/CMakeLists.txt10
-rw-r--r--src/libicalss/icalbdbset.c31
-rw-r--r--src/libicalss/icalbdbset.h12
-rw-r--r--src/libicalss/icalbdbset_cxx.h13
-rw-r--r--src/libicalss/icalbdbsetimpl.h12
-rw-r--r--src/libicalss/icalcalendar.c12
-rw-r--r--src/libicalss/icalcalendar.h13
-rw-r--r--src/libicalss/icalclassify.c18
-rw-r--r--src/libicalss/icalclassify.h12
-rw-r--r--src/libicalss/icalcluster.c12
-rw-r--r--src/libicalss/icalcluster.h12
-rw-r--r--src/libicalss/icalclusterimpl.h12
-rw-r--r--src/libicalss/icaldirset.c13
-rw-r--r--src/libicalss/icaldirset.h13
-rw-r--r--src/libicalss/icaldirsetimpl.h13
-rw-r--r--src/libicalss/icalfileset.c18
-rw-r--r--src/libicalss/icalfileset.h13
-rw-r--r--src/libicalss/icalfilesetimpl.h13
-rw-r--r--src/libicalss/icalgauge.c13
-rw-r--r--src/libicalss/icalgauge.h13
-rw-r--r--src/libicalss/icalgaugeimpl.h12
-rw-r--r--src/libicalss/icalmessage.c15
-rw-r--r--src/libicalss/icalmessage.h12
-rw-r--r--src/libicalss/icalset.c13
-rw-r--r--src/libicalss/icalset.h13
-rw-r--r--src/libicalss/icalspanlist.c44
-rw-r--r--src/libicalss/icalspanlist.h20
-rw-r--r--src/libicalss/icalspanlist_cxx.cpp12
-rw-r--r--src/libicalss/icalspanlist_cxx.h13
-rw-r--r--src/libicalss/icalss_file.cmake3
-rw-r--r--src/libicalss/icalsslexer.l31
-rw-r--r--src/libicalss/icalssyacc.h5
-rw-r--r--src/libicalss/icalssyacc.y155
-rw-r--r--src/libicalss/libical_icalss_export.h5
-rw-r--r--src/libicalvcal/CMakeLists.txt3
-rw-r--r--src/libicalvcal/README.txt (renamed from src/libicalvcal/README.TXT)1910
-rw-r--r--src/libicalvcal/icalvcal.c25
-rw-r--r--src/libicalvcal/icalvcal.h12
-rw-r--r--src/libicalvcal/libical_vcal_export.h5
-rw-r--r--src/libicalvcal/vcaltmp.c38
-rw-r--r--src/libicalvcal/vcaltmp.h30
-rw-r--r--src/libicalvcal/vcc.c76
-rw-r--r--src/libicalvcal/vcc.h30
-rw-r--r--src/libicalvcal/vcc.y59
-rw-r--r--src/libicalvcal/vobject.c45
-rw-r--r--src/libicalvcal/vobject.h30
-rw-r--r--src/php/Makefile7
-rw-r--r--src/php/README.txt (renamed from src/php/README)0
-rw-r--r--src/php/test.php3
-rw-r--r--src/python/Attendee.py20
-rw-r--r--src/python/CMakeLists.txt4
-rw-r--r--src/python/ChangeLog36
-rw-r--r--src/python/Collection.py12
-rw-r--r--src/python/Component.py26
-rw-r--r--src/python/DerivedProperties.py12
-rw-r--r--src/python/Duration.py12
-rw-r--r--src/python/Error.py20
-rw-r--r--src/python/Gauge.py12
-rw-r--r--src/python/Libical.py12
-rw-r--r--src/python/LibicalWrap.i12
-rw-r--r--src/python/LibicalWrap_icaltime.i13
-rw-r--r--src/python/LibicalWrap_icaltimezone.i12
-rw-r--r--src/python/Period.py12
-rw-r--r--src/python/Property.py12
-rw-r--r--src/python/Store.py12
-rw-r--r--src/python/Time.py12
-rw-r--r--src/python/__init__.py12
-rw-r--r--src/python/test.py12
-rw-r--r--src/test/CMakeLists.txt22
-rw-r--r--src/test/builtin_timezones.c12
-rw-r--r--src/test/copycluster.c13
-rw-r--r--src/test/icalattach-leak.c15
-rw-r--r--src/test/icalrecur_test.c14
-rw-r--r--src/test/icaltestparser.c13
-rw-r--r--src/test/icaltm_test.c13
-rw-r--r--src/test/libical-glib/CMakeLists.txt20
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/array.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/attach.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/component.py14
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/comprehensive.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/duration.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/error.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/misc.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/parameter.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/period.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/property.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/recurrence.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/timezone.py10
-rw-r--r--[-rwxr-xr-x]src/test/libical-glib/value.py10
-rw-r--r--src/test/process.c12
-rw-r--r--src/test/recur.c22
-rw-r--r--src/test/regression-classify.c12
-rw-r--r--src/test/regression-component.c21
-rw-r--r--src/test/regression-cxx.cpp12
-rw-r--r--src/test/regression-recur.c22
-rw-r--r--src/test/regression-storage.c13
-rw-r--r--src/test/regression-utils.c71
-rw-r--r--src/test/regression.c451
-rw-r--r--src/test/regression.h14
-rw-r--r--src/test/stow.c13
-rw-r--r--src/test/test-malloc.c178
-rw-r--r--src/test/test-malloc.h61
-rw-r--r--src/test/testmime.c13
-rw-r--r--src/test/testvcal.c13
-rw-r--r--src/test/timezones.c27
-rw-r--r--test-data/CMakeLists.txt3
-rw-r--r--uninstall.cmake.in7
-rw-r--r--zoneinfo/Africa/Abidjan.ics4
-rw-r--r--zoneinfo/Africa/Accra.ics6
-rw-r--r--zoneinfo/Africa/Addis_Ababa.ics4
-rw-r--r--zoneinfo/Africa/Algiers.ics4
-rw-r--r--zoneinfo/Africa/Asmara.ics4
-rw-r--r--zoneinfo/Africa/Asmera.ics4
-rw-r--r--zoneinfo/Africa/Bamako.ics4
-rw-r--r--zoneinfo/Africa/Bangui.ics4
-rw-r--r--zoneinfo/Africa/Banjul.ics4
-rw-r--r--zoneinfo/Africa/Bissau.ics4
-rw-r--r--zoneinfo/Africa/Blantyre.ics4
-rw-r--r--zoneinfo/Africa/Brazzaville.ics4
-rw-r--r--zoneinfo/Africa/Bujumbura.ics4
-rw-r--r--zoneinfo/Africa/Cairo.ics4
-rw-r--r--zoneinfo/Africa/Casablanca.ics4
-rw-r--r--zoneinfo/Africa/Ceuta.ics4
-rw-r--r--zoneinfo/Africa/Conakry.ics4
-rw-r--r--zoneinfo/Africa/Dakar.ics4
-rw-r--r--zoneinfo/Africa/Dar_es_Salaam.ics4
-rw-r--r--zoneinfo/Africa/Djibouti.ics4
-rw-r--r--zoneinfo/Africa/Douala.ics4
-rw-r--r--zoneinfo/Africa/El_Aaiun.ics4
-rw-r--r--zoneinfo/Africa/Freetown.ics4
-rw-r--r--zoneinfo/Africa/Gaborone.ics4
-rw-r--r--zoneinfo/Africa/Harare.ics4
-rw-r--r--zoneinfo/Africa/Johannesburg.ics4
-rw-r--r--zoneinfo/Africa/Juba.ics4
-rw-r--r--zoneinfo/Africa/Kampala.ics4
-rw-r--r--zoneinfo/Africa/Khartoum.ics4
-rw-r--r--zoneinfo/Africa/Kigali.ics4
-rw-r--r--zoneinfo/Africa/Kinshasa.ics4
-rw-r--r--zoneinfo/Africa/Lagos.ics4
-rw-r--r--zoneinfo/Africa/Libreville.ics4
-rw-r--r--zoneinfo/Africa/Lome.ics4
-rw-r--r--zoneinfo/Africa/Luanda.ics4
-rw-r--r--zoneinfo/Africa/Lubumbashi.ics4
-rw-r--r--zoneinfo/Africa/Lusaka.ics4
-rw-r--r--zoneinfo/Africa/Malabo.ics4
-rw-r--r--zoneinfo/Africa/Maputo.ics4
-rw-r--r--zoneinfo/Africa/Maseru.ics4
-rw-r--r--zoneinfo/Africa/Mbabane.ics4
-rw-r--r--zoneinfo/Africa/Mogadishu.ics4
-rw-r--r--zoneinfo/Africa/Monrovia.ics4
-rw-r--r--zoneinfo/Africa/Nairobi.ics4
-rw-r--r--zoneinfo/Africa/Ndjamena.ics4
-rw-r--r--zoneinfo/Africa/Niamey.ics4
-rw-r--r--zoneinfo/Africa/Nouakchott.ics4
-rw-r--r--zoneinfo/Africa/Ouagadougou.ics4
-rw-r--r--zoneinfo/Africa/Porto-Novo.ics4
-rw-r--r--zoneinfo/Africa/Sao_Tome.ics4
-rw-r--r--zoneinfo/Africa/Timbuktu.ics4
-rw-r--r--zoneinfo/Africa/Tripoli.ics4
-rw-r--r--zoneinfo/Africa/Tunis.ics4
-rw-r--r--zoneinfo/Africa/Windhoek.ics4
-rw-r--r--zoneinfo/America/Adak.ics4
-rw-r--r--zoneinfo/America/Anchorage.ics4
-rw-r--r--zoneinfo/America/Anguilla.ics6
-rw-r--r--zoneinfo/America/Antigua.ics6
-rw-r--r--zoneinfo/America/Araguaina.ics4
-rw-r--r--zoneinfo/America/Argentina/Buenos_Aires.ics4
-rw-r--r--zoneinfo/America/Argentina/Catamarca.ics4
-rw-r--r--zoneinfo/America/Argentina/ComodRivadavia.ics4
-rw-r--r--zoneinfo/America/Argentina/Cordoba.ics4
-rw-r--r--zoneinfo/America/Argentina/Jujuy.ics4
-rw-r--r--zoneinfo/America/Argentina/La_Rioja.ics4
-rw-r--r--zoneinfo/America/Argentina/Mendoza.ics4
-rw-r--r--zoneinfo/America/Argentina/Rio_Gallegos.ics4
-rw-r--r--zoneinfo/America/Argentina/Salta.ics4
-rw-r--r--zoneinfo/America/Argentina/San_Juan.ics4
-rw-r--r--zoneinfo/America/Argentina/San_Luis.ics4
-rw-r--r--zoneinfo/America/Argentina/Tucuman.ics4
-rw-r--r--zoneinfo/America/Argentina/Ushuaia.ics4
-rw-r--r--zoneinfo/America/Aruba.ics6
-rw-r--r--zoneinfo/America/Asuncion.ics4
-rw-r--r--zoneinfo/America/Atikokan.ics6
-rw-r--r--zoneinfo/America/Atka.ics4
-rw-r--r--zoneinfo/America/Bahia.ics4
-rw-r--r--zoneinfo/America/Bahia_Banderas.ics4
-rw-r--r--zoneinfo/America/Barbados.ics4
-rw-r--r--zoneinfo/America/Belem.ics4
-rw-r--r--zoneinfo/America/Belize.ics4
-rw-r--r--zoneinfo/America/Blanc-Sablon.ics6
-rw-r--r--zoneinfo/America/Boa_Vista.ics4
-rw-r--r--zoneinfo/America/Bogota.ics4
-rw-r--r--zoneinfo/America/Boise.ics4
-rw-r--r--zoneinfo/America/Buenos_Aires.ics4
-rw-r--r--zoneinfo/America/Cambridge_Bay.ics4
-rw-r--r--zoneinfo/America/Campo_Grande.ics4
-rw-r--r--zoneinfo/America/Cancun.ics4
-rw-r--r--zoneinfo/America/Caracas.ics4
-rw-r--r--zoneinfo/America/Catamarca.ics4
-rw-r--r--zoneinfo/America/Cayenne.ics4
-rw-r--r--zoneinfo/America/Cayman.ics4
-rw-r--r--zoneinfo/America/Chicago.ics4
-rw-r--r--zoneinfo/America/Chihuahua.ics4
-rw-r--r--zoneinfo/America/Coral_Harbour.ics6
-rw-r--r--zoneinfo/America/Cordoba.ics4
-rw-r--r--zoneinfo/America/Costa_Rica.ics4
-rw-r--r--zoneinfo/America/Creston.ics6
-rw-r--r--zoneinfo/America/Cuiaba.ics4
-rw-r--r--zoneinfo/America/Curacao.ics6
-rw-r--r--zoneinfo/America/Danmarkshavn.ics4
-rw-r--r--zoneinfo/America/Dawson.ics4
-rw-r--r--zoneinfo/America/Dawson_Creek.ics4
-rw-r--r--zoneinfo/America/Denver.ics4
-rw-r--r--zoneinfo/America/Detroit.ics4
-rw-r--r--zoneinfo/America/Dominica.ics6
-rw-r--r--zoneinfo/America/Edmonton.ics4
-rw-r--r--zoneinfo/America/Eirunepe.ics4
-rw-r--r--zoneinfo/America/El_Salvador.ics4
-rw-r--r--zoneinfo/America/Ensenada.ics4
-rw-r--r--zoneinfo/America/Fort_Nelson.ics4
-rw-r--r--zoneinfo/America/Fort_Wayne.ics4
-rw-r--r--zoneinfo/America/Fortaleza.ics4
-rw-r--r--zoneinfo/America/Glace_Bay.ics4
-rw-r--r--zoneinfo/America/Godthab.ics4
-rw-r--r--zoneinfo/America/Goose_Bay.ics4
-rw-r--r--zoneinfo/America/Grand_Turk.ics4
-rw-r--r--zoneinfo/America/Grenada.ics6
-rw-r--r--zoneinfo/America/Guadeloupe.ics6
-rw-r--r--zoneinfo/America/Guatemala.ics4
-rw-r--r--zoneinfo/America/Guayaquil.ics4
-rw-r--r--zoneinfo/America/Guyana.ics4
-rw-r--r--zoneinfo/America/Halifax.ics4
-rw-r--r--zoneinfo/America/Havana.ics4
-rw-r--r--zoneinfo/America/Hermosillo.ics4
-rw-r--r--zoneinfo/America/Indiana/Indianapolis.ics4
-rw-r--r--zoneinfo/America/Indiana/Knox.ics4
-rw-r--r--zoneinfo/America/Indiana/Marengo.ics4
-rw-r--r--zoneinfo/America/Indiana/Petersburg.ics4
-rw-r--r--zoneinfo/America/Indiana/Tell_City.ics4
-rw-r--r--zoneinfo/America/Indiana/Vevay.ics4
-rw-r--r--zoneinfo/America/Indiana/Vincennes.ics4
-rw-r--r--zoneinfo/America/Indiana/Winamac.ics4
-rw-r--r--zoneinfo/America/Indianapolis.ics4
-rw-r--r--zoneinfo/America/Inuvik.ics4
-rw-r--r--zoneinfo/America/Iqaluit.ics4
-rw-r--r--zoneinfo/America/Jamaica.ics4
-rw-r--r--zoneinfo/America/Jujuy.ics4
-rw-r--r--zoneinfo/America/Juneau.ics4
-rw-r--r--zoneinfo/America/Kentucky/Louisville.ics4
-rw-r--r--zoneinfo/America/Kentucky/Monticello.ics4
-rw-r--r--zoneinfo/America/Knox_IN.ics4
-rw-r--r--zoneinfo/America/Kralendijk.ics6
-rw-r--r--zoneinfo/America/La_Paz.ics4
-rw-r--r--zoneinfo/America/Lima.ics4
-rw-r--r--zoneinfo/America/Los_Angeles.ics4
-rw-r--r--zoneinfo/America/Louisville.ics4
-rw-r--r--zoneinfo/America/Lower_Princes.ics6
-rw-r--r--zoneinfo/America/Maceio.ics4
-rw-r--r--zoneinfo/America/Managua.ics4
-rw-r--r--zoneinfo/America/Manaus.ics4
-rw-r--r--zoneinfo/America/Marigot.ics6
-rw-r--r--zoneinfo/America/Martinique.ics4
-rw-r--r--zoneinfo/America/Matamoros.ics4
-rw-r--r--zoneinfo/America/Mazatlan.ics4
-rw-r--r--zoneinfo/America/Mendoza.ics4
-rw-r--r--zoneinfo/America/Menominee.ics4
-rw-r--r--zoneinfo/America/Merida.ics4
-rw-r--r--zoneinfo/America/Metlakatla.ics4
-rw-r--r--zoneinfo/America/Mexico_City.ics4
-rw-r--r--zoneinfo/America/Miquelon.ics4
-rw-r--r--zoneinfo/America/Moncton.ics4
-rw-r--r--zoneinfo/America/Monterrey.ics4
-rw-r--r--zoneinfo/America/Montevideo.ics4
-rw-r--r--zoneinfo/America/Montreal.ics4
-rw-r--r--zoneinfo/America/Montserrat.ics6
-rw-r--r--zoneinfo/America/Nassau.ics6
-rw-r--r--zoneinfo/America/New_York.ics4
-rw-r--r--zoneinfo/America/Nipigon.ics4
-rw-r--r--zoneinfo/America/Nome.ics4
-rw-r--r--zoneinfo/America/Noronha.ics4
-rw-r--r--zoneinfo/America/North_Dakota/Beulah.ics4
-rw-r--r--zoneinfo/America/North_Dakota/Center.ics4
-rw-r--r--zoneinfo/America/North_Dakota/New_Salem.ics4
-rw-r--r--zoneinfo/America/Nuuk.ics4
-rw-r--r--zoneinfo/America/Ojinaga.ics4
-rw-r--r--zoneinfo/America/Panama.ics4
-rw-r--r--zoneinfo/America/Pangnirtung.ics4
-rw-r--r--zoneinfo/America/Paramaribo.ics4
-rw-r--r--zoneinfo/America/Phoenix.ics4
-rw-r--r--zoneinfo/America/Port-au-Prince.ics4
-rw-r--r--zoneinfo/America/Port_of_Spain.ics6
-rw-r--r--zoneinfo/America/Porto_Acre.ics4
-rw-r--r--zoneinfo/America/Porto_Velho.ics4
-rw-r--r--zoneinfo/America/Puerto_Rico.ics4
-rw-r--r--zoneinfo/America/Punta_Arenas.ics4
-rw-r--r--zoneinfo/America/Rainy_River.ics4
-rw-r--r--zoneinfo/America/Rankin_Inlet.ics4
-rw-r--r--zoneinfo/America/Recife.ics4
-rw-r--r--zoneinfo/America/Regina.ics4
-rw-r--r--zoneinfo/America/Resolute.ics4
-rw-r--r--zoneinfo/America/Rio_Branco.ics4
-rw-r--r--zoneinfo/America/Rosario.ics4
-rw-r--r--zoneinfo/America/Santa_Isabel.ics4
-rw-r--r--zoneinfo/America/Santarem.ics4
-rw-r--r--zoneinfo/America/Santiago.ics4
-rw-r--r--zoneinfo/America/Santo_Domingo.ics4
-rw-r--r--zoneinfo/America/Sao_Paulo.ics4
-rw-r--r--zoneinfo/America/Scoresbysund.ics4
-rw-r--r--zoneinfo/America/Shiprock.ics4
-rw-r--r--zoneinfo/America/Sitka.ics4
-rw-r--r--zoneinfo/America/St_Barthelemy.ics6
-rw-r--r--zoneinfo/America/St_Johns.ics4
-rw-r--r--zoneinfo/America/St_Kitts.ics6
-rw-r--r--zoneinfo/America/St_Lucia.ics6
-rw-r--r--zoneinfo/America/St_Thomas.ics6
-rw-r--r--zoneinfo/America/St_Vincent.ics6
-rw-r--r--zoneinfo/America/Swift_Current.ics4
-rw-r--r--zoneinfo/America/Tegucigalpa.ics4
-rw-r--r--zoneinfo/America/Thule.ics4
-rw-r--r--zoneinfo/America/Thunder_Bay.ics4
-rw-r--r--zoneinfo/America/Tijuana.ics4
-rw-r--r--zoneinfo/America/Toronto.ics4
-rw-r--r--zoneinfo/America/Tortola.ics6
-rw-r--r--zoneinfo/America/Vancouver.ics4
-rw-r--r--zoneinfo/America/Virgin.ics6
-rw-r--r--zoneinfo/America/Whitehorse.ics4
-rw-r--r--zoneinfo/America/Winnipeg.ics4
-rw-r--r--zoneinfo/America/Yakutat.ics4
-rw-r--r--zoneinfo/America/Yellowknife.ics4
-rw-r--r--zoneinfo/Antarctica/Casey.ics4
-rw-r--r--zoneinfo/Antarctica/Davis.ics4
-rw-r--r--zoneinfo/Antarctica/DumontDUrville.ics6
-rw-r--r--zoneinfo/Antarctica/Macquarie.ics4
-rw-r--r--zoneinfo/Antarctica/Mawson.ics4
-rw-r--r--zoneinfo/Antarctica/McMurdo.ics4
-rw-r--r--zoneinfo/Antarctica/Palmer.ics4
-rw-r--r--zoneinfo/Antarctica/Rothera.ics4
-rw-r--r--zoneinfo/Antarctica/South_Pole.ics4
-rw-r--r--zoneinfo/Antarctica/Syowa.ics6
-rw-r--r--zoneinfo/Antarctica/Troll.ics4
-rw-r--r--zoneinfo/Antarctica/Vostok.ics4
-rw-r--r--zoneinfo/Arctic/Longyearbyen.ics4
-rw-r--r--zoneinfo/Asia/Aden.ics4
-rw-r--r--zoneinfo/Asia/Almaty.ics4
-rw-r--r--zoneinfo/Asia/Amman.ics18
-rw-r--r--zoneinfo/Asia/Anadyr.ics4
-rw-r--r--zoneinfo/Asia/Aqtau.ics4
-rw-r--r--zoneinfo/Asia/Aqtobe.ics4
-rw-r--r--zoneinfo/Asia/Ashgabat.ics4
-rw-r--r--zoneinfo/Asia/Ashkhabad.ics4
-rw-r--r--zoneinfo/Asia/Atyrau.ics4
-rw-r--r--zoneinfo/Asia/Baghdad.ics4
-rw-r--r--zoneinfo/Asia/Bahrain.ics4
-rw-r--r--zoneinfo/Asia/Baku.ics4
-rw-r--r--zoneinfo/Asia/Bangkok.ics4
-rw-r--r--zoneinfo/Asia/Barnaul.ics4
-rw-r--r--zoneinfo/Asia/Beirut.ics4
-rw-r--r--zoneinfo/Asia/Bishkek.ics4
-rw-r--r--zoneinfo/Asia/Brunei.ics4
-rw-r--r--zoneinfo/Asia/Calcutta.ics4
-rw-r--r--zoneinfo/Asia/Chita.ics4
-rw-r--r--zoneinfo/Asia/Choibalsan.ics4
-rw-r--r--zoneinfo/Asia/Chongqing.ics4
-rw-r--r--zoneinfo/Asia/Chungking.ics4
-rw-r--r--zoneinfo/Asia/Colombo.ics4
-rw-r--r--zoneinfo/Asia/Dacca.ics4
-rw-r--r--zoneinfo/Asia/Damascus.ics4
-rw-r--r--zoneinfo/Asia/Dhaka.ics4
-rw-r--r--zoneinfo/Asia/Dili.ics4
-rw-r--r--zoneinfo/Asia/Dubai.ics4
-rw-r--r--zoneinfo/Asia/Dushanbe.ics4
-rw-r--r--zoneinfo/Asia/Famagusta.ics4
-rw-r--r--zoneinfo/Asia/Gaza.ics8
-rw-r--r--zoneinfo/Asia/Harbin.ics4
-rw-r--r--zoneinfo/Asia/Hebron.ics8
-rw-r--r--zoneinfo/Asia/Ho_Chi_Minh.ics4
-rw-r--r--zoneinfo/Asia/Hong_Kong.ics4
-rw-r--r--zoneinfo/Asia/Hovd.ics4
-rw-r--r--zoneinfo/Asia/Irkutsk.ics4
-rw-r--r--zoneinfo/Asia/Istanbul.ics4
-rw-r--r--zoneinfo/Asia/Jakarta.ics4
-rw-r--r--zoneinfo/Asia/Jayapura.ics4
-rw-r--r--zoneinfo/Asia/Jerusalem.ics4
-rw-r--r--zoneinfo/Asia/Kabul.ics4
-rw-r--r--zoneinfo/Asia/Kamchatka.ics4
-rw-r--r--zoneinfo/Asia/Karachi.ics4
-rw-r--r--zoneinfo/Asia/Kashgar.ics4
-rw-r--r--zoneinfo/Asia/Kathmandu.ics4
-rw-r--r--zoneinfo/Asia/Katmandu.ics4
-rw-r--r--zoneinfo/Asia/Khandyga.ics4
-rw-r--r--zoneinfo/Asia/Kolkata.ics4
-rw-r--r--zoneinfo/Asia/Krasnoyarsk.ics4
-rw-r--r--zoneinfo/Asia/Kuala_Lumpur.ics4
-rw-r--r--zoneinfo/Asia/Kuching.ics4
-rw-r--r--zoneinfo/Asia/Kuwait.ics4
-rw-r--r--zoneinfo/Asia/Macao.ics4
-rw-r--r--zoneinfo/Asia/Macau.ics4
-rw-r--r--zoneinfo/Asia/Magadan.ics4
-rw-r--r--zoneinfo/Asia/Makassar.ics4
-rw-r--r--zoneinfo/Asia/Manila.ics4
-rw-r--r--zoneinfo/Asia/Muscat.ics4
-rw-r--r--zoneinfo/Asia/Nicosia.ics4
-rw-r--r--zoneinfo/Asia/Novokuznetsk.ics4
-rw-r--r--zoneinfo/Asia/Novosibirsk.ics4
-rw-r--r--zoneinfo/Asia/Omsk.ics4
-rw-r--r--zoneinfo/Asia/Oral.ics4
-rw-r--r--zoneinfo/Asia/Phnom_Penh.ics4
-rw-r--r--zoneinfo/Asia/Pontianak.ics4
-rw-r--r--zoneinfo/Asia/Pyongyang.ics4
-rw-r--r--zoneinfo/Asia/Qatar.ics4
-rw-r--r--zoneinfo/Asia/Qostanay.ics4
-rw-r--r--zoneinfo/Asia/Qyzylorda.ics4
-rw-r--r--zoneinfo/Asia/Rangoon.ics4
-rw-r--r--zoneinfo/Asia/Riyadh.ics4
-rw-r--r--zoneinfo/Asia/Saigon.ics4
-rw-r--r--zoneinfo/Asia/Sakhalin.ics4
-rw-r--r--zoneinfo/Asia/Samarkand.ics4
-rw-r--r--zoneinfo/Asia/Seoul.ics4
-rw-r--r--zoneinfo/Asia/Shanghai.ics4
-rw-r--r--zoneinfo/Asia/Singapore.ics4
-rw-r--r--zoneinfo/Asia/Srednekolymsk.ics4
-rw-r--r--zoneinfo/Asia/Taipei.ics4
-rw-r--r--zoneinfo/Asia/Tashkent.ics4
-rw-r--r--zoneinfo/Asia/Tbilisi.ics4
-rw-r--r--zoneinfo/Asia/Tehran.ics4
-rw-r--r--zoneinfo/Asia/Tel_Aviv.ics4
-rw-r--r--zoneinfo/Asia/Thimbu.ics4
-rw-r--r--zoneinfo/Asia/Thimphu.ics4
-rw-r--r--zoneinfo/Asia/Tokyo.ics4
-rw-r--r--zoneinfo/Asia/Tomsk.ics4
-rw-r--r--zoneinfo/Asia/Ujung_Pandang.ics4
-rw-r--r--zoneinfo/Asia/Ulaanbaatar.ics4
-rw-r--r--zoneinfo/Asia/Ulan_Bator.ics4
-rw-r--r--zoneinfo/Asia/Urumqi.ics4
-rw-r--r--zoneinfo/Asia/Ust-Nera.ics4
-rw-r--r--zoneinfo/Asia/Vientiane.ics4
-rw-r--r--zoneinfo/Asia/Vladivostok.ics4
-rw-r--r--zoneinfo/Asia/Yakutsk.ics4
-rw-r--r--zoneinfo/Asia/Yangon.ics4
-rw-r--r--zoneinfo/Asia/Yekaterinburg.ics4
-rw-r--r--zoneinfo/Asia/Yerevan.ics4
-rw-r--r--zoneinfo/Atlantic/Azores.ics4
-rw-r--r--zoneinfo/Atlantic/Bermuda.ics4
-rw-r--r--zoneinfo/Atlantic/Canary.ics4
-rw-r--r--zoneinfo/Atlantic/Cape_Verde.ics4
-rw-r--r--zoneinfo/Atlantic/Faeroe.ics4
-rw-r--r--zoneinfo/Atlantic/Faroe.ics4
-rw-r--r--zoneinfo/Atlantic/Jan_Mayen.ics4
-rw-r--r--zoneinfo/Atlantic/Madeira.ics4
-rw-r--r--zoneinfo/Atlantic/Reykjavik.ics4
-rw-r--r--zoneinfo/Atlantic/South_Georgia.ics4
-rw-r--r--zoneinfo/Atlantic/St_Helena.ics4
-rw-r--r--zoneinfo/Atlantic/Stanley.ics4
-rw-r--r--zoneinfo/Australia/ACT.ics4
-rw-r--r--zoneinfo/Australia/Adelaide.ics4
-rw-r--r--zoneinfo/Australia/Brisbane.ics4
-rw-r--r--zoneinfo/Australia/Broken_Hill.ics4
-rw-r--r--zoneinfo/Australia/Canberra.ics4
-rw-r--r--zoneinfo/Australia/Currie.ics4
-rw-r--r--zoneinfo/Australia/Darwin.ics4
-rw-r--r--zoneinfo/Australia/Eucla.ics4
-rw-r--r--zoneinfo/Australia/Hobart.ics4
-rw-r--r--zoneinfo/Australia/LHI.ics4
-rw-r--r--zoneinfo/Australia/Lindeman.ics4
-rw-r--r--zoneinfo/Australia/Lord_Howe.ics4
-rw-r--r--zoneinfo/Australia/Melbourne.ics4
-rw-r--r--zoneinfo/Australia/NSW.ics4
-rw-r--r--zoneinfo/Australia/North.ics4
-rw-r--r--zoneinfo/Australia/Perth.ics4
-rw-r--r--zoneinfo/Australia/Queensland.ics4
-rw-r--r--zoneinfo/Australia/South.ics4
-rw-r--r--zoneinfo/Australia/Sydney.ics4
-rw-r--r--zoneinfo/Australia/Tasmania.ics4
-rw-r--r--zoneinfo/Australia/Victoria.ics4
-rw-r--r--zoneinfo/Australia/West.ics4
-rw-r--r--zoneinfo/Australia/Yancowinna.ics4
-rw-r--r--zoneinfo/Brazil/Acre.ics4
-rw-r--r--zoneinfo/Brazil/DeNoronha.ics4
-rw-r--r--zoneinfo/Brazil/East.ics4
-rw-r--r--zoneinfo/Brazil/West.ics4
-rw-r--r--zoneinfo/CET.ics4
-rw-r--r--zoneinfo/CST6CDT.ics4
-rw-r--r--zoneinfo/Canada/Atlantic.ics4
-rw-r--r--zoneinfo/Canada/Central.ics4
-rw-r--r--zoneinfo/Canada/Eastern.ics4
-rw-r--r--zoneinfo/Canada/Mountain.ics4
-rw-r--r--zoneinfo/Canada/Newfoundland.ics4
-rw-r--r--zoneinfo/Canada/Pacific.ics4
-rw-r--r--zoneinfo/Canada/Saskatchewan.ics4
-rw-r--r--zoneinfo/Canada/Yukon.ics4
-rw-r--r--zoneinfo/Chile/Continental.ics4
-rw-r--r--zoneinfo/Chile/EasterIsland.ics4
-rw-r--r--zoneinfo/Cuba.ics4
-rw-r--r--zoneinfo/EET.ics4
-rw-r--r--zoneinfo/EST.ics4
-rw-r--r--zoneinfo/EST5EDT.ics4
-rw-r--r--zoneinfo/Egypt.ics4
-rw-r--r--zoneinfo/Eire.ics4
-rw-r--r--zoneinfo/Etc/GMT+0.ics4
-rw-r--r--zoneinfo/Etc/GMT+1.ics4
-rw-r--r--zoneinfo/Etc/GMT+10.ics4
-rw-r--r--zoneinfo/Etc/GMT+11.ics4
-rw-r--r--zoneinfo/Etc/GMT+12.ics4
-rw-r--r--zoneinfo/Etc/GMT+2.ics4
-rw-r--r--zoneinfo/Etc/GMT+3.ics4
-rw-r--r--zoneinfo/Etc/GMT+4.ics4
-rw-r--r--zoneinfo/Etc/GMT+5.ics4
-rw-r--r--zoneinfo/Etc/GMT+6.ics4
-rw-r--r--zoneinfo/Etc/GMT+7.ics4
-rw-r--r--zoneinfo/Etc/GMT+8.ics4
-rw-r--r--zoneinfo/Etc/GMT+9.ics4
-rw-r--r--zoneinfo/Etc/GMT-0.ics4
-rw-r--r--zoneinfo/Etc/GMT-1.ics4
-rw-r--r--zoneinfo/Etc/GMT-10.ics4
-rw-r--r--zoneinfo/Etc/GMT-11.ics4
-rw-r--r--zoneinfo/Etc/GMT-12.ics4
-rw-r--r--zoneinfo/Etc/GMT-13.ics4
-rw-r--r--zoneinfo/Etc/GMT-14.ics4
-rw-r--r--zoneinfo/Etc/GMT-2.ics4
-rw-r--r--zoneinfo/Etc/GMT-3.ics4
-rw-r--r--zoneinfo/Etc/GMT-4.ics4
-rw-r--r--zoneinfo/Etc/GMT-5.ics4
-rw-r--r--zoneinfo/Etc/GMT-6.ics4
-rw-r--r--zoneinfo/Etc/GMT-7.ics4
-rw-r--r--zoneinfo/Etc/GMT-8.ics4
-rw-r--r--zoneinfo/Etc/GMT-9.ics4
-rw-r--r--zoneinfo/Etc/GMT.ics4
-rw-r--r--zoneinfo/Etc/GMT0.ics4
-rw-r--r--zoneinfo/Etc/Greenwich.ics4
-rw-r--r--zoneinfo/Etc/UCT.ics4
-rw-r--r--zoneinfo/Etc/UTC.ics4
-rw-r--r--zoneinfo/Etc/Universal.ics4
-rw-r--r--zoneinfo/Etc/Zulu.ics4
-rw-r--r--zoneinfo/Europe/Amsterdam.ics4
-rw-r--r--zoneinfo/Europe/Andorra.ics4
-rw-r--r--zoneinfo/Europe/Astrakhan.ics4
-rw-r--r--zoneinfo/Europe/Athens.ics4
-rw-r--r--zoneinfo/Europe/Belfast.ics4
-rw-r--r--zoneinfo/Europe/Belgrade.ics4
-rw-r--r--zoneinfo/Europe/Berlin.ics4
-rw-r--r--zoneinfo/Europe/Bratislava.ics4
-rw-r--r--zoneinfo/Europe/Brussels.ics4
-rw-r--r--zoneinfo/Europe/Bucharest.ics4
-rw-r--r--zoneinfo/Europe/Budapest.ics4
-rw-r--r--zoneinfo/Europe/Busingen.ics4
-rw-r--r--zoneinfo/Europe/Chisinau.ics4
-rw-r--r--zoneinfo/Europe/Copenhagen.ics4
-rw-r--r--zoneinfo/Europe/Dublin.ics4
-rw-r--r--zoneinfo/Europe/Gibraltar.ics4
-rw-r--r--zoneinfo/Europe/Guernsey.ics4
-rw-r--r--zoneinfo/Europe/Helsinki.ics4
-rw-r--r--zoneinfo/Europe/Isle_of_Man.ics4
-rw-r--r--zoneinfo/Europe/Istanbul.ics4
-rw-r--r--zoneinfo/Europe/Jersey.ics4
-rw-r--r--zoneinfo/Europe/Kaliningrad.ics4
-rw-r--r--zoneinfo/Europe/Kiev.ics4
-rw-r--r--zoneinfo/Europe/Kirov.ics4
-rw-r--r--zoneinfo/Europe/Lisbon.ics4
-rw-r--r--zoneinfo/Europe/Ljubljana.ics4
-rw-r--r--zoneinfo/Europe/London.ics4
-rw-r--r--zoneinfo/Europe/Luxembourg.ics4
-rw-r--r--zoneinfo/Europe/Madrid.ics4
-rw-r--r--zoneinfo/Europe/Malta.ics4
-rw-r--r--zoneinfo/Europe/Mariehamn.ics4
-rw-r--r--zoneinfo/Europe/Minsk.ics4
-rw-r--r--zoneinfo/Europe/Monaco.ics4
-rw-r--r--zoneinfo/Europe/Moscow.ics4
-rw-r--r--zoneinfo/Europe/Nicosia.ics4
-rw-r--r--zoneinfo/Europe/Oslo.ics4
-rw-r--r--zoneinfo/Europe/Paris.ics4
-rw-r--r--zoneinfo/Europe/Podgorica.ics4
-rw-r--r--zoneinfo/Europe/Prague.ics4
-rw-r--r--zoneinfo/Europe/Riga.ics4
-rw-r--r--zoneinfo/Europe/Rome.ics4
-rw-r--r--zoneinfo/Europe/Samara.ics4
-rw-r--r--zoneinfo/Europe/San_Marino.ics4
-rw-r--r--zoneinfo/Europe/Sarajevo.ics4
-rw-r--r--zoneinfo/Europe/Saratov.ics4
-rw-r--r--zoneinfo/Europe/Simferopol.ics4
-rw-r--r--zoneinfo/Europe/Skopje.ics4
-rw-r--r--zoneinfo/Europe/Sofia.ics4
-rw-r--r--zoneinfo/Europe/Stockholm.ics4
-rw-r--r--zoneinfo/Europe/Tallinn.ics4
-rw-r--r--zoneinfo/Europe/Tirane.ics4
-rw-r--r--zoneinfo/Europe/Tiraspol.ics4
-rw-r--r--zoneinfo/Europe/Ulyanovsk.ics4
-rw-r--r--zoneinfo/Europe/Uzhgorod.ics4
-rw-r--r--zoneinfo/Europe/Vaduz.ics4
-rw-r--r--zoneinfo/Europe/Vatican.ics4
-rw-r--r--zoneinfo/Europe/Vienna.ics4
-rw-r--r--zoneinfo/Europe/Vilnius.ics4
-rw-r--r--zoneinfo/Europe/Volgograd.ics4
-rw-r--r--zoneinfo/Europe/Warsaw.ics4
-rw-r--r--zoneinfo/Europe/Zagreb.ics4
-rw-r--r--zoneinfo/Europe/Zaporozhye.ics4
-rw-r--r--zoneinfo/Europe/Zurich.ics4
-rw-r--r--zoneinfo/GB-Eire.ics4
-rw-r--r--zoneinfo/GB.ics4
-rw-r--r--zoneinfo/GMT+0.ics4
-rw-r--r--zoneinfo/GMT-0.ics4
-rw-r--r--zoneinfo/GMT.ics4
-rw-r--r--zoneinfo/GMT0.ics4
-rw-r--r--zoneinfo/Greenwich.ics4
-rw-r--r--zoneinfo/HST.ics4
-rw-r--r--zoneinfo/Hongkong.ics4
-rw-r--r--zoneinfo/Iceland.ics4
-rw-r--r--zoneinfo/Indian/Antananarivo.ics4
-rw-r--r--zoneinfo/Indian/Chagos.ics4
-rw-r--r--zoneinfo/Indian/Christmas.ics4
-rw-r--r--zoneinfo/Indian/Cocos.ics4
-rw-r--r--zoneinfo/Indian/Comoro.ics4
-rw-r--r--zoneinfo/Indian/Kerguelen.ics4
-rw-r--r--zoneinfo/Indian/Mahe.ics4
-rw-r--r--zoneinfo/Indian/Maldives.ics4
-rw-r--r--zoneinfo/Indian/Mauritius.ics4
-rw-r--r--zoneinfo/Indian/Mayotte.ics4
-rw-r--r--zoneinfo/Indian/Reunion.ics4
-rw-r--r--zoneinfo/Iran.ics4
-rw-r--r--zoneinfo/Israel.ics4
-rw-r--r--zoneinfo/Jamaica.ics4
-rw-r--r--zoneinfo/Japan.ics4
-rw-r--r--zoneinfo/Kwajalein.ics4
-rw-r--r--zoneinfo/Libya.ics4
-rw-r--r--zoneinfo/MET.ics4
-rw-r--r--zoneinfo/MST.ics4
-rw-r--r--zoneinfo/MST7MDT.ics4
-rw-r--r--zoneinfo/Mexico/BajaNorte.ics4
-rw-r--r--zoneinfo/Mexico/BajaSur.ics4
-rw-r--r--zoneinfo/Mexico/General.ics4
-rw-r--r--zoneinfo/NZ-CHAT.ics4
-rw-r--r--zoneinfo/NZ.ics4
-rw-r--r--zoneinfo/Navajo.ics4
-rw-r--r--zoneinfo/PRC.ics4
-rw-r--r--zoneinfo/PST8PDT.ics4
-rw-r--r--zoneinfo/Pacific/Apia.ics16
-rw-r--r--zoneinfo/Pacific/Auckland.ics4
-rw-r--r--zoneinfo/Pacific/Bougainville.ics4
-rw-r--r--zoneinfo/Pacific/Chatham.ics4
-rw-r--r--zoneinfo/Pacific/Chuuk.ics4
-rw-r--r--zoneinfo/Pacific/Easter.ics4
-rw-r--r--zoneinfo/Pacific/Efate.ics4
-rw-r--r--zoneinfo/Pacific/Enderbury.ics6
-rw-r--r--zoneinfo/Pacific/Fakaofo.ics4
-rw-r--r--zoneinfo/Pacific/Fiji.ics18
-rw-r--r--zoneinfo/Pacific/Funafuti.ics4
-rw-r--r--zoneinfo/Pacific/Galapagos.ics4
-rw-r--r--zoneinfo/Pacific/Gambier.ics4
-rw-r--r--zoneinfo/Pacific/Guadalcanal.ics4
-rw-r--r--zoneinfo/Pacific/Guam.ics4
-rw-r--r--zoneinfo/Pacific/Honolulu.ics4
-rw-r--r--zoneinfo/Pacific/Johnston.ics4
-rw-r--r--zoneinfo/Pacific/Kanton.ics15
-rw-r--r--zoneinfo/Pacific/Kiritimati.ics4
-rw-r--r--zoneinfo/Pacific/Kosrae.ics4
-rw-r--r--zoneinfo/Pacific/Kwajalein.ics4
-rw-r--r--zoneinfo/Pacific/Majuro.ics4
-rw-r--r--zoneinfo/Pacific/Marquesas.ics4
-rw-r--r--zoneinfo/Pacific/Midway.ics4
-rw-r--r--zoneinfo/Pacific/Nauru.ics4
-rw-r--r--zoneinfo/Pacific/Niue.ics4
-rw-r--r--zoneinfo/Pacific/Norfolk.ics4
-rw-r--r--zoneinfo/Pacific/Noumea.ics4
-rw-r--r--zoneinfo/Pacific/Pago_Pago.ics4
-rw-r--r--zoneinfo/Pacific/Palau.ics4
-rw-r--r--zoneinfo/Pacific/Pitcairn.ics4
-rw-r--r--zoneinfo/Pacific/Pohnpei.ics4
-rw-r--r--zoneinfo/Pacific/Ponape.ics4
-rw-r--r--zoneinfo/Pacific/Port_Moresby.ics4
-rw-r--r--zoneinfo/Pacific/Rarotonga.ics4
-rw-r--r--zoneinfo/Pacific/Saipan.ics4
-rw-r--r--zoneinfo/Pacific/Samoa.ics4
-rw-r--r--zoneinfo/Pacific/Tahiti.ics4
-rw-r--r--zoneinfo/Pacific/Tarawa.ics4
-rw-r--r--zoneinfo/Pacific/Tongatapu.ics4
-rw-r--r--zoneinfo/Pacific/Truk.ics4
-rw-r--r--zoneinfo/Pacific/Wake.ics4
-rw-r--r--zoneinfo/Pacific/Wallis.ics4
-rw-r--r--zoneinfo/Pacific/Yap.ics4
-rw-r--r--zoneinfo/Poland.ics4
-rw-r--r--zoneinfo/Portugal.ics4
-rw-r--r--zoneinfo/ROC.ics4
-rw-r--r--zoneinfo/ROK.ics4
-rw-r--r--zoneinfo/Singapore.ics4
-rw-r--r--zoneinfo/Turkey.ics4
-rw-r--r--zoneinfo/UCT.ics4
-rw-r--r--zoneinfo/US/Alaska.ics4
-rw-r--r--zoneinfo/US/Aleutian.ics4
-rw-r--r--zoneinfo/US/Arizona.ics4
-rw-r--r--zoneinfo/US/Central.ics4
-rw-r--r--zoneinfo/US/East-Indiana.ics4
-rw-r--r--zoneinfo/US/Eastern.ics4
-rw-r--r--zoneinfo/US/Hawaii.ics4
-rw-r--r--zoneinfo/US/Indiana-Starke.ics4
-rw-r--r--zoneinfo/US/Michigan.ics4
-rw-r--r--zoneinfo/US/Mountain.ics4
-rw-r--r--zoneinfo/US/Pacific.ics4
-rw-r--r--zoneinfo/US/Samoa.ics4
-rw-r--r--zoneinfo/UTC.ics4
-rw-r--r--zoneinfo/Universal.ics4
-rw-r--r--zoneinfo/W-SU.ics4
-rw-r--r--zoneinfo/WET.ics4
-rw-r--r--zoneinfo/Zulu.ics4
-rw-r--r--zoneinfo/zones.tab3
956 files changed, 8830 insertions, 10601 deletions
diff --git a/.cmake-format.py b/.cmake-format.py
new file mode 100644
index 00000000..b78b7969
--- /dev/null
+++ b/.cmake-format.py
@@ -0,0 +1,241 @@
+# ----------------------------------
+# Options affecting listfile parsing
+# ----------------------------------
+with section("parse"):
+
+ # Specify structure for custom cmake functions
+ additional_commands = { 'foo': { 'flags': ['BAR', 'BAZ'],
+ 'kwargs': {'DEPENDS': '*', 'HEADERS': '*', 'SOURCES': '*'}}}
+
+ # Override configurations per-command where available
+ override_spec = {}
+
+ # Specify variable tags.
+ vartags = []
+
+ # Specify property tags.
+ proptags = []
+
+# -----------------------------
+# Options affecting formatting.
+# -----------------------------
+with section("format"):
+
+ # Disable formatting entirely, making cmake-format a no-op
+ disable = False
+
+ # How wide to allow formatted cmake files
+ line_width = 120
+
+ # How many spaces to tab for indent
+ tab_size = 2
+
+ # If true, lines are indented using tab characters (utf-8 0x09) instead of
+ # <tab_size> space characters (utf-8 0x20). In cases where the layout would
+ # require a fractional tab character, the behavior of the fractional
+ # indentation is governed by <fractional_tab_policy>
+ use_tabchars = False
+
+ # If <use_tabchars> is True, then the value of this variable indicates how
+ # fractional indentions are handled during whitespace replacement. If set to
+ # 'use-space', fractional indentation is left as spaces (utf-8 0x20). If set
+ # to `round-up` fractional indentation is replaced with a single tab character
+ # (utf-8 0x09) effectively shifting the column to the next tabstop
+ fractional_tab_policy = 'use-space'
+
+ # If an argument group contains more than this many sub-groups (parg or kwarg
+ # groups) then force it to a vertical layout.
+ max_subgroups_hwrap = 2
+
+ # If a positional argument group contains more than this many arguments, then
+ # force it to a vertical layout.
+ max_pargs_hwrap = 6
+
+ # If a cmdline positional group consumes more than this many lines without
+ # nesting, then invalidate the layout (and nest)
+ max_rows_cmdline = 2
+
+ # If true, separate flow control names from their parentheses with a space
+ separate_ctrl_name_with_space = False
+
+ # If true, separate function names from parentheses with a space
+ separate_fn_name_with_space = False
+
+ # If a statement is wrapped to more than one line, than dangle the closing
+ # parenthesis on its own line.
+ dangle_parens = False
+
+ # If the trailing parenthesis must be 'dangled' on its on line, then align it
+ # to this reference: `prefix`: the start of the statement, `prefix-indent`:
+ # the start of the statement, plus one indentation level, `child`: align to
+ # the column of the arguments
+ dangle_align = 'prefix'
+
+ # If the statement spelling length (including space and parenthesis) is
+ # smaller than this amount, then force reject nested layouts.
+ min_prefix_chars = 4
+
+ # If the statement spelling length (including space and parenthesis) is larger
+ # than the tab width by more than this amount, then force reject un-nested
+ # layouts.
+ max_prefix_chars = 10
+
+ # If a candidate layout is wrapped horizontally but it exceeds this many
+ # lines, then reject the layout.
+ max_lines_hwrap = 2
+
+ # What style line endings to use in the output.
+ line_ending = 'unix'
+
+ # Format command names consistently as 'lower' or 'upper' case
+ command_case = 'lower'
+
+ # Format keywords consistently as 'lower' or 'upper' case
+ keyword_case = 'upper'
+
+ # A list of command names which should always be wrapped
+ always_wrap = []
+
+ # If true, the argument lists which are known to be sortable will be sorted
+ # lexicographicall
+ enable_sort = True
+
+ # If true, the parsers may infer whether or not an argument list is sortable
+ # (without annotation).
+ autosort = False
+
+ # By default, if cmake-format cannot successfully fit everything into the
+ # desired linewidth it will apply the last, most agressive attempt that it
+ # made. If this flag is True, however, cmake-format will print error, exit
+ # with non-zero status code, and write-out nothing
+ require_valid_layout = False
+
+ # A dictionary mapping layout nodes to a list of wrap decisions. See the
+ # documentation for more information.
+ layout_passes = {}
+
+# ------------------------------------------------
+# Options affecting comment reflow and formatting.
+# ------------------------------------------------
+with section("markup"):
+
+ # What character to use for bulleted lists
+ bullet_char = '*'
+
+ # What character to use as punctuation after numerals in an enumerated list
+ enum_char = '.'
+
+ # If comment markup is enabled, don't reflow the first comment block in each
+ # listfile. Use this to preserve formatting of your copyright/license
+ # statements.
+ first_comment_is_literal = False
+
+ # If comment markup is enabled, don't reflow any comment block which matches
+ # this (regex) pattern. Default is `None` (disabled).
+ literal_comment_pattern = None
+
+ # Regular expression to match preformat fences in comments default=
+ # ``r'^\s*([`~]{3}[`~]*)(.*)$'``
+ fence_pattern = '^\\s*([`~]{3}[`~]*)(.*)$'
+
+ # Regular expression to match rulers in comments default=
+ # ``r'^\s*[^\w\s]{3}.*[^\w\s]{3}$'``
+ ruler_pattern = '^\\s*[^\\w\\s]{3}.*[^\\w\\s]{3}$'
+
+ # If a comment line matches starts with this pattern then it is explicitly a
+ # trailing comment for the preceeding argument. Default is '#<'
+ explicit_trailing_pattern = '#<'
+
+ # If a comment line starts with at least this many consecutive hash
+ # characters, then don't lstrip() them off. This allows for lazy hash rulers
+ # where the first hash char is not separated by space
+ hashruler_min_length = 10
+
+ # If true, then insert a space between the first hash char and remaining hash
+ # chars in a hash ruler, and normalize its length to fill the column
+ canonicalize_hashrulers = True
+
+ # enable comment markup parsing and reflow
+ enable_markup = True
+
+# ----------------------------
+# Options affecting the linter
+# ----------------------------
+with section("lint"):
+
+ # a list of lint codes to disable
+ disabled_codes = []
+
+ # regular expression pattern describing valid function names
+ function_pattern = '[0-9a-z_]+'
+
+ # regular expression pattern describing valid macro names
+ macro_pattern = '[0-9a-z_]+'
+
+ # regular expression pattern describing valid names for variables with global
+ # (cache) scope
+ global_var_pattern = '[A-Z][0-9A-Z_]+'
+
+ # regular expression pattern describing valid names for variables with global
+ # scope (but internal semantic)
+ internal_var_pattern = '[A-Z][0-9A-Z_]+'
+
+ # regular expression pattern describing valid names for variables with local
+ # scope
+ local_var_pattern = '[a-z][a-z0-9_]+'
+
+ # regular expression pattern describing valid names for privatedirectory
+ # variables
+ private_var_pattern = '[0-9a-z_]+'
+
+ # regular expression pattern describing valid names for public directory
+ # variables
+ public_var_pattern = '.*'
+
+ # regular expression pattern describing valid names for function/macro
+ # arguments and loop variables.
+ argument_var_pattern = '[a-z_][a-z0-9_]+'
+
+ # regular expression pattern describing valid names for keywords used in
+ # functions or macros
+ keyword_pattern = '[A-Z][0-9A-Z_]+'
+
+ # In the heuristic for C0201, how many conditionals to match within a loop in
+ # before considering the loop a parser.
+ max_conditionals_custom_parser = 2
+
+ # Require at least this many newlines between statements
+ min_statement_spacing = 1
+
+ # Require no more than this many newlines between statements
+ max_statement_spacing = 2
+ max_returns = 6
+ max_branches = 15
+ max_arguments = 10
+ max_localvars = 15
+ max_statements = 50
+
+# -------------------------------
+# Options affecting file encoding
+# -------------------------------
+with section("encode"):
+
+ # If true, emit the unicode byte-order mark (BOM) at the start of the file
+ emit_byteorder_mark = False
+
+ # Specify the encoding of the input file. Defaults to utf-8
+ input_encoding = 'utf-8'
+
+ # Specify the encoding of the output file. Defaults to utf-8. Note that cmake
+ # only claims to support utf-8 so be careful when using anything else
+ output_encoding = 'utf-8'
+
+# -------------------------------------
+# Miscellaneous configurations options.
+# -------------------------------------
+with section("misc"):
+
+ # A dictionary containing any per-command configuration overrides. Currently
+ # only `command_case` is supported.
+ per_command = {}
+
diff --git a/.codespellrc b/.codespellrc
index e9bf3cdd..722fb2d9 100644
--- a/.codespellrc
+++ b/.codespellrc
@@ -1,4 +1,4 @@
[codespell]
skip = ./build-*,.git,test-data,zoneinfo,regression.c
interactive = 3
-ignore-words-list = inout,gir,parameterizes,yau,crasher
+ignore-words-list = inout,gir,parameterizes,yau,crasher,thur
diff --git a/.krazy b/.krazy
index 04647656..74c09410 100644
--- a/.krazy
+++ b/.krazy
@@ -2,6 +2,7 @@ CHECKSETS foss,c++
EXCLUDE dpointer
+EXTRA copyright-reuse,license-reuse
EXTRA crud,camelcase
EXTRA style
@@ -17,6 +18,7 @@ SKIP /examples/
SKIP /java/
#For now skip python
SKIP /python/
+SKIP \.cmake-format\.py
#For now skip perl
SKIP /Net-ICal-Libical/
@@ -29,12 +31,13 @@ SKIP /src/libicalvcal/vobject\.
#Skip contributed files
SKIP /src/libical/astime\.h
SKIP /src/libical/caldate\.c
+SKIP /cmake/Kitware/
SKIP /cmake/modules/GObjectIntrospectionMacros\.cmake|/cmake/modules/FindGObjectIntrospection\.cmake
SKIP /doc/Doxyfile\.cmake
-SKIP /cmake/Toolchain-iOS.cmake|/cmake/Toolchain-QNX65.cmake|/cmake/Toolchain-QNX66.cmake|/cmake/Toolchain-android.cmake
+SKIP /cmake/Toolchain-QNX|/cmake/modules/FindBerkeleyDB.cmake|/uninstall.cmake.in
#Skip zoneinfo
SKIP /zoneinfo/
-STYLE_LINEMAX 100
+STYLE_LINEMAX 120
STYLE_PYTHONSTYLE_OFFSET 4
diff --git a/.mdlrc b/.mdlrc
new file mode 100644
index 00000000..3acbfeca
--- /dev/null
+++ b/.mdlrc
@@ -0,0 +1 @@
+style ".mdlrc.rb"
diff --git a/.mdlrc.rb b/.mdlrc.rb
new file mode 100644
index 00000000..edb59bc8
--- /dev/null
+++ b/.mdlrc.rb
@@ -0,0 +1,4 @@
+all
+rule 'MD013', :line_length => 100, :tables => false
+rule 'MD029', :style => :ordered
+exclude_rule 'MD033'
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 00000000..4dc2a89c
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,40 @@
+# See https://pre-commit.com for more information
+# See https://pre-commit.com/hooks.html for more hooks
+repos:
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v3.2.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-added-large-files
+ - id: check-case-conflict
+ - id: check-yaml
+ - id: check-json
+#- repo: https://github.com/pre-commit/mirrors-clang-format
+# rev: v13.0.0
+# hooks:
+# - id: clang-format
+- repo: https://github.com/PyCQA/pylint
+ rev: v2.12.2
+ hooks:
+ - id: pylint
+- repo: https://github.com/codespell-project/codespell
+ rev: v2.1.0
+ hooks:
+ - id: codespell
+- repo: https://github.com/cheshirekow/cmake-format-precommit
+ rev: v0.6.13
+ hooks:
+ - id: cmake-lint
+ exclude: (cmake/Toolchain-|.h.cmake|/Doxyfile.cmake)
+- repo: https://github.com/markdownlint/markdownlint
+ rev: v0.11.0
+ hooks:
+ - id: markdownlint
+ entry: mdl
+ language: ruby
+ files: \.(md|mdown|markdown)$
+- repo: https://github.com/fsfe/reuse-tool
+ rev: v1.0.0
+ hooks:
+ - id: reuse
diff --git a/.pylintrc b/.pylintrc
new file mode 100644
index 00000000..b3bb2f6d
--- /dev/null
+++ b/.pylintrc
@@ -0,0 +1,590 @@
+[MASTER]
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code.
+extension-pkg-allow-list=
+
+# A comma-separated list of package or module names from where C extensions may
+# be loaded. Extensions are loading into the active Python interpreter and may
+# run arbitrary code. (This is an alternative name to extension-pkg-allow-list
+# for backward compatibility.)
+extension-pkg-whitelist=
+
+# Return non-zero exit code if any of these messages/categories are detected,
+# even if score is above --fail-under value. Syntax same as enable. Messages
+# specified are enabled, while categories only check already-enabled messages.
+fail-on=
+
+# Specify a score threshold to be exceeded before program exits with error.
+fail-under=10.0
+
+# Files or directories to be skipped. They should be base names, not paths.
+ignore=CVS
+
+# Add files or directories matching the regex patterns to the ignore-list. The
+# regex matches against paths and can be in Posix or Windows format.
+ignore-paths=
+
+# Files or directories matching the regex patterns are skipped. The regex
+# matches against base names, not paths. The default value ignores emacs file
+# locks
+ignore-patterns=^\.#
+
+# Python code to execute, usually for sys.path manipulation such as
+# pygtk.require().
+#init-hook=
+
+# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the
+# number of processors available to use.
+jobs=1
+
+# Control the amount of potential inferred values when inferring a single
+# object. This can help the performance when dealing with large functions or
+# complex, nested conditions.
+limit-inference-results=100
+
+# List of plugins (as comma separated values of python module names) to load,
+# usually to register additional checkers.
+load-plugins=
+
+# Pickle collected data for later comparisons.
+persistent=yes
+
+# Minimum Python version to use for version dependent checks. Will default to
+# the version used to run pylint.
+py-version=3.10
+
+# Discover python modules and packages in the file system subtree.
+recursive=no
+
+# When enabled, pylint would attempt to guess common misconfiguration and emit
+# user-friendly hints instead of false-positive error messages.
+suggestion-mode=yes
+
+# Allow loading of arbitrary C extensions. Extensions are imported into the
+# active Python interpreter and may run arbitrary code.
+unsafe-load-any-extension=no
+
+
+[MESSAGES CONTROL]
+
+# Only show warnings with the listed confidence levels. Leave empty to show
+# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE,
+# UNDEFINED.
+confidence=
+
+# Disable the message, report, category or checker with the given id(s). You
+# can either give multiple identifiers separated by comma (,) or put this
+# option multiple times (only on the command line, not in the configuration
+# file where it should appear only once). You can also use "--disable=all" to
+# disable everything first and then re-enable specific checks. For example, if
+# you want to run only the similarities checker, you can use "--disable=all
+# --enable=similarities". If you want to run only the classes checker, but have
+# no Warning level messages displayed, use "--disable=all --enable=classes
+# --disable=W".
+disable=raw-checker-failed,
+ bad-inline-option,
+ locally-disabled,
+ file-ignored,
+ suppressed-message,
+ useless-suppression,
+ deprecated-pragma,
+ use-symbolic-message-instead
+
+# Enable the message, report, category or checker with the given id(s). You can
+# either give multiple identifier separated by comma (,) or put this option
+# multiple time (only on the command line, not in the configuration file where
+# it should appear only once). See also the "--disable" option for examples.
+enable=c-extension-no-member
+
+
+[REPORTS]
+
+# Python expression which should return a score less than or equal to 10. You
+# have access to the variables 'fatal', 'error', 'warning', 'refactor',
+# 'convention', and 'info' which contain the number of messages in each
+# category, as well as 'statement' which is the total number of statements
+# analyzed. This score is used by the global evaluation report (RP0004).
+evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10))
+
+# Template used to display messages. This is a python new-style format string
+# used to format the message information. See doc for all details.
+#msg-template=
+
+# Set the output format. Available formats are text, parseable, colorized, json
+# and msvs (visual studio). You can also give a reporter class, e.g.
+# mypackage.mymodule.MyReporterClass.
+output-format=text
+
+# Tells whether to display a full report or only the messages.
+reports=no
+
+# Activate the evaluation score.
+score=yes
+
+
+[REFACTORING]
+
+# Maximum number of nested blocks for function / method body
+max-nested-blocks=5
+
+# Complete name of functions that never returns. When checking for
+# inconsistent-return-statements if a never returning function is called then
+# it will be considered as an explicit return statement and no message will be
+# printed.
+never-returning-functions=sys.exit,argparse.parse_error
+
+
+[BASIC]
+
+# Naming style matching correct argument names.
+argument-naming-style=snake_case
+
+# Regular expression matching correct argument names. Overrides argument-
+# naming-style. If left empty, argument names will be checked with the set
+# naming style.
+#argument-rgx=
+
+# Naming style matching correct attribute names.
+attr-naming-style=snake_case
+
+# Regular expression matching correct attribute names. Overrides attr-naming-
+# style. If left empty, attribute names will be checked with the set naming
+# style.
+#attr-rgx=
+
+# Bad variable names which should always be refused, separated by a comma.
+bad-names=foo,
+ bar,
+ baz,
+ toto,
+ tutu,
+ tata
+
+# Bad variable names regexes, separated by a comma. If names match any regex,
+# they will always be refused
+bad-names-rgxs=
+
+# Naming style matching correct class attribute names.
+class-attribute-naming-style=any
+
+# Regular expression matching correct class attribute names. Overrides class-
+# attribute-naming-style. If left empty, class attribute names will be checked
+# with the set naming style.
+#class-attribute-rgx=
+
+# Naming style matching correct class constant names.
+class-const-naming-style=UPPER_CASE
+
+# Regular expression matching correct class constant names. Overrides class-
+# const-naming-style. If left empty, class constant names will be checked with
+# the set naming style.
+#class-const-rgx=
+
+# Naming style matching correct class names.
+class-naming-style=PascalCase
+
+# Regular expression matching correct class names. Overrides class-naming-
+# style. If left empty, class names will be checked with the set naming style.
+#class-rgx=
+
+# Naming style matching correct constant names.
+const-naming-style=UPPER_CASE
+
+# Regular expression matching correct constant names. Overrides const-naming-
+# style. If left empty, constant names will be checked with the set naming
+# style.
+#const-rgx=
+
+# Minimum line length for functions/classes that require docstrings, shorter
+# ones are exempt.
+docstring-min-length=-1
+
+# Naming style matching correct function names.
+function-naming-style=snake_case
+
+# Regular expression matching correct function names. Overrides function-
+# naming-style. If left empty, function names will be checked with the set
+# naming style.
+#function-rgx=
+
+# Good variable names which should always be accepted, separated by a comma.
+good-names=i,
+ j,
+ k,
+ ex,
+ Run,
+ _
+
+# Good variable names regexes, separated by a comma. If names match any regex,
+# they will always be accepted
+good-names-rgxs=
+
+# Include a hint for the correct naming format with invalid-name.
+include-naming-hint=no
+
+# Naming style matching correct inline iteration names.
+inlinevar-naming-style=any
+
+# Regular expression matching correct inline iteration names. Overrides
+# inlinevar-naming-style. If left empty, inline iteration names will be checked
+# with the set naming style.
+#inlinevar-rgx=
+
+# Naming style matching correct method names.
+method-naming-style=snake_case
+
+# Regular expression matching correct method names. Overrides method-naming-
+# style. If left empty, method names will be checked with the set naming style.
+#method-rgx=
+
+# Naming style matching correct module names.
+module-naming-style=snake_case
+
+# Regular expression matching correct module names. Overrides module-naming-
+# style. If left empty, module names will be checked with the set naming style.
+#module-rgx=
+
+# Colon-delimited sets of names that determine each other's naming style when
+# the name regexes allow several styles.
+name-group=
+
+# Regular expression which should only match function or class names that do
+# not require a docstring.
+no-docstring-rgx=^_
+
+# List of decorators that produce properties, such as abc.abstractproperty. Add
+# to this list to register other decorators that produce valid properties.
+# These decorators are taken in consideration only for invalid-name.
+property-classes=abc.abstractproperty
+
+# Regular expression matching correct type variable names. If left empty, type
+# variable names will be checked with the set naming style.
+#typevar-rgx=
+
+# Naming style matching correct variable names.
+variable-naming-style=snake_case
+
+# Regular expression matching correct variable names. Overrides variable-
+# naming-style. If left empty, variable names will be checked with the set
+# naming style.
+#variable-rgx=
+
+
+[FORMAT]
+
+# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
+expected-line-ending-format=
+
+# Regexp for a line that is allowed to be longer than the limit.
+ignore-long-lines=^\s*(# )?<?https?://\S+>?$
+
+# Number of spaces of indent required inside a hanging or continued line.
+indent-after-paren=4
+
+# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
+# tab).
+indent-string=' '
+
+# Maximum number of characters on a single line.
+max-line-length=100
+
+# Maximum number of lines in a module.
+max-module-lines=1000
+
+# Allow the body of a class to be on the same line as the declaration if body
+# contains single statement.
+single-line-class-stmt=no
+
+# Allow the body of an if to be on the same line as the test if there is no
+# else.
+single-line-if-stmt=no
+
+
+[LOGGING]
+
+# The type of string formatting that logging methods do. `old` means using %
+# formatting, `new` is for `{}` formatting.
+logging-format-style=old
+
+# Logging modules to check that the string format arguments are in logging
+# function parameter format.
+logging-modules=logging
+
+
+[MISCELLANEOUS]
+
+# List of note tags to take in consideration, separated by a comma.
+notes=FIXME,
+ XXX,
+ TODO
+
+# Regular expression of note tags to take in consideration.
+#notes-rgx=
+
+
+[SIMILARITIES]
+
+# Comments are removed from the similarity computation
+ignore-comments=yes
+
+# Docstrings are removed from the similarity computation
+ignore-docstrings=yes
+
+# Imports are removed from the similarity computation
+ignore-imports=no
+
+# Signatures are removed from the similarity computation
+ignore-signatures=no
+
+# Minimum lines number of a similarity.
+min-similarity-lines=4
+
+
+[SPELLING]
+
+# Limits count of emitted suggestions for spelling mistakes.
+max-spelling-suggestions=4
+
+# Spelling dictionary name. Available dictionaries: en (aspell), en_AG
+# (hunspell), en_AU (aspell), en_BS (hunspell), en_BW (hunspell), en_BZ
+# (hunspell), en_CA (aspell), en_DK (hunspell), en_GB (aspell), en_GH
+# (hunspell), en_HK (hunspell), en_IE (hunspell), en_IN (hunspell), en_JM
+# (hunspell), en_MW (hunspell), en_NA (hunspell), en_NG (hunspell), en_NZ
+# (hunspell), en_PH (hunspell), en_SG (hunspell), en_TT (hunspell), en_US
+# (aspell), en_ZA (hunspell), en_ZM (hunspell), en_ZW (hunspell).
+spelling-dict=
+
+# List of comma separated words that should be considered directives if they
+# appear and the beginning of a comment and should not be checked.
+spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy:
+
+# List of comma separated words that should not be checked.
+spelling-ignore-words=
+
+# A path to a file that contains the private dictionary; one word per line.
+spelling-private-dict-file=
+
+# Tells whether to store unknown words to the private dictionary (see the
+# --spelling-private-dict-file option) instead of raising a message.
+spelling-store-unknown-words=no
+
+
+[STRING]
+
+# This flag controls whether inconsistent-quotes generates a warning when the
+# character used as a quote delimiter is used inconsistently within a module.
+check-quote-consistency=no
+
+# This flag controls whether the implicit-str-concat should generate a warning
+# on implicit string concatenation in sequences defined over several lines.
+check-str-concat-over-line-jumps=no
+
+
+[TYPECHECK]
+
+# List of decorators that produce context managers, such as
+# contextlib.contextmanager. Add to this list to register other decorators that
+# produce valid context managers.
+contextmanager-decorators=contextlib.contextmanager
+
+# List of members which are set dynamically and missed by pylint inference
+# system, and so shouldn't trigger E1101 when accessed. Python regular
+# expressions are accepted.
+generated-members=
+
+# Tells whether missing members accessed in mixin class should be ignored. A
+# class is considered mixin if its name matches the mixin-class-rgx option.
+ignore-mixin-members=yes
+
+# Tells whether to warn about missing members when the owner of the attribute
+# is inferred to be None.
+ignore-none=yes
+
+# This flag controls whether pylint should warn about no-member and similar
+# checks whenever an opaque object is returned when inferring. The inference
+# can return multiple potential results while evaluating a Python object, but
+# some branches might not be evaluated, which results in partial inference. In
+# that case, it might be useful to still emit no-member and other checks for
+# the rest of the inferred objects.
+ignore-on-opaque-inference=yes
+
+# List of class names for which member attributes should not be checked (useful
+# for classes with dynamically set attributes). This supports the use of
+# qualified names.
+ignored-classes=optparse.Values,thread._local,_thread._local
+
+# List of module names for which member attributes should not be checked
+# (useful for modules/projects where namespaces are manipulated during runtime
+# and thus existing member attributes cannot be deduced by static analysis). It
+# supports qualified module names, as well as Unix pattern matching.
+ignored-modules=
+
+# Show a hint with possible names when a member name was not found. The aspect
+# of finding the hint is based on edit distance.
+missing-member-hint=yes
+
+# The minimum edit distance a name should have in order to be considered a
+# similar match for a missing member name.
+missing-member-hint-distance=1
+
+# The total number of similar names that should be taken in consideration when
+# showing a hint for a missing member.
+missing-member-max-choices=1
+
+# Regex pattern to define which classes are considered mixins ignore-mixin-
+# members is set to 'yes'
+mixin-class-rgx=.*[Mm]ixin
+
+# List of decorators that change the signature of a decorated function.
+signature-mutators=
+
+
+[VARIABLES]
+
+# List of additional names supposed to be defined in builtins. Remember that
+# you should avoid defining new builtins when possible.
+additional-builtins=
+
+# Tells whether unused global variables should be treated as a violation.
+allow-global-unused-variables=yes
+
+# List of names allowed to shadow builtins
+allowed-redefined-builtins=
+
+# List of strings which can identify a callback function by name. A callback
+# name must start or end with one of those strings.
+callbacks=cb_,
+ _cb
+
+# A regular expression matching the name of dummy variables (i.e. expected to
+# not be used).
+dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
+
+# Argument names that match this expression will be ignored. Default to name
+# with leading underscore.
+ignored-argument-names=_.*|^ignored_|^unused_
+
+# Tells whether we should check for unused import in __init__ files.
+init-import=no
+
+# List of qualified module names which can have objects that can redefine
+# builtins.
+redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io
+
+
+[CLASSES]
+
+# Warn about protected attribute access inside special methods
+check-protected-access-in-special-methods=no
+
+# List of method names used to declare (i.e. assign) instance attributes.
+defining-attr-methods=__init__,
+ __new__,
+ setUp,
+ __post_init__
+
+# List of member names, which should be excluded from the protected access
+# warning.
+exclude-protected=_asdict,
+ _fields,
+ _replace,
+ _source,
+ _make
+
+# List of valid names for the first argument in a class method.
+valid-classmethod-first-arg=cls
+
+# List of valid names for the first argument in a metaclass class method.
+valid-metaclass-classmethod-first-arg=cls
+
+
+[DESIGN]
+
+# List of regular expressions of class ancestor names to ignore when counting
+# public methods (see R0903)
+exclude-too-few-public-methods=
+
+# List of qualified class names to ignore when counting class parents (see
+# R0901)
+ignored-parents=
+
+# Maximum number of arguments for function / method.
+max-args=5
+
+# Maximum number of attributes for a class (see R0902).
+max-attributes=7
+
+# Maximum number of boolean expressions in an if statement (see R0916).
+max-bool-expr=5
+
+# Maximum number of branch for function / method body.
+max-branches=12
+
+# Maximum number of locals for function / method body.
+max-locals=15
+
+# Maximum number of parents for a class (see R0901).
+max-parents=7
+
+# Maximum number of public methods for a class (see R0904).
+max-public-methods=20
+
+# Maximum number of return / yield for function / method body.
+max-returns=6
+
+# Maximum number of statements in function / method body.
+max-statements=50
+
+# Minimum number of public methods for a class (see R0903).
+min-public-methods=2
+
+
+[IMPORTS]
+
+# List of modules that can be imported at any level, not just the top level
+# one.
+allow-any-import-level=
+
+# Allow wildcard imports from modules that define __all__.
+allow-wildcard-with-all=no
+
+# Analyse import fallback blocks. This can be used to support both Python 2 and
+# 3 compatible code, which means that the block might have code that exists
+# only in one or another interpreter, leading to false positives when analysed.
+analyse-fallback-blocks=no
+
+# Deprecated modules which should not be used, separated by a comma.
+deprecated-modules=
+
+# Output a graph (.gv or any supported image format) of external dependencies
+# to the given file (report RP0402 must not be disabled).
+ext-import-graph=
+
+# Output a graph (.gv or any supported image format) of all (i.e. internal and
+# external) dependencies to the given file (report RP0402 must not be
+# disabled).
+import-graph=
+
+# Output a graph (.gv or any supported image format) of internal dependencies
+# to the given file (report RP0402 must not be disabled).
+int-import-graph=
+
+# Force import order to recognize a module as part of the standard
+# compatibility libraries.
+known-standard-library=
+
+# Force import order to recognize a module as part of a third party library.
+known-third-party=enchant
+
+# Couples of modules and preferred modules, separated by a comma.
+preferred-modules=
+
+
+[EXCEPTIONS]
+
+# Exceptions that will emit a warning when being caught. Defaults to
+# "BaseException, Exception".
+overgeneral-exceptions=BaseException,
+ Exception
diff --git a/.reuse/dep5 b/.reuse/dep5
new file mode 100644
index 00000000..7431b193
--- /dev/null
+++ b/.reuse/dep5
@@ -0,0 +1,39 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: libical
+Upstream-Contact: Allen Winter <winter@kde.org>
+Source: https://github.com/libical/libical
+
+#misc documentation
+Files: AUTHORS Install.txt README.md ReleaseNotes.txt TEST THANKS TODO doc/AddingOrModifyingComponents.txt doc/UsingLibical.md examples/access-usecases.txt src/Net-ICal-Libical/README.txt src/php/README.txt src/python/ChangeLog src/python/python-binding.txt src/Net-ICal-Libical/MANIFEST src/Net-ICal-Libical/netical_wrap.doc
+Copyright: Copyright Contributors to the libical project
+License: LGPL-2.1-only OR MPL-2.0
+
+#tool configuration files
+Files: .clang-tidy .cmake-format.py .codespellrc .dir-locals.el .gitignore .krazy .mdlrc .mdlrc.rb .pre-commit-config.yaml .pylintrc .travis.yml appveyor.yml
+Copyright: Copyright Contributors to the libical project
+License: BSD-3-Clause
+
+#other not-easy-to-comment source files
+Files: src/libical-glib/ICalGLib.metadata.in src/libical-glib/tools/header-structure-boilerplate-template src/libical-glib/tools/source-structure-boilerplate-template doc/reference/libical-glib/libical-glib-docs.sgml.in src/Net-ICal-Libical/netical_wrap.c src/libical/qsort_gen.c
+Copyright: Copyright Contributors to the libical project
+License: LGPL-2.1-only OR MPL-2.0
+
+#timezones
+Files: zoneinfo/*
+Copyright: Copyright Contributors to the libical project
+License: CC0-1.0
+
+#design data
+Files: design-data/*
+Copyright: Copyright Contributors to the libical project
+License: LGPL-2.1-only OR MPL-2.0
+
+#testing data
+Files: test-data/*.ics test-data/*.vcf test-data/*.data test-data/*.tab test-data/*.txt src/test/*.ics src/test/*.out src/Net-ICal-Libical/test-data/* src/python/littlefile.txt
+Copyright: Copyright Contributors to the libical project
+License: LGPL-2.1-only OR MPL-2.0
+
+#debian packaging
+Files: debian/*
+Copyright: Copyright Contributors to the libical project
+License: LGPL-2.1-only OR MPL-2.0
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a88a022e..d1c455fd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,10 @@
# This is the top-level CMakeLists.txt file for the libical project.
#
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+#
# Pass the following variables to cmake to control the build:
-# (See doc/UsingLibical.txt for more information)
+# (See doc/UsingLibical.md for more information)
#
# -DWITH_CXX_BINDINGS=[true|false]
# Build the C++ bindings.
@@ -25,7 +28,7 @@
#
# -DSTATIC_ONLY=[true|false]
# Set to build static libraries only.
-# Turns-off GObject Introspection.
+# Not available for GObject Introspection and Vala "vapi"
# Default=false (build shared and static libs)
#
# -DSHARED_ONLY=[true|false]
@@ -66,6 +69,12 @@
# Set to build using a 32bit time_t (ignored unless building with MSVC on Windows)
# Default=false (use the default size of time_t)
#
+# -DLIBICAL_ENABLE_64BIT_ICALTIME_T=[true|false]
+# Redirect icaltime_t (and related functions) to a 64-bit version of time_t rather than to the
+# C standard library time_t. Intended for use on 32-bit systems which have a 64-bit time_t
+# (such as `__time64_t` on Windows) available.
+# Default=false (use plain time_t)
+#
# -DLIBICAL_BUILD_TESTING=[true|false]
# Set to build the test suite
# Default=true
@@ -74,19 +83,27 @@
# ## DO NOT USE IF YOU ARE AN END-USER. FOR THE DEVELOPERS ONLY!!
## Special CMake Options for Developers
#
-# -DABI_DUMPER=[true|false]
+# -DLIBICAL_DEVMODE_ABI_DUMPER=[true|false]
# Build for the abi-dumper (requires gcc)
# Default=false
#
-# -DADDRESS_SANITIZER=[true|false]
+# -DLIBICAL_DEVMODE_MEMORY_CONSISTENCY=[true|false]
+# Build using special memory consistency versions of malloc(), realloc() and free()
+# that perform some extra verifications. Most notably they ensure that memory allocated
+# with icalmemory_new_buffer() is freed using icalmemory_free() rather than using free()
+# directly and vice versa. Failing to do so would cause the test to fail with assertions
+# or access violations.
+# Default=false
+#
+# -DLIBICAL_DEVMODE_ADDRESS_SANITIZER=[true|false]
# Build with the address sanitizer (requires gcc or clang)
# Default=false
#
-# -DTHREAD_SANITIZER=[true|false]
+# -DLIBICAL_DEVMODE_THREAD_SANITIZER=[true|false]
# Build with the thread sanitizer (requires gcc or clang)
# Default=false
#
-# -DUNDEFINED_SANITIZER=[true|false]
+# -DLIBICAL_DEVMODE_UNDEFINED_SANITIZER=[true|false]
# Build with the undefined sanitizer (requires gcc or clang)
# Default=false
#
@@ -101,8 +118,11 @@ endif()
if(POLICY CMP0054)
cmake_policy(SET CMP0054 NEW)
endif()
+if(POLICY CMP0074)
+ cmake_policy(SET CMP0074 NEW) #don't warn about ICU_ROOT envvar
+endif()
-list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
#Include CMake capabilities
include(LibIcalMacrosInternal)
@@ -117,7 +137,10 @@ if(MSVC)
endif()
endif()
if(BAD_C_MESSAGE)
- message(FATAL_ERROR "\nSorry, ${BAD_C_MESSAGE} is required to build this software. Please retry using a modern C compiler that supports the C99 standard.")
+ message(FATAL_ERROR
+ "\nSorry, ${BAD_C_MESSAGE} is required to build this software. "
+ "Please retry using a modern C compiler that supports the C99 standard."
+ )
endif()
# Enable the test harness
@@ -137,7 +160,7 @@ set(LIBICAL_LIB_VERSION_STRING
"${LIBICAL_LIB_MAJOR_VERSION}.${LIBICAL_LIB_MINOR_VERSION}.${LIBICAL_LIB_PATCH_VERSION}"
)
-set(PROJECT_VERSION "${LIBICAL_LIB_MAJOR_VERSION}.${LIBICAL_LIB_MINOR_VERSION}")
+set(PROJECT_VERSION "3.1")
set(PROJECT_URL "https://libical.github.io/libical/")
# library build types
@@ -148,6 +171,8 @@ set(LIBRARY_TYPE SHARED)
option(WITH_CXX_BINDINGS "Build the C++ bindings." True)
if(WITH_CXX_BINDINGS)
enable_language(CXX)
+ set(CMAKE_CXX_STANDARD 11)
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(CMAKE_CXX_COMPILER)
add_definitions(-DWITH_CXX_BINDINGS)
else()
@@ -169,7 +194,10 @@ if(STATIC_ONLY)
set(LIBRARY_TYPE STATIC)
endif()
-libical_option(SHARED_ONLY "Build shared (dynamic) libraries only. Takes precedence over STATIC_ONLY." False)
+libical_option(SHARED_ONLY
+ "Build shared (dynamic) libraries only. Takes precedence over STATIC_ONLY."
+ False
+)
if(SHARED_ONLY)
set(STATIC_ONLY False)
set(LIBRARY_TYPE SHARED)
@@ -226,6 +254,14 @@ if(DEFINED ICU_BASE) #to make --warn-uninitialized happy
set(ICU_ROOT $ENV{ICU_BASE})
endif()
endif()
+if(DEFINED ICU_ROOT) #to make --warn-uninitialized happy
+ if(NOT "$ENV{ICU_ROOT}")
+ #Use the homebrew version. MacOS provided ICU doesn't provide development files
+ if(APPLE)
+ set(ICU_ROOT "/usr/local/opt/icu4c")
+ endif()
+ endif()
+endif()
find_package(ICU COMPONENTS uc i18n)
set_package_properties(ICU PROPERTIES
TYPE RECOMMENDED
@@ -237,7 +273,6 @@ add_feature_info(
"build in RSCALE support"
)
if(ICU_FOUND)
- set(REQUIRES_PRIVATE_ICU "Requires.private: icu-i18n") #for libical.pc
set(HAVE_LIBICU 1)
if(ICU_VERSION VERSION_GREATER 50)
set(HAVE_ICU_DANGI TRUE)
@@ -256,32 +291,53 @@ if(ICU_FOUND)
get_filename_component(ICU_EXEC ${ICU_MAKECONV_EXECUTABLE} DIRECTORY)
else()
message(FATAL_ERROR
- "Unable find locate the ICU runtime path. Is your ICU installation broken?")
+ "Unable to locate the ICU runtime path. Is your ICU installation broken?")
endif()
- set(ICU_BINARY_DIR ${ICU_EXEC} CACHE DOC STRING "Runtime binaries directory for the ICU library")
+ set(ICU_BINARY_DIR ${ICU_EXEC} CACHE STRING "Runtime binaries directory for the ICU library")
endif()
# compile in Berkeley DB support
-find_package(BDB)
-set_package_properties(BDB PROPERTIES
+if(DEFINED BerkeleyDB_ROOT_DIR) #to make --warn-uninitialized happy
+ if(NOT "$ENV{BerkeleyDB_ROOT_DIR}")
+ if(APPLE)
+ #Use the homebrew version. Xcode's version doesn't work for us.
+ set(BerkeleyDB_ROOT_DIR "/usr/local/opt/berkeley-db")
+ endif()
+ endif()
+endif()
+set(BerkeleyDB_FIND_QUIETLY True)
+find_package(BerkeleyDB)
+set_package_properties(BerkeleyDB PROPERTIES
TYPE OPTIONAL
PURPOSE "For Berkeley DB storage support"
)
add_feature_info(
"Berkeley DB storage support"
- BDB_FOUND
+ BerkeleyDB_FOUND
"build in support for Berkeley DB storage"
)
-if(BDB_FOUND)
+set(BDB_FOUND False)
+if(BerkeleyDB_FOUND)
set(HAVE_BDB True)
add_definitions(-DDB_DBM_HSEARCH=0) #set to 1 if hsearch support is needed
+ #for compatibility to our old FindBDB
+ set(BDB_FOUND True)
+ set(BDB_INCLUDE_DIR ${BerkeleyDB_INCLUDE_DIRS})
+ set(BDB_LIBRARY ${BerkeleyDB_LIBRARIES})
endif()
+# C99 compliant compiler is required
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+
# MSVC specific definitions
if(WIN32)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DYY_NO_UNISTD_H)
- libical_option(USE_32BIT_TIME_T "Build using a 32bit time_t (ignored unless building with MSVC on Windows)." False)
+ libical_option(USE_32BIT_TIME_T
+ "Build using a 32bit time_t (ignored unless building with MSVC on Windows)."
+ False
+ )
if(USE_32BIT_TIME_T)
add_definitions(-D_USE_32BIT_TIME_T)
endif()
@@ -293,6 +349,24 @@ if(WIN32)
add_definitions(-DBIG_ENDIAN=0 -DLITTLE_ENDIAN=1 -DBYTE_ORDER=BIG_ENDIAN)
endif()
+# define icaltime_t
+libical_option(LIBICAL_ENABLE_64BIT_ICALTIME_T
+ "Redirect icaltime_t and related functions to a 64-bit version of time_t rather than to the \
+ C standard library time_t. Intended for use on 32-bit systems which have a 64-bit time_t available. \
+ May not be implemented on all platforms yet"
+ False
+)
+if(LIBICAL_ENABLE_64BIT_ICALTIME_T)
+ if(MSVC)
+ set(ICAL_ICALTIME_T_TYPE "__time64_t")
+ else()
+ message(FATAL_ERROR
+ "Option LIBICAL_ENABLE_64BIT_ICALTIME_T is not supported with this compiler or architecture.")
+ endif()
+else()
+ set(ICAL_ICALTIME_T_TYPE "time_t")
+endif()
+
# Use GNUInstallDirs
include(GNUInstallDirs)
@@ -311,18 +385,20 @@ else()
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib)
endif()
-if(APPLE)
- set(CMAKE_INSTALL_NAME_DIR ${LIB_DESTINATION})
-endif()
-
-libical_option(ICAL_ERRORS_ARE_FATAL "icalerror_* calls will abort instead of internally signaling an error." False)
+libical_option(ICAL_ERRORS_ARE_FATAL
+ "icalerror_* calls will abort instead of internally signaling an error."
+ False
+)
if(ICAL_ERRORS_ARE_FATAL)
set(ICAL_ERRORS_ARE_FATAL 1)
else()
set(ICAL_ERRORS_ARE_FATAL 0)
endif()
-libical_option(ICAL_ALLOW_EMPTY_PROPERTIES "Prevents empty properties from being replaced with X-LIC-ERROR properties." False)
+libical_option(ICAL_ALLOW_EMPTY_PROPERTIES
+ "Prevents empty properties from being replaced with X-LIC-ERROR properties."
+ False
+)
if(ICAL_ALLOW_EMPTY_PROPERTIES)
set(ICAL_ALLOW_EMPTY_PROPERTIES 1)
else()
@@ -330,11 +406,16 @@ else()
endif()
if(WIN32 OR WINCE)
- set(DEF_USE_BUILTIN_TZDATA False)
-else()
set(DEF_USE_BUILTIN_TZDATA True)
+else()
+ set(DEF_USE_BUILTIN_TZDATA False)
endif()
-libical_option(USE_BUILTIN_TZDATA "(Careful) Build using libical's built-in timezone data, else use the system timezone data on non-Windows systems. ALWAYS true on Windows. Non-Windows users should know what they're doing if they choose not to use system provided timezone data. The libical project does not guarantee that the built-in timezone data is up-to-date." ${DEF_USE_BUILTIN_TZDATA})
+libical_option(USE_BUILTIN_TZDATA
+ "(Careful) Build using libical's built-in timezone data, else use the system timezone data on non-Windows systems. \
+ ALWAYS true on Windows. Non-Windows users should know what they're doing if they choose not to use system provided \
+ timezone data. The libical project does not guarantee that the built-in timezone data is up-to-date."
+ ${DEF_USE_BUILTIN_TZDATA}
+)
mark_as_advanced(USE_BUILTIN_TZDATA)
if(USE_BUILTIN_TZDATA)
set(USE_BUILTIN_TZDATA 1)
@@ -367,7 +448,11 @@ set(INSTALL_TARGETS_DEFAULT_ARGS
find_package(PkgConfig QUIET)
set(MIN_GOBJECT_INTROSPECTION "0.6.7")
-libical_option(GOBJECT_INTROSPECTION "Build GObject introspection \"typelib\" files. Requires GObject Introspection development package ${MIN_GOBJECT_INTROSPECTION} or higher." False)
+libical_option(GOBJECT_INTROSPECTION
+ "Build GObject introspection \"typelib\" files. \
+ Requires GObject Introspection development package ${MIN_GOBJECT_INTROSPECTION} or higher."
+ False
+)
if(GOBJECT_INTROSPECTION)
if(NOT PKG_CONFIG_FOUND)
message(FATAL_ERROR
@@ -402,6 +487,14 @@ endif()
libical_option(ICAL_GLIB_VAPI "Build Vala \"vapi\" files." False)
if(ICAL_GLIB_VAPI)
+ if(STATIC_ONLY)
+ message(FATAL_ERROR
+ "You are attempting to build the Vala api, however that option is not supported "
+ "when building static libraries only. "
+ "Please disable the static only option (-DSTATIC_ONLY=False) "
+ "if you really want to build the Vala api. Alternatively, "
+ "you can disable this feature (by passing -DICAL_GLIB_VAPI=False to cmake).")
+ endif()
if(NOT GOBJECT_INTROSPECTION)
message(FATAL_ERROR
"You requested to build the Vala vapi but have not enabled the GObject Introspection. "
@@ -425,7 +518,11 @@ endif()
set(MIN_GLIB "2.44")
set(MIN_LIBXML "2.7.3")
-libical_option(ICAL_GLIB "Build libical-glib interface. Requires glib ${MIN_GLIB} and libxml ${MIN_LIBXML} development packages or higher." True)
+libical_option(ICAL_GLIB
+ "Build libical-glib interface. \
+ Requires glib ${MIN_GLIB} and libxml ${MIN_LIBXML} development packages or higher."
+ True
+)
if(ICAL_GLIB)
if(NOT PKG_CONFIG_FOUND)
message(FATAL_ERROR
@@ -470,8 +567,21 @@ endif()
#
# Compiler settings
#
-if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -Wno-deprecated -Wall -Wno-unknown-pragmas -Wextra -Winit-self -Wunused -Wno-div-by-zero -Wundef -Wpointer-arith -Wtype-limits -Wwrite-strings -Werror=return-type")
+set(CMAKE_C_COMPILER_IS_CLANG False)
+set(CMAKE_C_COMPILER_IS_GCC False)
+if(DEFINED CMAKE_C_COMPILER_ID)
+ if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+ set(CMAKE_C_COMPILER_IS_CLANG True)
+ elseif("${CMAKE_C_COMPILER_ID}" MATCHES "GNU")
+ set(CMAKE_C_COMPILER_IS_GCC True)
+ endif()
+endif()
+if(CMAKE_C_COMPILER_IS_GCC OR CMAKE_C_COMPILER_IS_CLANG)
+ set(CMAKE_C_FLAGS
+ "${CMAKE_C_FLAGS} -fvisibility=hidden \
+ -Wno-deprecated -Wall -Wno-unknown-pragmas -Wextra -Winit-self -Wunused -Wno-div-by-zero \
+ -Wundef -Wpointer-arith -Wtype-limits -Wwrite-strings -Werror=return-type"
+ )
libical_add_cflag(-Wunused-but-set-variable UNUSED_BUT_SET)
libical_add_cflag(-Wlogical-op LOGICAL_OP)
libical_add_cflag(-Wsizeof-pointer-memaccess POINTER_MEMACCESS)
@@ -481,12 +591,25 @@ if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=500 -D_DEFAULT_SOURCE -D_GNU_SOURCE")
endif()
endif()
-if("${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+if(CMAKE_C_COMPILER_IS_CLANG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Qunused-arguments")
endif()
-if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -Weffc++ -Wno-deprecated -Wall -Wextra -Woverloaded-virtual -Winit-self -Wunused -Wno-div-by-zero -Wundef -Wpointer-arith -Wtype-limits -Wwrite-strings -Werror=return-type")
+set(CMAKE_CXX_COMPILER_IS_CLANG False)
+set(CMAKE_CXX_COMPILER_IS_GCC False)
+if(DEFINED CMAKE_CXX_COMPILER_ID)
+ if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+ set(CMAKE_CXX_COMPILER_IS_CLANG True)
+ elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
+ set(CMAKE_CXX_COMPILER_IS_GCC True)
+ endif()
+endif()
+if(CMAKE_CXX_COMPILER_IS_GCC OR CMAKE_CXX_COMPILER_IS_CLANG)
+ set(CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} -fvisibility=hidden \
+ -Weffc++ -Wno-deprecated -Wall -Wextra -Woverloaded-virtual -Winit-self -Wunused \
+ -Wno-div-by-zero -Wundef -Wpointer-arith -Wtype-limits -Wwrite-strings -Werror=return-type"
+ )
libical_add_cxxflag(-Wunused-but-set-variable UNUSED_BUT_SET)
libical_add_cxxflag(-Wlogical-op LOGICAL_OP)
libical_add_cxxflag(-Wsizeof-pointer-memaccess POINTER_MEMACCESS)
@@ -497,7 +620,7 @@ if(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_XOPEN_SOURCE=500 -D_DEFAULT_SOURCE -D_GNU_SOURCE")
endif()
endif()
-if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
+if(CMAKE_CXX_COMPILER_IS_CLANG)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments")
endif()
@@ -507,10 +630,14 @@ if(SIZEOF_TIME_T EQUAL 4)
endif()
################ Developer Options #####################
-libical_option(ABI_DUMPER "(Developer-only) Build for abi-dumper." False)
-mark_as_advanced(ABI_DUMPER)
-if(ABI_DUMPER)
- if(CMAKE_COMPILER_IS_GNUCC)
+libical_deprecated_option(ABI_DUMPER
+ LIBICAL_DEVMODE_ABI_DUMPER
+ "(Developer-only) Build for abi-dumper."
+ False
+)
+mark_as_advanced(LIBICAL_DEVMODE_ABI_DUMPER)
+if(LIBICAL_DEVMODE_ABI_DUMPER)
+ if(CMAKE_C_COMPILER_IS_GCC)
set(CMAKE_C_FLAGS "-g -Og")
set(CMAKE_CXX_FLAGS "-g -Og")
else()
@@ -519,10 +646,24 @@ if(ABI_DUMPER)
endif()
endif()
-libical_option(ADDRESS_SANITIZER "(Developer-only) Build with the address sanitizer." False)
-mark_as_advanced(ADDRESS_SANITIZER)
-if(ADDRESS_SANITIZER)
- if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+libical_option(LIBICAL_DEVMODE_MEMORY_CONSISTENCY
+ "(Developer-only) Build with memory consistency functions."
+ False
+)
+if(LIBICAL_DEVMODE_MEMORY_CONSISTENCY)
+ set(CMAKE_BUILD_TYPE "Debug")
+ add_definitions(-DMEMORY_CONSISTENCY)
+endif()
+mark_as_advanced(LIBICAL_DEVMODE_MEMORY_CONSISTENCY)
+
+libical_deprecated_option(ADDRESS_SANITIZER
+ LIBICAL_DEVMODE_ADDRESS_SANITIZER
+ "(Developer-only) Build with the address sanitizer."
+ False
+)
+mark_as_advanced(LIBICAL_DEVMODE_ADDRESS_SANITIZER)
+if(LIBICAL_DEVMODE_ADDRESS_SANITIZER)
+ if(CMAKE_C_COMPILER_IS_GCC OR CMAKE_C_COMPILER_IS_CLANG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -g -DADDRESS_SANITIZER")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g -DADDRESS_SANITIZER")
else()
@@ -545,10 +686,14 @@ if(ADDRESS_SANITIZER)
endif()
endif()
-libical_option(THREAD_SANITIZER "(Developer-only) Build with the thread sanitizer." False)
-mark_as_advanced(THREAD_SANITIZER)
-if(THREAD_SANITIZER)
- if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+libical_deprecated_option(THREAD_SANITIZER
+ LIBICAL_DEVMODE_THREAD_SANITIZER
+ "(Developer-only) Build with the thread sanitizer."
+ False
+)
+mark_as_advanced(LIBICAL_DEVMODE_THREAD_SANITIZER)
+if(LIBICAL_DEVMODE_THREAD_SANITIZER)
+ if(CMAKE_C_COMPILER_IS_GCC OR CMAKE_C_COMPILER_IS_CLANG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -O1 -g -DTHREAD_SANITIZER")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -O1 -g -DTHREAD_SANITIZER")
else()
@@ -571,10 +716,14 @@ if(THREAD_SANITIZER)
endif()
endif()
-libical_option(UNDEFINED_SANITIZER "(Developer-only) Build with the undefined sanitizer." False)
-mark_as_advanced(UNDEFINED_SANITIZER)
-if(UNDEFINED_SANITIZER)
- if(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" MATCHES "Clang")
+libical_deprecated_option(UNDEFINED_SANITIZER
+ LIBICAL_DEVMODE_UNDEFINED_SANITIZER
+ "(Developer-only) Build with the undefined sanitizer."
+ False
+)
+mark_as_advanced(LIBICAL_DEVMODE_UNDEFINED_SANITIZER)
+if(LIBICAL_DEVMODE_UNDEFINED_SANITIZER)
+ if(CMAKE_C_COMPILER_IS_GCC OR CMAKE_C_COMPILER_IS_CLANG)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -O1 -g -DUNDEFINED_SANITIZER -lubsan")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -O1 -g -DUNDEFINED_SANITIZER -lubsan")
else()
@@ -599,7 +748,7 @@ endif()
libical_option(ENABLE_LTO_BUILD "Build a link-time optimized version." False)
if(ENABLE_LTO_BUILD)
- if(CMAKE_COMPILER_IS_GNUCC)
+ if(CMAKE_C_COMPILER_IS_GCC)
libical_add_cflag(-flto LTO)
if(C_SUPPORTS_LTO)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wlto-type-mismatch -fuse-linker-plugin")
@@ -609,7 +758,7 @@ if(ENABLE_LTO_BUILD)
message(FATAL_ERROR
"Your C compiler ${CMAKE_C_COMPILER_ID} does not support the LTO building.")
endif()
- if(WITH_CXX_BINDINGS AND CMAKE_COMPILER_IS_GNUCXX)
+ if(WITH_CXX_BINDINGS AND CMAKE_CXX_COMPILER_IS_GCC)
include(CheckCXXCompilerFlag)
libical_add_cxxflag(-flto LTO)
if(CXX_SUPPORTS_LTO)
@@ -649,9 +798,26 @@ endif()
set(VERSION "${LIBICAL_LIB_VERSION_STRING}")
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
-set(libdir "\${exec_prefix}/lib")
-set(includedir "\${prefix}/include")
-set(PTHREAD_LIBS "${CMAKE_THREAD_LIBS_INIT}")
+if(IS_ABSOLUTE ${LIB_INSTALL_DIR})
+ set(libdir "${LIB_INSTALL_DIR}")
+else()
+ set(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
+endif()
+if(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
+ set(includedir "${INCLUDE_INSTALL_DIR}")
+else()
+ set(includedir "\${prefix}/include")
+endif()
+if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ set(PTHREAD_LIBS "${CMAKE_THREAD_LIBS_INIT}")
+else()
+ set(PTHREAD_LIBS "")
+endif()
+if(ICU_FOUND)
+ set(REQUIRES_PRIVATE_ICU "Requires.private: icu-i18n") #for libical.pc
+else()
+ set(REQUIRES_PRIVATE_ICU "")
+endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/libical.pc.in
@@ -699,6 +865,7 @@ if(NOT TARGET uninstall)
add_custom_target(uninstall
COMMAND "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake"
+ COMMENT "Target for uninstalling everything"
)
endif()
diff --git a/ConfigureChecks.cmake b/ConfigureChecks.cmake
index 545877ae..a7a0181a 100644
--- a/ConfigureChecks.cmake
+++ b/ConfigureChecks.cmake
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
include(CheckIncludeFiles)
check_include_files(byteswap.h HAVE_BYTESWAP_H)
check_include_files(dirent.h HAVE_DIRENT_H)
@@ -64,17 +67,31 @@ endif()
if(NOT DEFINED CMAKE_REQUIRED_LIBRARIES)
set(CMAKE_REQUIRED_LIBRARIES "")
endif()
-set(_SAVE_RQL ${CMAKE_REQUIRED_LIBRARIES})
-set(CMAKE_REQUIRED_LIBRARIES kernel32.lib)
-check_function_exists(GetNumberFormat HAVE_GETNUMBERFORMAT) #Windows <windows.h>
-set(CMAKE_REQUIRED_LIBRARIES ${_SAVE_RQL})
+#GetNumberFormat is not implemented on wine correctly
+#(see https://forum.winehq.org/viewtopic.php?t=27809) which results in
+#error when building. That means if linux user has installed wine,
+#the build of libical will fail.
+if(WIN32)
+ set(_SAVE_RQL ${CMAKE_REQUIRED_LIBRARIES})
+ set(CMAKE_REQUIRED_LIBRARIES kernel32.lib)
+ check_function_exists(GetNumberFormat HAVE_GETNUMBERFORMAT) #Windows <windows.h>
+ set(CMAKE_REQUIRED_LIBRARIES ${_SAVE_RQL})
+endif()
include(CheckTypeSize)
check_type_size(intptr_t SIZEOF_INTPTR_T)
check_type_size(pid_t SIZEOF_PID_T)
check_type_size(size_t SIZEOF_SIZE_T)
check_type_size(ssize_t SIZEOF_SSIZE_T)
-check_type_size(time_t SIZEOF_TIME_T)
+if(WIN32 AND MSVC AND USE_32BIT_TIME_T)
+ set(_SAVE_RQD ${CMAKE_REQUIRED_DEFINITIONS})
+ set(CMAKE_REQUIRED_DEFINITIONS -D_USE_32BIT_TIME_T)
+ check_type_size(time_t SIZEOF_TIME_T)
+ set(CMAKE_REQUIRED_DEFINITIONS ${_SAVE_RQD})
+else()
+ check_type_size(time_t SIZEOF_TIME_T)
+endif()
+check_type_size(${ICAL_ICALTIME_T_TYPE} SIZEOF_ICALTIME_T)
check_type_size(wint_t SIZEOF_WINT_T)
include(FindThreads)
diff --git a/Install.txt b/Install.txt
index 866e7793..50dd580e 100644
--- a/Install.txt
+++ b/Install.txt
@@ -10,11 +10,13 @@ passing -DCMAKE_INSTALL_PREFIX=/install/path to cmake.
To build a debug version pass -DCMAKE_BUILD_TYPE=Debug to cmake.
To build libical you will need:
+ - a C99-compliant C compiler (let us know if the build fails with your C compiler)
+ - a C11-compliant C compiler for libical-glib
+ - a C++11 compliant compiler for C++ bindings
- CMake version 3.11.0 or higher
- Perl
- Flex and Bison (on Windows we recommend winflexbison)
- libicu (not required but strongly recommended)
- - a C compiler (let us know if the build fails with your C compiler)
Building on Unix with gcc or clang:
% mkdir build
diff --git a/LICENSE.LGPL21.txt b/LICENSE.LGPL21.txt
deleted file mode 100644
index eeb9f8a4..00000000
--- a/LICENSE.LGPL21.txt
+++ /dev/null
@@ -1,516 +0,0 @@
-
- Libical is Copyright (C) 2010-2017 Klaralvdalens Datakonsult AB.
-
- You may use, distribute and copy Libical under the terms of the
- GNU Lesser General Public License version 2.1, which is displayed below.
-
--------------------------------------------------------------------------
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations
-below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it
-becomes a de-facto standard. To achieve this, non-free programs must
-be allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control
-compilation and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at least
- three years, to give the same user the materials specified in
- Subsection 6a, above, for a charge no more than the cost of
- performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply, and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License
-may add an explicit geographical distribution limitation excluding those
-countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms
-of the ordinary General Public License).
-
- To apply these terms, attach the following notices to the library.
-It is safest to attach them to the start of each source file to most
-effectively convey the exclusion of warranty; and each file should
-have at least the "copyright" line and a pointer to where the full
-notice is found.
-
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU 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
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or
-your school, if any, to sign a "copyright disclaimer" for the library,
-if necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James
- Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/LICENSE b/LICENSE.txt
index b2bf441f..b2bf441f 100644
--- a/LICENSE
+++ b/LICENSE.txt
diff --git a/LICENSES/BSD-3-Clause.txt b/LICENSES/BSD-3-Clause.txt
new file mode 100644
index 00000000..086d3992
--- /dev/null
+++ b/LICENSES/BSD-3-Clause.txt
@@ -0,0 +1,11 @@
+Copyright (c) <year> <owner>.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+2. 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.
+
+3. Neither the name of the copyright holder 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 HOLDER 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/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt
new file mode 100644
index 00000000..0e259d42
--- /dev/null
+++ b/LICENSES/CC0-1.0.txt
@@ -0,0 +1,121 @@
+Creative Commons Legal Code
+
+CC0 1.0 Universal
+
+ CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
+ LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
+ ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
+ INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
+ REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
+ PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
+ THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
+ HEREUNDER.
+
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer
+exclusive Copyright and Related Rights (defined below) upon the creator
+and subsequent owner(s) (each and all, an "owner") of an original work of
+authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for
+the purpose of contributing to a commons of creative, cultural and
+scientific works ("Commons") that the public can reliably and without fear
+of later claims of infringement build upon, modify, incorporate in other
+works, reuse and redistribute as freely as possible in any form whatsoever
+and for any purposes, including without limitation commercial purposes.
+These owners may contribute to the Commons to promote the ideal of a free
+culture and the further production of creative, cultural and scientific
+works, or to gain reputation or greater distribution for their Work in
+part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any
+expectation of additional consideration or compensation, the person
+associating CC0 with a Work (the "Affirmer"), to the extent that he or she
+is an owner of Copyright and Related Rights in the Work, voluntarily
+elects to apply CC0 to the Work and publicly distribute the Work under its
+terms, with knowledge of his or her Copyright and Related Rights in the
+Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be
+protected by copyright and related or neighboring rights ("Copyright and
+Related Rights"). Copyright and Related Rights include, but are not
+limited to, the following:
+
+ i. the right to reproduce, adapt, distribute, perform, display,
+ communicate, and translate a Work;
+ ii. moral rights retained by the original author(s) and/or performer(s);
+iii. publicity and privacy rights pertaining to a person's image or
+ likeness depicted in a Work;
+ iv. rights protecting against unfair competition in regards to a Work,
+ subject to the limitations in paragraph 4(a), below;
+ v. rights protecting the extraction, dissemination, use and reuse of data
+ in a Work;
+ vi. database rights (such as those arising under Directive 96/9/EC of the
+ European Parliament and of the Council of 11 March 1996 on the legal
+ protection of databases, and under any national implementation
+ thereof, including any amended or successor version of such
+ directive); and
+vii. other similar, equivalent or corresponding rights throughout the
+ world based on applicable law or treaty, and any national
+ implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention
+of, applicable law, Affirmer hereby overtly, fully, permanently,
+irrevocably and unconditionally waives, abandons, and surrenders all of
+Affirmer's Copyright and Related Rights and associated claims and causes
+of action, whether now known or unknown (including existing as well as
+future claims and causes of action), in the Work (i) in all territories
+worldwide, (ii) for the maximum duration provided by applicable law or
+treaty (including future time extensions), (iii) in any current or future
+medium and for any number of copies, and (iv) for any purpose whatsoever,
+including without limitation commercial, advertising or promotional
+purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
+member of the public at large and to the detriment of Affirmer's heirs and
+successors, fully intending that such Waiver shall not be subject to
+revocation, rescission, cancellation, termination, or any other legal or
+equitable action to disrupt the quiet enjoyment of the Work by the public
+as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason
+be judged legally invalid or ineffective under applicable law, then the
+Waiver shall be preserved to the maximum extent permitted taking into
+account Affirmer's express Statement of Purpose. In addition, to the
+extent the Waiver is so judged Affirmer hereby grants to each affected
+person a royalty-free, non transferable, non sublicensable, non exclusive,
+irrevocable and unconditional license to exercise Affirmer's Copyright and
+Related Rights in the Work (i) in all territories worldwide, (ii) for the
+maximum duration provided by applicable law or treaty (including future
+time extensions), (iii) in any current or future medium and for any number
+of copies, and (iv) for any purpose whatsoever, including without
+limitation commercial, advertising or promotional purposes (the
+"License"). The License shall be deemed effective as of the date CC0 was
+applied by Affirmer to the Work. Should any part of the License for any
+reason be judged legally invalid or ineffective under applicable law, such
+partial invalidity or ineffectiveness shall not invalidate the remainder
+of the License, and in such case Affirmer hereby affirms that he or she
+will not (i) exercise any of his or her remaining Copyright and Related
+Rights in the Work or (ii) assert any associated claims and causes of
+action with respect to the Work, in either case contrary to Affirmer's
+express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ a. No trademark or patent rights held by Affirmer are waived, abandoned,
+ surrendered, licensed or otherwise affected by this document.
+ b. Affirmer offers the Work as-is and makes no representations or
+ warranties of any kind concerning the Work, express, implied,
+ statutory or otherwise, including without limitation warranties of
+ title, merchantability, fitness for a particular purpose, non
+ infringement, or the absence of latent or other defects, accuracy, or
+ the present or absence of errors, whether or not discoverable, all to
+ the greatest extent permissible under applicable law.
+ c. Affirmer disclaims responsibility for clearing rights of other persons
+ that may apply to the Work or any use thereof, including without
+ limitation any person's Copyright and Related Rights in the Work.
+ Further, Affirmer disclaims responsibility for obtaining any necessary
+ consents, permissions or other rights required for any use of the
+ Work.
+ d. Affirmer understands and acknowledges that Creative Commons is not a
+ party to this document and has no duty or obligation with respect to
+ this CC0 or use of the Work.
diff --git a/LICENSES/LGPL-2.1-only.txt b/LICENSES/LGPL-2.1-only.txt
new file mode 100644
index 00000000..c9aa5301
--- /dev/null
+++ b/LICENSES/LGPL-2.1-only.txt
@@ -0,0 +1,175 @@
+GNU LESSER GENERAL PUBLIC LICENSE
+
+Version 2.1, February 1999
+
+Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
+
+This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
+
+When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
+
+To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
+
+For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
+
+We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
+
+To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
+
+Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
+
+Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
+
+When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
+
+We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
+
+For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
+
+In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
+
+Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
+
+The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
+
+A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
+
+The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
+
+"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
+
+1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
+
+(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
+
+Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
+
+This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
+
+4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
+
+If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
+
+5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
+
+However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
+
+When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
+
+If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
+
+Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
+
+6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
+
+You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
+
+ a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
+
+For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
+
+7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
+
+ b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
+
+8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
+
+10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
+
+11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
+
+14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Libraries
+
+If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
+
+To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+ one line to give the library's name and an idea of what it does.
+ Copyright (C) year name of author
+
+ This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in
+the library `Frob' (a library for tweaking knobs) written
+by James Random Hacker.
+
+signature of Ty Coon, 1 April 1990
+Ty Coon, President of Vice
+That's all there is to it!
diff --git a/LICENSES/LicenseRef-APPLEMIT.txt b/LICENSES/LicenseRef-APPLEMIT.txt
new file mode 100644
index 00000000..179b87f6
--- /dev/null
+++ b/LICENSES/LicenseRef-APPLEMIT.txt
@@ -0,0 +1,29 @@
+(Similar to, but predates the Apple MIT License by at least 10 years.)
+
+For purposes of this license notice, the term Licensors shall mean,
+collectively, Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+The term Licensor shall mean any of the Licensors.
+
+Subject to acceptance of the following conditions, permission is hereby
+granted by Licensors without the need for written agreement and without
+license or royalty fees, to use, copy, modify and distribute this
+software for any purpose.
+
+The above copyright notice and the following four paragraphs must be
+reproduced in all copies of this software and any software including
+this software.
+
+THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
+ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
+MODIFICATIONS.
+
+IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
+INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
+OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGE.
+
+EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.
diff --git a/LICENSES/LicenseRef-CISST.txt b/LICENSES/LicenseRef-CISST.txt
new file mode 100644
index 00000000..f3c1a0df
--- /dev/null
+++ b/LICENSES/LicenseRef-CISST.txt
@@ -0,0 +1,157 @@
+This license applies to the cmake/Toolchain-QNX-* files only.
+
+CISST Software License Agreement
+
+Version 1.0 (October 30, 2006)
+
+PURPOSE
+
+The Johns Hopkins University's Engineering Research Center for
+Computer-Integrated Surgical Systems and Technology (CISST ERC) has
+developed a software package ("CISST") that provides C++ libraries to
+facilitate the development of computer-integrated surgery systems.
+This Software License Agreement ("Agreement") covers downloads from
+the CISST package maintained by The Johns Hopkins University ("JHU").
+If you distribute Software (as defined below) downloaded from CISST,
+all of the paragraphs of this Agreement must be included with and
+apply to such Software.
+
+Your downloading, copying, modifying, displaying, distributing or use
+of any software, documentation, and/or data from CISST (collectively,
+the "Software") constitutes acceptance of all of the terms and
+conditions of this Agreement. If you do not agree to such terms and
+conditions, you have no right to download, copy, modify, display,
+distribute or use the Software.
+
+DOWNLOADING AGREEMENT - License from JHU with Right to Sublicense
+("Software License").
+
+1. As used in this Software License, "you" means the individual
+ downloading and/or using, reproducing, modifying, displaying and/or
+ distributing the Software and the institution or entity which
+ employs or is otherwise affiliated with such individual in
+ connection therewith. The Johns Hopkins University ("JHU") hereby
+ grants you, with right to sublicense, with respect to JHU's rights
+ in the software, documentation, and data, if any, which is the
+ subject of this Software License (collectively, the "Software"), a
+ royalty-free, non-exclusive license to use, reproduce, make
+ derivative works of, display and distribute the Software, provided
+ that:
+
+ (a) you accept and adhere to all of the terms and conditions of
+ this Software License;
+
+ (b) in connection with any copy of or sublicense of all or any
+ portion of the Software, all of the terms and conditions in
+ this Software License shall appear in and shall apply to such
+ copy and such sublicense, including without limitation all
+ source and executable forms and on any user documentation that
+ includes license information, prefaced with the following
+ words: "All or portions of this licensed product have been
+ obtained under license from The Johns Hopkins University and
+ are subject to the following terms and conditions:"
+
+ (c) you preserve and maintain all applicable attributions,
+ copyright notices and licenses included in or applicable to the
+ Software;
+
+ (d) modified versions of the Software must be clearly identified
+ and marked as such, and must not be misrepresented as being the
+ original Software; and
+
+ (e) you consider making, but are under no obligation to make, the
+ source code of any of your modifications to the Software freely
+ available to others on an open source basis.
+
+2. The license granted in this Software License includes without
+ limitation the right to (i) incorporate the Software into
+ proprietary programs (subject to any restrictions applicable to
+ such programs), (ii) add your own copyright statement to your
+ modifications of the Software, and (iii) provide additional or
+ different license terms and conditions in your sublicenses of
+ modifications of the Software; provided that in each case your use,
+ reproduction or distribution of such modifications otherwise
+ complies with the conditions stated in this Software License.
+
+3. This Software License does not grant any rights with respect to
+ third party software, except those rights that JHU has been
+ authorized by a third party to grant to you, and accordingly you
+ are solely responsible for (i) obtaining any permissions from third
+ parties that you need to use, reproduce, make derivative works of,
+ display and distribute the Software, and (ii) informing your
+ sublicensees, including without limitation your end-users, of their
+ obligations to secure any such required permissions.
+
+4. The Software, as provided by JHU, was designed for research
+ purposes only and was not reviewed or approved by the Food and Drug
+ Administration or by any other agency. YOU ACKNOWLEDGE AND AGREE
+ THAT CLINICAL USE OF THE JHU SOFTWARE IS NEITHER RECOMMENDED NOR
+ ADVISED. Any modification or commercialization of the Software,
+ whether for clinical use or otherwise, is at the sole risk of the
+ party or parties engaged therein. You further agree to use,
+ reproduce, make derivative works of, display and distribute the
+ Software in compliance with all applicable governmental laws,
+ regulations and orders, including without limitation those relating
+ to export and import control.
+
+5. The Software is provided "AS IS" and neither JHU nor any
+ contributor to the software (each a "Contributor") shall have any
+ obligation to provide maintenance, support, updates, enhancements
+ or modifications thereto. JHU AND ALL CONTRIBUTORS MAKE NO WARRANTY
+ THAT ALL ERRORS, BUGS, DEFICIENCIES, DEFECTS AND MALFUNCTIONS HAVE
+ BEEN OR CAN BE ELIMINATED FROM THE SOFTWARE, AND, JHU AND ALL
+ CONTRIBUTORS SHALL IN NO EVENT BE RESPONSIBLE FOR LOSSES OF ANY
+ KIND RESULTING FROM THE USE OF THE SOFTWARE, OR ANY PART THEREOF,
+ INCLUDING, WITHOUT LIMITATION ANY LIABILITY FOR BUSINESS EXPENSE,
+ MACHINE DOWNTIME, OR DAMAGES CAUSED TO LICENSEE BY ANY ERROR, BUG,
+ DEFICIENCY, DEFECT OR MALFUNCITON. JHU AND ALL CONTRIBUTORS
+ SPECIFICALLY DISCLAIM ALL EXPRESS AND IMPLIED WARRANTIES OF ANY
+ KIND INCLUDING, BUT NOT LIMITED TO, ANY WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NON-INFRINGEMENT. IN NO EVENT SHALL JHU OR ANY CONTRIBUTOR BE
+ LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL,
+ EXEMPLARY OR CONSEQUENTIAL DAMAGES HOWEVER CAUSED AND ON ANY THEORY
+ OF LIABILITY ARISING IN ANY WAY RELATED TO THE SOFTWARE, EVEN IF
+ JHU OR ANY CONTRIBUTOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ DAMAGES. TO THE MAXIMUM EXTENT NOT PROHIBITED BY LAW OR REGULATION,
+ YOU FURTHER ASSUME ALL LIABILITY FOR YOUR USE, REPRODUCTION, MAKING
+ OF DERIVATIVE WORKS, DISPLAY, LICENSE OR DISTRIBUTION OF THE
+ SOFTWARE AND AGREE TO INDEMNIFY AND HOLD HARMLESS JHU AND ALL
+ CONTRIBUTORS FROM AND AGAINST ANY AND ALL CLAIMS, SUITS, ACTIONS,
+ DEMANDS AND JUDGMENTS ARISING THEREFROM.
+
+6. None of the names, logos or trademarks of JHU or any of JHU's
+ affiliates or any of the Contributors, or any funding agency, may
+ be used to endorse or promote products produced in whole or in part
+ by operation of the Software or derived from or based on the
+ Software without specific prior written permission from the
+ applicable party.
+
+7. Any use, reproduction or distribution of the Software which is not
+ in accordance with this Software License shall automatically revoke
+ all rights granted to you under this Software License.
+
+8. This Software License does not grant any rights in or to any
+ intellectual property owned by JHU or any Contributor except those
+ rights expressly granted hereunder.
+
+MISCELLANEOUS
+
+This Agreement shall be governed by and construed in accordance with
+the laws of The State of Maryland without regard to principles of
+conflicts of law. As specifically provided by MD. Anno. Code, CL,
+Section 21-104, the Parties agree that this Agreement shall not be
+governed by the Uniform Computer Information Transactions Act (UCITA)
+as adopted in Maryland under Title 21 of the Commercial Law Article of
+the Maryland Annotated Code, as amended from time to time. This
+agreement shall be governed by the common law of Maryland relating to
+written agreements, as well as other statutory provisions, other than
+UCITA which may apply, and shall be interpreted and enforced as if
+UCITA had never been adopted in Maryland. The Parties further agree
+that electronic self-help shall not be permitted under this Agreement.
+This Agreement shall supersede and replace any license terms that you
+may have agreed to previously with respect to CISST.
+
+This Software License was derived, with permission, from the 3D Slicer
+Software License Agreement, Version 1.0 (December 20, 2005), created
+by The Brigham & Women's Hospital, Inc.
diff --git a/LICENSE.MPL2.txt b/LICENSES/MPL-2.0.txt
index d0a1fa14..d0a1fa14 100644
--- a/LICENSE.MPL2.txt
+++ b/LICENSES/MPL-2.0.txt
diff --git a/LICENSES/Unlicense.txt b/LICENSES/Unlicense.txt
new file mode 100644
index 00000000..cde4ac69
--- /dev/null
+++ b/LICENSES/Unlicense.txt
@@ -0,0 +1,10 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means.
+
+In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law.
+
+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 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.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/LibIcalConfig.cmake.in b/LibIcalConfig.cmake.in
index 9b7f7bb8..a307ee29 100644
--- a/LibIcalConfig.cmake.in
+++ b/LibIcalConfig.cmake.in
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Christophe Giboudeaux <cgiboudeaux@gmx.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
@PACKAGE_INIT@
set_and_check(LibIcal_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
diff --git a/ReadMe.txt b/README.md
index bcbc1654..ab0531c2 100644
--- a/ReadMe.txt
+++ b/README.md
@@ -1,21 +1,25 @@
-# <a name="title"></a> Libical [![Travis Build Status](https://travis-ci.org/libical/libical.svg?branch=master)](https://travis-ci.org/libical/libical) [![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/libical/libical?branch=master?svg=true)](https://ci.appveyor.com/api/projects/status/github/libical/libical) [![Coverity Scan Build Status](https://scan.coverity.com/projects/2367/badge.svg)](https://scan.coverity.com/projects/2367) [![Packaging status](https://repology.org/badge/tiny-repos/libical.svg)](https://repology.org/metapackage/libical)
+# Libical — an implementation of iCalendar protocols and data formats
-## Introduction
+[![Appveyor status](https://ci.appveyor.com/api/projects/status/github/libical/libical?branch=master?svg=true)](https://ci.appveyor.com/api/projects/status/github/libical/libical)
+[![Packaging status](https://repology.org/badge/tiny-repos/libical.svg)](https://repology.org/metapackage/libical)
+
+## About
Libical — an implementation of iCalendar protocols and data formats
Most of the code in here was written by Eric Busboom at the end
of the last millennium with help from dozens of contributors.
It is currently maintained by Allen Winter and the libical team
-at https://github.com/libical/libical.
+at <https://github.com/libical/libical>.
Libical is an Open Source implementation of the iCalendar protocols
and protocol data units. The iCalendar specification describes how
calendar clients can communicate with calendar servers so users can
store their calendar data and arrange meetings with other users.
-Libical implements [RFC5545][], [RFC5546][], [RFC7529][]; the
-CalDav scheduling extensions in [RFC6638][]; iCalendar extensions in [RFC7986][];
+Libical implements [RFC5545][], [RFC5546][], [RFC7529][];
+the CalDav scheduling extensions in [RFC6638][];
+iCalendar extensions in [RFC7986][], [RFC9073][], [RFC9074][];
plus the iCalendar iMIP protocol in [RFC6047][].
[RFC5545]: https://tools.ietf.org/html/rfc5545
@@ -24,11 +28,8 @@ plus the iCalendar iMIP protocol in [RFC6047][].
[RFC6638]: https://tools.ietf.org/html/rfc6638
[RFC6047]: https://tools.ietf.org/html/rfc6047
[RFC7986]: https://tools.ietf.org/html/rfc7986
-
-The libical-glib API is currently unstable and can change with any release.
-Until it is considered stable, there should be defined LIBICAL_GLIB_UNSTABLE_API=1
-before including <libical-glib/libical-glib.h>, to indicate that the library user
-is aware of it and is prepared to change the calls anytime.
+[RFC9073]: https://tools.ietf.org/html/rfc9073
+[RFC9074]: https://tools.ietf.org/html/rfc9074
## License
@@ -42,8 +43,8 @@ for a copy of this license.
This dual license ensures that the library can be incorporated into
both proprietary code and GPL'd programs, and will benefit from improvements
-made by programmers in both realms. I will only accept changes into
-my version of the library if they are similarly dual-licensed.
+made by programmers in both realms. We (the libical developers) will only
+accept changes to this library if they are similarly dual-licensed.
## Building
@@ -51,12 +52,15 @@ See the top-level [Install.txt](Install.txt) file.
## Documentation
-There is rudimentary, unfinished documentation in the `doc/` directory,
-see [UsingLibical.md](doc/UsingLibical.md)
+Documentation is hosted at <https://libical.github.io/libical/apidocs/>.
+
+For a conceptual overview of the library, see [UsingLibical.md](@ref UsingLibical).
+There is other rudimentary, unfinished documentation in the `doc/` directory of
+the source distribution,
and annotated examples in `examples/` and the test code in `src/test/`.
Additionally, progress is underway to add API documentation,
-which is available [here](https://libical.github.io/libical/apidocs/index.html)
+which is available at the apidocs site.
## Acknowledgments
@@ -73,18 +77,16 @@ In no particular order:
* [Cyrus Email/Calendars/Contacts Server](https://www.cyrusimap.org)
* [syncEvolution](https://syncevolution.org)
* [Fantastical](https://flexibits.com/fantastical)
-
* GNOME's EDS (evolution-data-server) which serves data to:
* [Evolution](https://wiki.gnome.org/Apps/Evolution)
* [GNOME Calendar](https://wiki.gnome.org/Apps/Calendar)
* [GNOME Notes](https://wiki.gnome.org/Apps/Notes)
* [GNOME Todo](https://wiki.gnome.org/Apps/Todo)
* and more GNOME apps...
-
- * KDE's [Kontact Suite](https://kontact.kde.org)
- * [Akonadi framework](https://kontact.kde.org/components/akonadi.html)
- * [KOrganizer calendar and scheduling component](https://kontact.kde.org/components/korganizer.html)
- * and more KDE apps...
+* KDE's [Kontact Suite](https://kontact.kde.org) including:
+ * [Akonadi framework](https://kontact.kde.org/components/akonadi.html)
+ * [KOrganizer calendar and scheduling component](https://kontact.kde.org/components/korganizer.html)
+ * and more KDE apps...
## Get Involved
diff --git a/ReadMe.md b/ReadMe.md
deleted file mode 120000
index 3cefeef2..00000000
--- a/ReadMe.md
+++ /dev/null
@@ -1 +0,0 @@
-ReadMe.txt \ No newline at end of file
diff --git a/ReleaseNotes.txt b/ReleaseNotes.txt
index 8a28ee63..898fac72 100644
--- a/ReleaseNotes.txt
+++ b/ReleaseNotes.txt
@@ -3,46 +3,90 @@ Release Highlights
Version 3.1.0 (NOT RELEASED YET):
--------------------------------
- * MSVC 2013 or higher (when building on Windows with MSVC)
+ * REUSE compliant licensing
+ * Requires MSVC 2013 or higher (when building on Windows with MSVC)
* Requires CMake v3.11.0 or higher
- * libical-glib now requires glib 2.38 or higher
- * Improved FindICU (from the official CMake)
+ * For the C++ bindings, requires a C++11 compliant compiler
+ * New CMake option "LIBICAL_ENABLE_64BIT_ICALTIME_T" to use 64-bit time_t implementations
+ on 32-bit systems (where available and supported. Windows-only so far)
+ * libical-glib requires glib 2.38 or higher
+ * libical-glib requires a C11 compliant compiler
+ * draft-ietf-calext-eventpub-extensions-19 (RFC 9073) support added
+ * draft-ietf-calext-valarm-extensions-07 (RFC 9074) support added
+ * libical-glib API is considered stable; no longer need to define LIBICAL_GLIB_UNSTABLE_API=1
+ before including <libical-glib/libical-glib.h>
* Allow previous recurrence iteration
+ * Improved performance of recurrence iterators
+ * GEO property has arbitrary precision (values are internally stored as strings, not doubles)
* All ical*_new_clone() functions have been deprecated in favour of ical*_clone()
- * New publicly available functions:
- + icalrecurrencetype_encode_day
- + icalrecurrencetype_encode_month
- + icaltzutil_set_zone_directory
- + icalcomponent_clone
- + icalproperty_clone
- + icalparameter_clone
- + icalvalue_clone
- + icalcluster_clone
- + icalrecur_iterator_prev
- + icalcomponent_set_x_name
- + icalcomponent_get_x_name
- + icalcomponent_get_component_name
- + icalcomponent_get_component_name_r
- * ical_set_invalid_rrule_handling_setting
- * ical_get_invalid_rrule_handling_setting
+ * Added support for Event Publishing (RFC 9073) and VALARM (RFC 9074) Extensions
* icaltzutil_get_zone_directory() can use the TZDIR environment to find system zoneinfo
+ * New publicly available functions:
+ + icalrecurrencetype_encode_day
+ + icalrecurrencetype_encode_month
+ + icaltzutil_set_zone_directory
+ + icalcomponent_clone
+ + icalproperty_clone
+ + icalparameter_clone
+ + icalvalue_clone
+ + icalcluster_clone
+ + icalrecur_iterator_prev
+ + icalcomponent_set_x_name
+ + icalcomponent_get_x_name
+ + icalcomponent_get_component_name
+ + icalcomponent_get_component_name_r
+ + ical_set_invalid_rrule_handling_setting
+ + ical_get_invalid_rrule_handling_setting
* Deprecated functions:
- + caldat (replaced by internal function icaldat_int())
- + juldat (replaced by internal function juldat_int())
- + icalcomponent_new_clone
- + icalproperty_new_clone
- + icalparameter_new_clone
- + icalvalue_new_clone
- + icalcluster_new_clone
+ + caldat (replaced by internal function icaldat_int())
+ + juldat (replaced by internal function juldat_int())
+ + icalcomponent_new_clone
+ + icalproperty_new_clone
+ + icalparameter_new_clone
+ + icalvalue_new_clone
+ + icalcluster_new_clone
+ * No longer publicly available functions:
+ + icaltzutil_fetch_timezone
* Removed unused declarations:
- (were in the public headers but not used at all)
- + struct icaltimezonetype
- + struct icaltimezonephase
- * Improved performance of recurrence iterators
+ (were in the public headers but not used at all)
+ + struct icaltimezonetype
+ + struct icaltimezonephase
-Version 3.0.11 (UNRELEASED):
+Version 3.0.15 (UNRELEASED):
----------------------------
+ * Add missing property parameters into libical-glib
+ * Fix CMake option USE_32BIT_TIME_T actually uses a 32-bit time_t value
+
+Version 3.0.14 (05 February 2022):
+----------------------------------
+ * icalvalue: Reset non-UTC icaltimetype::zone on set
+ * Fix icalcomponent_set_due not removing TZID when necessary
+
+Version 3.0.13 (17 January 2022):
+---------------------------------
+ * icalcomponent_get_dtend() return icaltime_null_time(), unless called on VEVENT, VAVAILABILITY or VFREEBUSY
+ * icalcomponent_get_duration() for VTODO calculate with DUE instead of DTEND
+ * Replace CMake FindBDB with FindBerleyDB (https://github.com/sum01/FindBerkeleyDB)
+ * Fix finding ICU and BerkeleyDB on Mac (look for homebrew installs first)
+
+Version 3.0.12 (08 December 2021):
+----------------------------------
+ * Fix a libicalval crash in cleanVObject
+ * METHOD:DECLINECOUNTER must have DTEND or DURATION
+ * Handle if DTEND and DURATION are both missing
+ * Improved FindICU (copied from official CMake. see files in cmake/Kitware)
+ * Buildsystem fixes (especially for the Ninja generator)
+ * Built-in timezones updated to tzdata2021e
+
+Version 3.0.11 (09 October 2021):
+---------------------------------
* Fix icalrecur_iterator_set_start() for hourly, minutely, and secondly recurrences
+ * Fix build for Berkeley DB version greater than 5
+ * Fix vcal for some architectures (like aarch64, ppc64le and s390x)
+ * Fix memory leaks in vcal
+ * Prevent crash when looking for tzid in initialize_rscale
+ * Adjust libdir and includedir in generated pkgconfig files
+ * Built-in timezones updated to tzdata2021c
Version 3.0.10 (17 April 2021):
-------------------------------
diff --git a/appveyor.yml b/appveyor.yml
index d32c2bc2..5264c1b7 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -19,7 +19,10 @@ skip_tags: false
# Build worker image
image:
- - Visual Studio 2013
+ #- Visual Studio 2013 #disable since Ninja is not available
+ - Ubuntu
+ - Visual Studio 2019
+ - macos
# scripts that are called at very beginning, before repo cloning
init:
@@ -31,21 +34,29 @@ init:
# build platform, i.e. x86, x64, Any CPU. This setting is optional.
platform:
-# - x86 uses 32bit time_t
+ - x86
- x64
# build Configuration, i.e. Debug, Release, etc.
configuration:
- - 2013
-# - 2012
-# - MinGW
+ - Release
+ - Debug
+
+install:
+ - sh: if [ "`uname -s`" = "Darwin" ]; then export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig; export XML_CATALOG_FILES=/usr/local/etc/xml/catalog; rm -f /usr/local/include/X11; brew install pkg-config ninja gtk-doc glib libxml2 icu4c berkeley-db; else sudo apt-get -y install gtk-doc-tools xml-core libdb-dev gobject-introspection libgirepository1.0-dev valac; fi
+
+before_build:
+ - cmd: call scripts\set_compiler_env.bat
build_script:
- - call scripts\set_compiler_env.bat
- mkdir build
- cd build
- - if "%configuration%" EQU "MinGW" ( cmake -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DICAL_GLIB=False .. ) else ( cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DICAL_GLIB=False .. )
- - nmake
+ - cmd: cmake --warn-uninitialized -Werror=dev -G Ninja -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DLIBICAL_BUILD_TESTING=True -DENABLE_GTK_DOC=True -DICAL_GLIB=False ..
+ - sh: if [ "`uname -s`" = "Darwin" ]; then BUILD_EXTRAS="False"; else BUILD_EXTRAS="True"; fi; cmake --warn-uninitialized -Werror=dev -G Ninja -DCMAKE_BUILD_TYPE=$CONFIGURATION -DLIBICAL_BUILD_TESTING=True -DENABLE_GTK_DOC=True -DICAL_GLIB=True -DGOBJECT_INTROSPECTION=$BUILD_EXTRAS -DICAL_GLIB_VAPI=$BUILD_EXTRAS ..
+ - cmake --build .
+ - cmd: cmake --build . --target install
+ - sh: sudo cmake --build . --target install
+ - ctest --test-dir .
# to disable automatic builds
#build: off
@@ -54,12 +65,8 @@ build_script:
# tests configuration #
#---------------------------------#
-test_script:
- - nmake test
-
# to disable automatic tests
-#test: off
-
+test: off
#---------------------------------#
# deployment configuration #
@@ -74,5 +81,6 @@ notifications:
# Email
- provider: Email
to:
- - allen.winter@kdab.com
- on_build_status_changed: true
+ - winter@kde.org
+ on_build_success: false
+ on_build_failure: true
diff --git a/cmake/Toolchain-Linux-GCC-i686.cmake b/cmake/Toolchain-Linux-GCC-i686.cmake
index 4fe6d1c0..8bf12272 100644
--- a/cmake/Toolchain-Linux-GCC-i686.cmake
+++ b/cmake/Toolchain-Linux-GCC-i686.cmake
@@ -1,34 +1,11 @@
# Toolchain file for 32bit builds on 64bit Linux hosts
#
-# Copyright (c) 2013-2016 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Volker Krause <volker.krause@kdab.com>
# Author: Filipe Azevedo <filipe.azevedo@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "i686")
diff --git a/cmake/Toolchain-OSX-GCC-i686.cmake b/cmake/Toolchain-OSX-GCC-i686.cmake
index 42644b01..d76b27af 100644
--- a/cmake/Toolchain-OSX-GCC-i686.cmake
+++ b/cmake/Toolchain-OSX-GCC-i686.cmake
@@ -1,34 +1,11 @@
# Toolchain file for 32bit builds on 64bit OSX hosts
#
-# Copyright (c) 2013-2016 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Volker Krause <volker.krause@kdab.com>
# Author: Filipe Azevedo <filipe.azevedo@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
set(CMAKE_SYSTEM_NAME "Darwin")
set(CMAKE_SYSTEM_PROCESSOR "i686")
diff --git a/cmake/Toolchain-QNX66.cmake b/cmake/Toolchain-QNX-common.cmake
index dafeb610..fa6899a3 100644
--- a/cmake/Toolchain-QNX66.cmake
+++ b/cmake/Toolchain-QNX-common.cmake
@@ -1,18 +1,18 @@
#
-# (C) Copyright 2009 Johns Hopkins University (JHU), All Rights
-# Reserved.
-#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2012-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
# --- begin cisst license - do not edit ---
#
-# This software is provided "as is" under an open source license, with
-# no warranty. The complete license can be found in license.txt and
-# https://www.cisst.org/cisst/license.txt.
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
#
# --- end cisst license ---
SET(CMAKE_SYSTEM_NAME QNX)
-SET(CMAKE_SYSTEM_VERSION 6.6.0)
-SET(CMAKE_SYSTEM_PROCESSOR armv7)
+SET(CMAKE_SYSTEM_VERSION ${QNX_VERSION})
+SET(CMAKE_SYSTEM_PROCESSOR ${QNX_PROCESSOR})
SET(TOOLCHAIN QNX)
#SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
@@ -28,14 +28,14 @@ ENDIF(CMAKE_HOST_WIN32)
FIND_PATH(QNX_HOST
NAME usr/bin/qcc${HOST_EXECUTABLE_SUFFIX}
- PATHS $ENV{QNX_HOST} C:/qnx660/host/win32/x86
+ PATHS $ENV{QNX_HOST} ${QNX_HOST_HINT}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
)
FIND_PATH(QNX_TARGET
NAME usr/include/qconfig.mk
- PATHS $ENV{QNX_TARGET} C:/qnx660/target/qnx6
+ PATHS $ENV{QNX_TARGET} ${QNX_TARGET_HINT}
NO_CMAKE_PATH
NO_CMAKE_ENVIRONMENT_PATH
)
@@ -58,7 +58,9 @@ IF(CMAKE_HOST_WIN32)
SET(ENV{PATH} "$ENV{PATH};${QNX_HOST}/usr/bin")
ENDIF(CMAKE_HOST_WIN32)
-SET(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Make Program")
+if(CMAKE_GENERATOR MATCHES "Makefiles")
+ SET(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Make Program")
+endif()
SET(CMAKE_SH "${QNX_HOST}/usr/bin/sh${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX shell Program")
SET(CMAKE_AR "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ar${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ar Program")
SET(CMAKE_RANLIB "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ranlib${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ranlib Program")
@@ -80,10 +82,8 @@ SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
-SET(CMAKE_FIND_ROOT_PATH ${QNX_TARGET})
+LIST(APPEND CMAKE_FIND_ROOT_PATH ${QNX_TARGET})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
-
-SET(CMAKE_C_FLAGS "-Vgcc_ntoarmv7le" CACHE STRING "qcc c flags" FORCE)
-SET(CMAKE_CXX_FLAGS "-Vgcc_ntoarmv7le -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
diff --git a/cmake/Toolchain-QNX65.cmake b/cmake/Toolchain-QNX650-armv7.cmake
index 2c5772e4..4ba1dc89 100644
--- a/cmake/Toolchain-QNX65.cmake
+++ b/cmake/Toolchain-QNX650-armv7.cmake
@@ -1,18 +1,17 @@
#
-# (C) Copyright 2009 Johns Hopkins University (JHU), All Rights
-# Reserved.
-#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-License-Identifier: LicenseRef-CISST
+
# --- begin cisst license - do not edit ---
#
-# This software is provided "as is" under an open source license, with
-# no warranty. The complete license can be found in license.txt and
-# https://www.cisst.org/cisst/license.txt.
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
#
# --- end cisst license ---
SET(CMAKE_SYSTEM_NAME QNX)
SET(CMAKE_SYSTEM_VERSION 6.5.0)
-SET(CMAKE_SYSTEM_PROCESSOR x86)
+SET(CMAKE_SYSTEM_PROCESSOR armv7)
SET(TOOLCHAIN QNX)
#SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
@@ -67,22 +66,23 @@ SET(CMAKE_OBJDUMP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objdump
SET(CMAKE_LINKER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ld" CACHE PATH "QNX Linker Program")
SET(CMAKE_STRIP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-strip${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Strip Program")
-SET(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/qcc)
+SET(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/qcc${HOST_EXECUTABLE_SUFFIX})
SET(CMAKE_C_FLAGS_DEBUG "-g")
SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
-SET(CMAKE_CXX_COMPILER ${QNX_HOST}/usr/bin/qcc)
+SET(CMAKE_CXX_COMPILER ${QNX_HOST}/usr/bin/qcc${HOST_EXECUTABLE_SUFFIX})
SET(CMAKE_CXX_FLAGS_DEBUG "-g")
SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
SET(CMAKE_FIND_ROOT_PATH ${QNX_TARGET})
-SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
-SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(CMAKE_C_FLAGS "-Vgcc_ntoarmv7le" CACHE STRING "qcc c flags" FORCE)
SET(CMAKE_CXX_FLAGS "-Vgcc_ntoarmv7le -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
diff --git a/cmake/Toolchain-QNX650-x86.cmake b/cmake/Toolchain-QNX650-x86.cmake
new file mode 100644
index 00000000..550abd47
--- /dev/null
+++ b/cmake/Toolchain-QNX650-x86.cmake
@@ -0,0 +1,88 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+SET(CMAKE_SYSTEM_NAME QNX)
+SET(CMAKE_SYSTEM_VERSION 6.5.0)
+SET(CMAKE_SYSTEM_PROCESSOR x86)
+SET(TOOLCHAIN QNX)
+
+#SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
+
+SET(CMAKE_SHARED_LIBRARY_PREFIX "lib")
+SET(CMAKE_SHARED_LIBRARY_SUFFIX ".so")
+SET(CMAKE_STATIC_LIBRARY_PREFIX "lib")
+SET(CMAKE_STATIC_LIBRARY_SUFFIX ".a")
+
+IF(CMAKE_HOST_WIN32)
+ SET(HOST_EXECUTABLE_SUFFIX ".exe")
+ENDIF(CMAKE_HOST_WIN32)
+
+FIND_PATH(QNX_HOST
+ NAME usr/bin/qcc${HOST_EXECUTABLE_SUFFIX}
+ PATHS $ENV{QNX_HOST} C:/QNX650/host/win32/x86
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+)
+
+FIND_PATH(QNX_TARGET
+ NAME usr/include/qnx_errno.h
+ PATHS $ENV{QNX_TARGET} C:/QNX650/target/qnx6
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+)
+
+IF(CMAKE_HOST_WIN32)
+ FIND_PATH(QNX_CONFIGURATION
+ NAME bin/qnxactivate.exe
+ PATHS $ENV{QNX_CONFIGURATION}
+ "C:/Program Files/QNX Software Systems/qconfig"
+ NO_CMAKE_PATH
+ NO_CMAKE_ENVIRONMENT_PATH
+ )
+ENDIF(CMAKE_HOST_WIN32)
+
+SET(ENV{QNX_HOST} ${QNX_HOST})
+SET(ENV{QNX_TARGET} ${QNX_TARGET})
+IF(CMAKE_HOST_WIN32)
+ SET(ENV{QNX_CONFIGURATION} ${QNX_CONFIGURATION})
+ SET(ENV{PATH} "$ENV{PATH};${QNX_HOST}/usr/bin")
+ENDIF(CMAKE_HOST_WIN32)
+
+SET(CMAKE_MAKE_PROGRAM "${QNX_HOST}/usr/bin/make${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Make Program")
+SET(CMAKE_SH "${QNX_HOST}/usr/bin/sh${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX shell Program")
+SET(CMAKE_AR "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ar${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ar Program")
+SET(CMAKE_RANLIB "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ranlib${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX ranlib Program")
+SET(CMAKE_NM "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-nm${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX nm Program")
+SET(CMAKE_OBJCOPY "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objcopy${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objcopy Program")
+SET(CMAKE_OBJDUMP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-objdump${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX objdump Program")
+SET(CMAKE_LINKER "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-ld" CACHE PATH "QNX Linker Program")
+SET(CMAKE_STRIP "${QNX_HOST}/usr/bin/nto${CMAKE_SYSTEM_PROCESSOR}-strip${HOST_EXECUTABLE_SUFFIX}" CACHE PATH "QNX Strip Program")
+
+SET(CMAKE_C_COMPILER ${QNX_HOST}/usr/bin/qcc${HOST_EXECUTABLE_SUFFIX})
+SET(CMAKE_C_FLAGS_DEBUG "-g")
+SET(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
+SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
+SET(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
+
+SET(CMAKE_CXX_COMPILER ${QNX_HOST}/usr/bin/qcc${HOST_EXECUTABLE_SUFFIX})
+SET(CMAKE_CXX_FLAGS_DEBUG "-g")
+SET(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
+SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
+
+SET(CMAKE_FIND_ROOT_PATH ${QNX_TARGET})
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
+
+SET(CMAKE_C_FLAGS "-Vgcc_ntox86" CACHE STRING "qcc c flags" FORCE)
+SET(CMAKE_CXX_FLAGS "-Vgcc_ntox86 -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
diff --git a/cmake/Toolchain-QNX660-armv7.cmake b/cmake/Toolchain-QNX660-armv7.cmake
new file mode 100644
index 00000000..690448be
--- /dev/null
+++ b/cmake/Toolchain-QNX660-armv7.cmake
@@ -0,0 +1,21 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 6.6.0)
+set(QNX_PROCESSOR armv7)
+
+set(QNX_HOST_HINT "C:/qnx660/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx660/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntoarmv7le" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntoarmv7le -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX660-common.cmake")
diff --git a/cmake/Toolchain-QNX660-common.cmake b/cmake/Toolchain-QNX660-common.cmake
new file mode 100644
index 00000000..2ef67777
--- /dev/null
+++ b/cmake/Toolchain-QNX660-common.cmake
@@ -0,0 +1,23 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX-common.cmake")
+
+# QNX 6.6.0 ships with a QCC 4.7.3 (based on the same GCC version)
+#
+# HACK: CMake does not support getting compile features from QCC
+# work-around by telling CMake the available compile features manually
+
+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
diff --git a/cmake/Toolchain-QNX660-x86.cmake b/cmake/Toolchain-QNX660-x86.cmake
new file mode 100644
index 00000000..05385213
--- /dev/null
+++ b/cmake/Toolchain-QNX660-x86.cmake
@@ -0,0 +1,21 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 6.6.0)
+set(QNX_PROCESSOR x86)
+
+set(QNX_HOST_HINT "C:/qnx660/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx660/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntox86" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntox86 -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX660-common.cmake")
diff --git a/cmake/Toolchain-QNX700-aarch64.cmake b/cmake/Toolchain-QNX700-aarch64.cmake
new file mode 100644
index 00000000..26137535
--- /dev/null
+++ b/cmake/Toolchain-QNX700-aarch64.cmake
@@ -0,0 +1,22 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2018-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 7.0.0)
+set(QNX_PROCESSOR aarch64)
+
+set(QNX_HOST_HINT "C:/qnx700/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx700/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntoaarch64le" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntoaarch64le -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX700-common.cmake")
diff --git a/cmake/Toolchain-QNX700-armv7.cmake b/cmake/Toolchain-QNX700-armv7.cmake
new file mode 100644
index 00000000..37557f03
--- /dev/null
+++ b/cmake/Toolchain-QNX700-armv7.cmake
@@ -0,0 +1,22 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2018-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 7.0.0)
+set(QNX_PROCESSOR armv7)
+
+set(QNX_HOST_HINT "C:/qnx700/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx700/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntoarmv7le" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntoarmv7le -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX700-common.cmake")
diff --git a/cmake/Toolchain-QNX700-common.cmake b/cmake/Toolchain-QNX700-common.cmake
new file mode 100644
index 00000000..a94f7655
--- /dev/null
+++ b/cmake/Toolchain-QNX700-common.cmake
@@ -0,0 +1,27 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2018-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX-common.cmake")
+
+# QNX 7.0.0 ships with a QCC 5.4.0 (based on the same GCC version)
+#
+# HACK: CMake does not support getting compile features from QCC
+# work-around by telling CMake the available compile features manually
+
+# Easy to figure out by forcing GCC onto CMake, e.g. via -DCMAKE_CXX_COMPILER=/opt/qnx700/host/linux/x86_64/usr/bin/arm-unknown-nto-qnx7.0.0eabi-gcc
+# Then read out ./CMakeFiles/*/CMakeCXXCompiler.cmake
+
+set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17")
+set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters")
+set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates")
+set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates")
+set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17")
diff --git a/cmake/Toolchain-QNX700-x86.cmake b/cmake/Toolchain-QNX700-x86.cmake
new file mode 100644
index 00000000..c674da95
--- /dev/null
+++ b/cmake/Toolchain-QNX700-x86.cmake
@@ -0,0 +1,22 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2018-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 7.0.0)
+set(QNX_PROCESSOR x86)
+
+set(QNX_HOST_HINT "C:/qnx700/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx700/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntox86" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntox86 -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX700-common.cmake")
diff --git a/cmake/Toolchain-QNX700-x86_64.cmake b/cmake/Toolchain-QNX700-x86_64.cmake
new file mode 100644
index 00000000..3b0e7bc6
--- /dev/null
+++ b/cmake/Toolchain-QNX700-x86_64.cmake
@@ -0,0 +1,22 @@
+#
+# SPDX-FileCopyrightText: 2009 Johns Hopkins University (JHU), All Rights Reserved.
+# SPDX-FileCopyrightText: 2018-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# SPDX-License-Identifier: LicenseRef-CISST
+
+# --- begin cisst license - do not edit ---
+#
+# This software is provided "as is" under an open source license, with no warranty.
+# The complete license can be found in LICENSES/LicenseRef-CISST.txt.
+#
+# --- end cisst license ---
+
+set(QNX_VERSION 7.0.0)
+set(QNX_PROCESSOR x86_64)
+
+set(QNX_HOST_HINT "C:/qnx700/host/win32/x86")
+set(QNX_TARGET_HINT "C:/qnx700/target/qnx6")
+
+set(CMAKE_C_FLAGS "-Vgcc_ntox86_64" CACHE STRING "qcc c flags" FORCE)
+set(CMAKE_CXX_FLAGS "-Vgcc_ntox86_64 -lang-c++" CACHE STRING "qcc cxx flags" FORCE)
+
+include("${CMAKE_CURRENT_LIST_DIR}/Toolchain-QNX700-common.cmake")
diff --git a/cmake/Toolchain-RPI.cmake b/cmake/Toolchain-RPI.cmake
index 923fe58e..5c94d6a6 100644
--- a/cmake/Toolchain-RPI.cmake
+++ b/cmake/Toolchain-RPI.cmake
@@ -2,33 +2,10 @@
# Assumptions: toolchain is in path, $SYSROOT points to the sysroot
#
-# Copyright (c) 2013-2016 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Volker Krause <volker.krause@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "armv6l")
@@ -41,5 +18,6 @@ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --sysroot=$ENV{SYSRO
set(CMAKE_FIND_ROOT_PATH "$ENV{SYSROOT}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/Toolchain-Yocto.cmake b/cmake/Toolchain-Yocto.cmake
new file mode 100644
index 00000000..bc09bd77
--- /dev/null
+++ b/cmake/Toolchain-Yocto.cmake
@@ -0,0 +1,30 @@
+# Basic cmake toolchain file for Qt for Yocto Environment
+# Assumptions: toolchain script is sourced
+#
+
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# Author: Christoph Sterz <christoph.sterz@kdab.com>
+
+# SPDX-License-Identifier: BSD-3-Clause
+
+set(CMAKE_SYSTEM_NAME "Linux")
+
+if(DEFINED ENV{ARCH})
+ #$ARCH is set through the yocto environment script, use this
+ set(CMAKE_SYSTEM_PROCESSOR "$ENV{ARCH}")
+elseif(DEFINED ENV{CC})
+ #No $ARCH found, trying to deduce processor from -march=<name> flag in CC
+ string(REGEX MATCH "-march=([^\ ]+)" DUMMY "$ENV{CC}")
+ set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_MATCH_1})
+else()
+ message(FATAL_ERROR "Could not find processor architecture (no ARCH or CC found in environment).")
+endif()
+
+set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS "$ENV{OE_QMAKE_PATH_HOST_BINS}")
+set(CMAKE_FIND_ROOT_PATH "$ENV{SDKTARGETSYSROOT}")
+set(CMAKE_SYSROOT "$ENV{SDKTARGETSYSROOT}")
+
+set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
+set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/Toolchain-android.cmake b/cmake/Toolchain-android.cmake
deleted file mode 100644
index 08c46389..00000000
--- a/cmake/Toolchain-android.cmake
+++ /dev/null
@@ -1,1688 +0,0 @@
-# Copyright (c) 2010-2011, Ethan Rublee
-# Copyright (c) 2011-2014, Andrey Kamaev
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are met:
-#
-# 1. Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimer.
-#
-# 2. 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.
-#
-# 3. Neither the name of the copyright holder 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 HOLDER 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.
-
-# ------------------------------------------------------------------------------
-# Android CMake toolchain file, for use with the Android NDK r5-r10d
-# Requires cmake 2.6.3 or newer (2.8.9 or newer is recommended).
-# See home page: https://github.com/taka-no-me/android-cmake
-#
-# Usage Linux:
-# $ export ANDROID_NDK=/absolute/path/to/the/android-ndk
-# $ mkdir build && cd build
-# $ cmake -DCMAKE_TOOLCHAIN_FILE=path/to/the/android.toolchain.cmake ..
-# $ make -j8
-#
-# Usage Windows:
-# You need native port of make to build your project.
-# Android NDK r7 (and newer) already has make.exe on board.
-# For older NDK you have to install it separately.
-# For example, this one: http://gnuwin32.sourceforge.net/packages/make.htm
-#
-# $ SET ANDROID_NDK=C:\absolute\path\to\the\android-ndk
-# $ mkdir build && cd build
-# $ cmake.exe -G"MinGW Makefiles"
-# -DCMAKE_TOOLCHAIN_FILE=path\to\the\android.toolchain.cmake
-# -DCMAKE_MAKE_PROGRAM="%ANDROID_NDK%\prebuilt\windows\bin\make.exe" ..
-# $ cmake.exe --build .
-#
-#
-# Options (can be set as cmake parameters: -D<option_name>=<value>):
-# ANDROID_NDK=/opt/android-ndk - path to the NDK root.
-# Can be set as environment variable. Can be set only at first cmake run.
-#
-# ANDROID_ABI=armeabi-v7a - specifies the target Application Binary
-# Interface (ABI). This option nearly matches to the APP_ABI variable
-# used by ndk-build tool from Android NDK.
-#
-# Possible targets are:
-# "armeabi" - ARMv5TE based CPU with software floating point operations
-# "armeabi-v7a" - ARMv7 based devices with hardware FPU instructions
-# this ABI target is used by default
-# "armeabi-v7a with NEON" - same as armeabi-v7a, but
-# sets NEON as floating-point unit
-# "armeabi-v7a with VFPV3" - same as armeabi-v7a, but
-# sets VFPV3 as floating-point unit (has 32 registers instead of 16)
-# "armeabi-v6 with VFP" - tuned for ARMv6 processors having VFP
-# "x86" - IA-32 instruction set
-# "mips" - MIPS32 instruction set
-#
-# 64-bit ABIs for NDK r10 and newer:
-# "arm64-v8a" - ARMv8 AArch64 instruction set
-# "x86_64" - Intel64 instruction set (r1)
-# "mips64" - MIPS64 instruction set (r6)
-#
-# ANDROID_NATIVE_API_LEVEL=android-8 - level of Android API compile for.
-# Option is read-only when standalone toolchain is used.
-# Note: building for "android-L" requires explicit configuration.
-#
-# ANDROID_TOOLCHAIN_NAME=arm-linux-androideabi-4.9 - the name of compiler
-# toolchain to be used. The list of possible values depends on the NDK
-# version. For NDK r10c the possible values are:
-#
-# * aarch64-linux-android-4.9
-# * aarch64-linux-android-clang3.4
-# * aarch64-linux-android-clang3.5
-# * arm-linux-androideabi-4.6
-# * arm-linux-androideabi-4.8
-# * arm-linux-androideabi-4.9 (default)
-# * arm-linux-androideabi-clang3.4
-# * arm-linux-androideabi-clang3.5
-# * mips64el-linux-android-4.9
-# * mips64el-linux-android-clang3.4
-# * mips64el-linux-android-clang3.5
-# * mipsel-linux-android-4.6
-# * mipsel-linux-android-4.8
-# * mipsel-linux-android-4.9
-# * mipsel-linux-android-clang3.4
-# * mipsel-linux-android-clang3.5
-# * x86-4.6
-# * x86-4.8
-# * x86-4.9
-# * x86-clang3.4
-# * x86-clang3.5
-# * x86_64-4.9
-# * x86_64-clang3.4
-# * x86_64-clang3.5
-#
-# ANDROID_FORCE_ARM_BUILD=OFF - set ON to generate 32-bit ARM instructions
-# instead of Thumb. Is not available for "armeabi-v6 with VFP"
-# (is forced to be ON) ABI.
-#
-# ANDROID_NO_UNDEFINED=ON - set ON to show all undefined symbols as linker
-# errors even if they are not used.
-#
-# ANDROID_SO_UNDEFINED=OFF - set ON to allow undefined symbols in shared
-# libraries. Automatically turned for NDK r5x and r6x due to GLESv2
-# problems.
-#
-# ANDROID_STL=gnustl_static - specify the runtime to use.
-#
-# Possible values are:
-# none -> Do not configure the runtime.
-# system -> Use the default minimal system C++ runtime library.
-# Implies -fno-rtti -fno-exceptions.
-# Is not available for standalone toolchain.
-# system_re -> Use the default minimal system C++ runtime library.
-# Implies -frtti -fexceptions.
-# Is not available for standalone toolchain.
-# gabi++_static -> Use the GAbi++ runtime as a static library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# gabi++_shared -> Use the GAbi++ runtime as a shared library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# stlport_static -> Use the STLport runtime as a static library.
-# Implies -fno-rtti -fno-exceptions for NDK before r7.
-# Implies -frtti -fno-exceptions for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# stlport_shared -> Use the STLport runtime as a shared library.
-# Implies -fno-rtti -fno-exceptions for NDK before r7.
-# Implies -frtti -fno-exceptions for NDK r7 and newer.
-# Is not available for standalone toolchain.
-# gnustl_static -> Use the GNU STL as a static library.
-# Implies -frtti -fexceptions.
-# gnustl_shared -> Use the GNU STL as a shared library.
-# Implies -frtti -fno-exceptions.
-# Available for NDK r7b and newer.
-# Silently degrades to gnustl_static if not available.
-#
-# ANDROID_STL_FORCE_FEATURES=ON - turn rtti and exceptions support based on
-# chosen runtime. If disabled, then the user is responsible for settings
-# these options.
-#
-# What?:
-# android-cmake toolchain searches for NDK/toolchain in the following order:
-# ANDROID_NDK - cmake parameter
-# ANDROID_NDK - environment variable
-# ANDROID_STANDALONE_TOOLCHAIN - cmake parameter
-# ANDROID_STANDALONE_TOOLCHAIN - environment variable
-# ANDROID_NDK - default locations
-# ANDROID_STANDALONE_TOOLCHAIN - default locations
-#
-# Make sure to do the following in your scripts:
-# SET( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${my_cxx_flags}" )
-# SET( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${my_cxx_flags}" )
-# The flags will be prepopulated with critical flags, so don't loose them.
-# Also be aware that toolchain also sets configuration-specific compiler
-# flags and linker flags.
-#
-# ANDROID and BUILD_ANDROID will be set to true, you may test any of these
-# variables to make necessary Android-specific configuration changes.
-#
-# Also ARMEABI or ARMEABI_V7A or X86 or MIPS or ARM64_V8A or X86_64 or MIPS64
-# will be set true, mutually exclusive. NEON option will be set true
-# if VFP is set to NEON.
-#
-# ------------------------------------------------------------------------------
-
-cmake_minimum_required( VERSION 2.6.3 )
-
-if( DEFINED CMAKE_CROSSCOMPILING )
- # subsequent toolchain loading is not really needed
- return()
-endif()
-
-if( CMAKE_TOOLCHAIN_FILE )
- # touch toolchain variable to suppress "unused variable" warning
-endif()
-
-# inherit settings in recursive loads
-get_property( _CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE )
-if( _CMAKE_IN_TRY_COMPILE )
- include( "${CMAKE_CURRENT_SOURCE_DIR}/../android.toolchain.config.cmake" OPTIONAL )
-endif()
-
-# this one is important
-if( CMAKE_VERSION VERSION_GREATER "3.0.99" )
- set( CMAKE_SYSTEM_NAME Android )
-else()
- set( CMAKE_SYSTEM_NAME Linux )
-endif()
-
-# this one not so much
-set( CMAKE_SYSTEM_VERSION 1 )
-
-# rpath makes low sense for Android
-set( CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "" )
-set( CMAKE_SKIP_RPATH TRUE CACHE BOOL "If set, runtime paths are not added when using shared libraries." )
-
-# NDK search paths
-set( ANDROID_SUPPORTED_NDK_VERSIONS ${ANDROID_EXTRA_NDK_VERSIONS} -r10d -r10c -r10b -r10 -r9d -r9c -r9b -r9 -r8e -r8d -r8c -r8b -r8 -r7c -r7b -r7 -r6b -r6 -r5c -r5b -r5 "" )
-if( NOT DEFINED ANDROID_NDK_SEARCH_PATHS )
- if( CMAKE_HOST_WIN32 )
- file( TO_CMAKE_PATH "$ENV{PROGRAMFILES}" ANDROID_NDK_SEARCH_PATHS )
- set( ANDROID_NDK_SEARCH_PATHS "${ANDROID_NDK_SEARCH_PATHS}" "$ENV{SystemDrive}/NVPACK" )
- else()
- file( TO_CMAKE_PATH "$ENV{HOME}" ANDROID_NDK_SEARCH_PATHS )
- set( ANDROID_NDK_SEARCH_PATHS /opt "${ANDROID_NDK_SEARCH_PATHS}/NVPACK" )
- endif()
-endif()
-if( NOT DEFINED ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
- set( ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH /opt/android-toolchain )
-endif()
-
-# known ABIs
-set( ANDROID_SUPPORTED_ABIS_arm "armeabi-v7a;armeabi;armeabi-v7a with NEON;armeabi-v7a with VFPV3;armeabi-v6 with VFP" )
-set( ANDROID_SUPPORTED_ABIS_arm64 "arm64-v8a" )
-set( ANDROID_SUPPORTED_ABIS_x86 "x86" )
-set( ANDROID_SUPPORTED_ABIS_x86_64 "x86_64" )
-set( ANDROID_SUPPORTED_ABIS_mips "mips" )
-set( ANDROID_SUPPORTED_ABIS_mips64 "mips64" )
-
-# API level defaults
-set( ANDROID_DEFAULT_NDK_API_LEVEL 8 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_arm64 21 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_x86 9 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_x86_64 21 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_mips 9 )
-set( ANDROID_DEFAULT_NDK_API_LEVEL_mips64 21 )
-
-
-macro( __LIST_FILTER listvar regex )
- if( ${listvar} )
- foreach( __val ${${listvar}} )
- if( __val MATCHES "${regex}" )
- list( REMOVE_ITEM ${listvar} "${__val}" )
- endif()
- endforeach()
- endif()
-endmacro()
-
-macro( __INIT_VARIABLE var_name )
- set( __test_path 0 )
- foreach( __var ${ARGN} )
- if( __var STREQUAL "PATH" )
- set( __test_path 1 )
- break()
- endif()
- endforeach()
-
- if( __test_path AND NOT EXISTS "${${var_name}}" )
- unset( ${var_name} CACHE )
- endif()
-
- if( " ${${var_name}}" STREQUAL " " )
- set( __values 0 )
- foreach( __var ${ARGN} )
- if( __var STREQUAL "VALUES" )
- set( __values 1 )
- elseif( NOT __var STREQUAL "PATH" )
- if( __var MATCHES "^ENV_.*$" )
- string( REPLACE "ENV_" "" __var "${__var}" )
- set( __value "$ENV{${__var}}" )
- elseif( DEFINED ${__var} )
- set( __value "${${__var}}" )
- elseif( __values )
- set( __value "${__var}" )
- else()
- set( __value "" )
- endif()
-
- if( NOT " ${__value}" STREQUAL " " AND (NOT __test_path OR EXISTS "${__value}") )
- set( ${var_name} "${__value}" )
- break()
- endif()
- endif()
- endforeach()
- unset( __value )
- unset( __values )
- endif()
-
- if( __test_path )
- file( TO_CMAKE_PATH "${${var_name}}" ${var_name} )
- endif()
- unset( __test_path )
-endmacro()
-
-macro( __DETECT_NATIVE_API_LEVEL _var _path )
- set( __ndkApiLevelRegex "^[\t ]*#define[\t ]+__ANDROID_API__[\t ]+([0-9]+)[\t ]*.*$" )
- file( STRINGS ${_path} __apiFileContent REGEX "${__ndkApiLevelRegex}" )
- if( NOT __apiFileContent )
- message( SEND_ERROR "Could not get Android native API level. Probably you have specified invalid level value, or your copy of NDK/toolchain is broken." )
- endif()
- string( REGEX REPLACE "${__ndkApiLevelRegex}" "\\1" ${_var} "${__apiFileContent}" )
- unset( __apiFileContent )
- unset( __ndkApiLevelRegex )
-endmacro()
-
-macro( __DETECT_TOOLCHAIN_MACHINE_NAME _var _root )
- if( EXISTS "${_root}" )
- file( GLOB __gccExePath RELATIVE "${_root}/bin/" "${_root}/bin/*-gcc${TOOL_OS_SUFFIX}" )
- __LIST_FILTER( __gccExePath "^[.].*" )
- list( LENGTH __gccExePath __gccExePathsCount )
- if( NOT __gccExePathsCount EQUAL 1 AND NOT _CMAKE_IN_TRY_COMPILE )
- message( WARNING "Could not determine machine name for compiler from ${_root}" )
- set( ${_var} "" )
- else()
- get_filename_component( __gccExeName "${__gccExePath}" NAME_WE )
- string( REPLACE "-gcc" "" ${_var} "${__gccExeName}" )
- endif()
- unset( __gccExePath )
- unset( __gccExePathsCount )
- unset( __gccExeName )
- else()
- set( ${_var} "" )
- endif()
-endmacro()
-
-
-# fight against cygwin
-set( ANDROID_FORBID_SYGWIN TRUE CACHE BOOL "Prevent cmake from working under cygwin and using cygwin tools")
-mark_as_advanced( ANDROID_FORBID_SYGWIN )
-if( ANDROID_FORBID_SYGWIN )
- if( CYGWIN )
- message( FATAL_ERROR "Android NDK and android-cmake toolchain are not welcome Cygwin. It is unlikely that this cmake toolchain will work under cygwin. But if you want to try then you can set cmake variable ANDROID_FORBID_SYGWIN to FALSE and rerun cmake." )
- endif()
-
- if( CMAKE_HOST_WIN32 )
- # remove cygwin from PATH
- set( __new_path "$ENV{PATH}")
- __LIST_FILTER( __new_path "cygwin" )
- set(ENV{PATH} "${__new_path}")
- unset(__new_path)
- endif()
-endif()
-
-
-# detect current host platform
-if( NOT DEFINED ANDROID_NDK_HOST_X64 AND (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "amd64|x86_64|AMD64" OR CMAKE_HOST_APPLE) )
- set( ANDROID_NDK_HOST_X64 1 CACHE BOOL "Try to use 64-bit compiler toolchain" )
- mark_as_advanced( ANDROID_NDK_HOST_X64 )
-endif()
-
-set( TOOL_OS_SUFFIX "" )
-if( CMAKE_HOST_APPLE )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "darwin-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "darwin-x86" )
-elseif( CMAKE_HOST_WIN32 )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "windows-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "windows" )
- set( TOOL_OS_SUFFIX ".exe" )
-elseif( CMAKE_HOST_UNIX )
- set( ANDROID_NDK_HOST_SYSTEM_NAME "linux-x86_64" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME2 "linux-x86" )
-else()
- message( FATAL_ERROR "Cross-compilation on your platform is not supported by this cmake toolchain" )
-endif()
-
-if( NOT ANDROID_NDK_HOST_X64 )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} )
-endif()
-
-# see if we have path to Android NDK
-if( NOT ANDROID_NDK AND NOT ANDROID_STANDALONE_TOOLCHAIN )
- __INIT_VARIABLE( ANDROID_NDK PATH ENV_ANDROID_NDK )
-endif()
-if( NOT ANDROID_NDK )
- # see if we have path to Android standalone toolchain
- __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ENV_ANDROID_STANDALONE_TOOLCHAIN )
-
- if( NOT ANDROID_STANDALONE_TOOLCHAIN )
- #try to find Android NDK in one of the default locations
- set( __ndkSearchPaths )
- foreach( __ndkSearchPath ${ANDROID_NDK_SEARCH_PATHS} )
- foreach( suffix ${ANDROID_SUPPORTED_NDK_VERSIONS} )
- list( APPEND __ndkSearchPaths "${__ndkSearchPath}/android-ndk${suffix}" )
- endforeach()
- endforeach()
- __INIT_VARIABLE( ANDROID_NDK PATH VALUES ${__ndkSearchPaths} )
- unset( __ndkSearchPaths )
-
- if( ANDROID_NDK )
- message( STATUS "Using default path for Android NDK: ${ANDROID_NDK}" )
- message( STATUS " If you prefer to use a different location, please define a cmake or environment variable: ANDROID_NDK" )
- else()
- #try to find Android standalone toolchain in one of the default locations
- __INIT_VARIABLE( ANDROID_STANDALONE_TOOLCHAIN PATH ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH )
-
- if( ANDROID_STANDALONE_TOOLCHAIN )
- message( STATUS "Using default path for standalone toolchain ${ANDROID_STANDALONE_TOOLCHAIN}" )
- message( STATUS " If you prefer to use a different location, please define the variable: ANDROID_STANDALONE_TOOLCHAIN" )
- endif( ANDROID_STANDALONE_TOOLCHAIN )
- endif( ANDROID_NDK )
- endif( NOT ANDROID_STANDALONE_TOOLCHAIN )
-endif( NOT ANDROID_NDK )
-
-# remember found paths
-if( ANDROID_NDK )
- get_filename_component( ANDROID_NDK "${ANDROID_NDK}" ABSOLUTE )
- set( ANDROID_NDK "${ANDROID_NDK}" CACHE INTERNAL "Path of the Android NDK" FORCE )
- set( BUILD_WITH_ANDROID_NDK True )
- if( EXISTS "${ANDROID_NDK}/RELEASE.TXT" )
- file( STRINGS "${ANDROID_NDK}/RELEASE.TXT" ANDROID_NDK_RELEASE_FULL LIMIT_COUNT 1 REGEX "r[0-9]+[a-z]?" )
- string( REGEX MATCH "r([0-9]+)([a-z]?)" ANDROID_NDK_RELEASE "${ANDROID_NDK_RELEASE_FULL}" )
- else()
- set( ANDROID_NDK_RELEASE "r1x" )
- set( ANDROID_NDK_RELEASE_FULL "unreleased" )
- endif()
- string( REGEX REPLACE "r([0-9]+)([a-z]?)" "\\1*1000" ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE}" )
- string( FIND " abcdefghijklmnopqastuvwxyz" "${CMAKE_MATCH_2}" __ndkReleaseLetterNum )
- math( EXPR ANDROID_NDK_RELEASE_NUM "${ANDROID_NDK_RELEASE_NUM}+${__ndkReleaseLetterNum}" )
-elseif( ANDROID_STANDALONE_TOOLCHAIN )
- get_filename_component( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" ABSOLUTE )
- # try to detect change
- if( CMAKE_AR )
- string( LENGTH "${ANDROID_STANDALONE_TOOLCHAIN}" __length )
- string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidStandaloneToolchainPreviousPath )
- if( NOT __androidStandaloneToolchainPreviousPath STREQUAL ANDROID_STANDALONE_TOOLCHAIN )
- message( FATAL_ERROR "It is not possible to change path to the Android standalone toolchain on subsequent run." )
- endif()
- unset( __androidStandaloneToolchainPreviousPath )
- unset( __length )
- endif()
- set( ANDROID_STANDALONE_TOOLCHAIN "${ANDROID_STANDALONE_TOOLCHAIN}" CACHE INTERNAL "Path of the Android standalone toolchain" FORCE )
- set( BUILD_WITH_STANDALONE_TOOLCHAIN True )
-else()
- list(GET ANDROID_NDK_SEARCH_PATHS 0 ANDROID_NDK_SEARCH_PATH)
- message( FATAL_ERROR "Could not find neither Android NDK nor Android standalone toolchain.
- You should either set an environment variable:
- export ANDROID_NDK=~/my-android-ndk
- or
- export ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain
- or put the toolchain or NDK in the default path:
- sudo ln -s ~/my-android-ndk ${ANDROID_NDK_SEARCH_PATH}/android-ndk
- sudo ln -s ~/my-android-toolchain ${ANDROID_STANDALONE_TOOLCHAIN_SEARCH_PATH}" )
-endif()
-
-# android NDK layout
-if( BUILD_WITH_ANDROID_NDK )
- if( NOT DEFINED ANDROID_NDK_LAYOUT )
- # try to automatically detect the layout
- if( EXISTS "${ANDROID_NDK}/RELEASE.TXT")
- set( ANDROID_NDK_LAYOUT "RELEASE" )
- elseif( EXISTS "${ANDROID_NDK}/../../linux-x86/toolchain/" )
- set( ANDROID_NDK_LAYOUT "LINARO" )
- elseif( EXISTS "${ANDROID_NDK}/../../gcc/" )
- set( ANDROID_NDK_LAYOUT "ANDROID" )
- endif()
- endif()
- set( ANDROID_NDK_LAYOUT "${ANDROID_NDK_LAYOUT}" CACHE STRING "The inner layout of NDK" )
- mark_as_advanced( ANDROID_NDK_LAYOUT )
- if( ANDROID_NDK_LAYOUT STREQUAL "LINARO" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../${ANDROID_NDK_HOST_SYSTEM_NAME}/toolchain" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
- elseif( ANDROID_NDK_LAYOUT STREQUAL "ANDROID" )
- set( ANDROID_NDK_HOST_SYSTEM_NAME ${ANDROID_NDK_HOST_SYSTEM_NAME2} ) # only 32-bit at the moment
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/../../gcc/${ANDROID_NDK_HOST_SYSTEM_NAME}/arm" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "" )
- else() # ANDROID_NDK_LAYOUT STREQUAL "RELEASE"
- set( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK}/toolchains" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME}" )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH2 "/prebuilt/${ANDROID_NDK_HOST_SYSTEM_NAME2}" )
- endif()
- get_filename_component( ANDROID_NDK_TOOLCHAINS_PATH "${ANDROID_NDK_TOOLCHAINS_PATH}" ABSOLUTE )
-
- # try to detect change of NDK
- if( CMAKE_AR )
- string( LENGTH "${ANDROID_NDK_TOOLCHAINS_PATH}" __length )
- string( SUBSTRING "${CMAKE_AR}" 0 ${__length} __androidNdkPreviousPath )
- if( NOT __androidNdkPreviousPath STREQUAL ANDROID_NDK_TOOLCHAINS_PATH )
- message( FATAL_ERROR "It is not possible to change the path to the NDK on subsequent CMake run. You must remove all generated files from your build folder first.
- " )
- endif()
- unset( __androidNdkPreviousPath )
- unset( __length )
- endif()
-endif()
-
-
-# get all the details about standalone toolchain
-if( BUILD_WITH_STANDALONE_TOOLCHAIN )
- __DETECT_NATIVE_API_LEVEL( ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot/usr/include/android/api-level.h" )
- set( ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
- set( __availableToolchains "standalone" )
- __DETECT_TOOLCHAIN_MACHINE_NAME( __availableToolchainMachines "${ANDROID_STANDALONE_TOOLCHAIN}" )
- if( NOT __availableToolchainMachines )
- message( FATAL_ERROR "Could not determine machine name of your toolchain. Probably your Android standalone toolchain is broken." )
- endif()
- if( __availableToolchainMachines MATCHES x86_64 )
- set( __availableToolchainArchs "x86_64" )
- elseif( __availableToolchainMachines MATCHES i686 )
- set( __availableToolchainArchs "x86" )
- elseif( __availableToolchainMachines MATCHES aarch64 )
- set( __availableToolchainArchs "arm64" )
- elseif( __availableToolchainMachines MATCHES arm )
- set( __availableToolchainArchs "arm" )
- elseif( __availableToolchainMachines MATCHES mips64el )
- set( __availableToolchainArchs "mips64" )
- elseif( __availableToolchainMachines MATCHES mipsel )
- set( __availableToolchainArchs "mips" )
- endif()
- execute_process( COMMAND "${ANDROID_STANDALONE_TOOLCHAIN}/bin/${__availableToolchainMachines}-gcc${TOOL_OS_SUFFIX}" -dumpversion
- OUTPUT_VARIABLE __availableToolchainCompilerVersions OUTPUT_STRIP_TRAILING_WHITESPACE )
- string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9]+)?" __availableToolchainCompilerVersions "${__availableToolchainCompilerVersions}" )
- if( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/bin/clang${TOOL_OS_SUFFIX}" )
- list( APPEND __availableToolchains "standalone-clang" )
- list( APPEND __availableToolchainMachines ${__availableToolchainMachines} )
- list( APPEND __availableToolchainArchs ${__availableToolchainArchs} )
- list( APPEND __availableToolchainCompilerVersions ${__availableToolchainCompilerVersions} )
- endif()
-endif()
-
-macro( __GLOB_NDK_TOOLCHAINS __availableToolchainsVar __availableToolchainsLst __toolchain_subpath )
- foreach( __toolchain ${${__availableToolchainsLst}} )
- if( "${__toolchain}" MATCHES "-clang3[.][0-9]$" AND NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}${__toolchain_subpath}" )
- SET( __toolchainVersionRegex "^TOOLCHAIN_VERSION[\t ]+:=[\t ]+(.*)$" )
- FILE( STRINGS "${ANDROID_NDK_TOOLCHAINS_PATH}/${__toolchain}/setup.mk" __toolchainVersionStr REGEX "${__toolchainVersionRegex}" )
- if( __toolchainVersionStr )
- string( REGEX REPLACE "${__toolchainVersionRegex}" "\\1" __toolchainVersionStr "${__toolchainVersionStr}" )
- string( REGEX REPLACE "-clang3[.][0-9]$" "-${__toolchainVersionStr}" __gcc_toolchain "${__toolchain}" )
- else()
- string( REGEX REPLACE "-clang3[.][0-9]$" "-4.6" __gcc_toolchain "${__toolchain}" )
- endif()
- unset( __toolchainVersionStr )
- unset( __toolchainVersionRegex )
- else()
- set( __gcc_toolchain "${__toolchain}" )
- endif()
- __DETECT_TOOLCHAIN_MACHINE_NAME( __machine "${ANDROID_NDK_TOOLCHAINS_PATH}/${__gcc_toolchain}${__toolchain_subpath}" )
- if( __machine )
- string( REGEX MATCH "[0-9]+[.][0-9]+([.][0-9x]+)?$" __version "${__gcc_toolchain}" )
- if( __machine MATCHES x86_64 )
- set( __arch "x86_64" )
- elseif( __machine MATCHES i686 )
- set( __arch "x86" )
- elseif( __machine MATCHES aarch64 )
- set( __arch "arm64" )
- elseif( __machine MATCHES arm )
- set( __arch "arm" )
- elseif( __machine MATCHES mips64el )
- set( __arch "mips64" )
- elseif( __machine MATCHES mipsel )
- set( __arch "mips" )
- else()
- set( __arch "" )
- endif()
- #message("machine: !${__machine}!\narch: !${__arch}!\nversion: !${__version}!\ntoolchain: !${__toolchain}!\n")
- if (__arch)
- list( APPEND __availableToolchainMachines "${__machine}" )
- list( APPEND __availableToolchainArchs "${__arch}" )
- list( APPEND __availableToolchainCompilerVersions "${__version}" )
- list( APPEND ${__availableToolchainsVar} "${__toolchain}" )
- endif()
- endif()
- unset( __gcc_toolchain )
- endforeach()
-endmacro()
-
-# get all the details about NDK
-if( BUILD_WITH_ANDROID_NDK )
- file( GLOB ANDROID_SUPPORTED_NATIVE_API_LEVELS RELATIVE "${ANDROID_NDK}/platforms" "${ANDROID_NDK}/platforms/android-*" )
- string( REPLACE "android-" "" ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_SUPPORTED_NATIVE_API_LEVELS}" )
- set( __availableToolchains "" )
- set( __availableToolchainMachines "" )
- set( __availableToolchainArchs "" )
- set( __availableToolchainCompilerVersions "" )
- if( ANDROID_TOOLCHAIN_NAME AND EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_TOOLCHAIN_NAME}/" )
- # do not go through all toolchains if we know the name
- set( __availableToolchainsLst "${ANDROID_TOOLCHAIN_NAME}" )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
- if( __availableToolchains )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
- endif()
- endif()
- endif()
- if( NOT __availableToolchains )
- file( GLOB __availableToolchainsLst RELATIVE "${ANDROID_NDK_TOOLCHAINS_PATH}" "${ANDROID_NDK_TOOLCHAINS_PATH}/*" )
- if( __availableToolchains )
- list(SORT __availableToolchainsLst) # we need clang to go after gcc
- endif()
- __LIST_FILTER( __availableToolchainsLst "^[.]" )
- __LIST_FILTER( __availableToolchainsLst "llvm" )
- __LIST_FILTER( __availableToolchainsLst "renderscript" )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- if( NOT __availableToolchains AND NOT ANDROID_NDK_TOOLCHAINS_SUBPATH STREQUAL ANDROID_NDK_TOOLCHAINS_SUBPATH2 )
- __GLOB_NDK_TOOLCHAINS( __availableToolchains __availableToolchainsLst "${ANDROID_NDK_TOOLCHAINS_SUBPATH2}" )
- if( __availableToolchains )
- set( ANDROID_NDK_TOOLCHAINS_SUBPATH ${ANDROID_NDK_TOOLCHAINS_SUBPATH2} )
- endif()
- endif()
- endif()
- if( NOT __availableToolchains )
- message( FATAL_ERROR "Could not find any working toolchain in the NDK. Probably your Android NDK is broken." )
- endif()
-endif()
-
-# build list of available ABIs
-set( ANDROID_SUPPORTED_ABIS "" )
-set( __uniqToolchainArchNames ${__availableToolchainArchs} )
-list( REMOVE_DUPLICATES __uniqToolchainArchNames )
-list( SORT __uniqToolchainArchNames )
-foreach( __arch ${__uniqToolchainArchNames} )
- list( APPEND ANDROID_SUPPORTED_ABIS ${ANDROID_SUPPORTED_ABIS_${__arch}} )
-endforeach()
-unset( __uniqToolchainArchNames )
-if( NOT ANDROID_SUPPORTED_ABIS )
- message( FATAL_ERROR "No one of known Android ABIs is supported by this cmake toolchain." )
-endif()
-
-# choose target ABI
-__INIT_VARIABLE( ANDROID_ABI VALUES ${ANDROID_SUPPORTED_ABIS} )
-# verify that target ABI is supported
-list( FIND ANDROID_SUPPORTED_ABIS "${ANDROID_ABI}" __androidAbiIdx )
-if( __androidAbiIdx EQUAL -1 )
- string( REPLACE ";" "\", \"" PRINTABLE_ANDROID_SUPPORTED_ABIS "${ANDROID_SUPPORTED_ABIS}" )
- message( FATAL_ERROR "Specified ANDROID_ABI = \"${ANDROID_ABI}\" is not supported by this cmake toolchain or your NDK/toolchain.
- Supported values are: \"${PRINTABLE_ANDROID_SUPPORTED_ABIS}\"
- " )
-endif()
-unset( __androidAbiIdx )
-
-# set target ABI options
-if( ANDROID_ABI STREQUAL "x86" )
- set( X86 true )
- set( ANDROID_NDK_ABI_NAME "x86" )
- set( ANDROID_ARCH_NAME "x86" )
- set( ANDROID_LLVM_TRIPLE "i686-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "i686" )
-elseif( ANDROID_ABI STREQUAL "x86_64" )
- set( X86 true )
- set( X86_64 true )
- set( ANDROID_NDK_ABI_NAME "x86_64" )
- set( ANDROID_ARCH_NAME "x86_64" )
- set( CMAKE_SYSTEM_PROCESSOR "x86_64" )
- set( ANDROID_LLVM_TRIPLE "x86_64-none-linux-android" )
-elseif( ANDROID_ABI STREQUAL "mips64" )
- set( MIPS64 true )
- set( ANDROID_NDK_ABI_NAME "mips64" )
- set( ANDROID_ARCH_NAME "mips64" )
- set( ANDROID_LLVM_TRIPLE "mips64el-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "mips64" )
-elseif( ANDROID_ABI STREQUAL "mips" )
- set( MIPS true )
- set( ANDROID_NDK_ABI_NAME "mips" )
- set( ANDROID_ARCH_NAME "mips" )
- set( ANDROID_LLVM_TRIPLE "mipsel-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "mips" )
-elseif( ANDROID_ABI STREQUAL "arm64-v8a" )
- set( ARM64_V8A true )
- set( ANDROID_NDK_ABI_NAME "arm64-v8a" )
- set( ANDROID_ARCH_NAME "arm64" )
- set( ANDROID_LLVM_TRIPLE "aarch64-none-linux-android" )
- set( CMAKE_SYSTEM_PROCESSOR "aarch64" )
- set( VFPV3 true )
- set( NEON true )
-elseif( ANDROID_ABI STREQUAL "armeabi" )
- set( ARMEABI true )
- set( ANDROID_NDK_ABI_NAME "armeabi" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv5te" )
-elseif( ANDROID_ABI STREQUAL "armeabi-v6 with VFP" )
- set( ARMEABI_V6 true )
- set( ANDROID_NDK_ABI_NAME "armeabi" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv5te-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv6" )
- # need always fallback to older platform
- set( ARMEABI true )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a")
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a with VFPV3" )
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
- set( VFPV3 true )
-elseif( ANDROID_ABI STREQUAL "armeabi-v7a with NEON" )
- set( ARMEABI_V7A true )
- set( ANDROID_NDK_ABI_NAME "armeabi-v7a" )
- set( ANDROID_ARCH_NAME "arm" )
- set( ANDROID_LLVM_TRIPLE "armv7-none-linux-androideabi" )
- set( CMAKE_SYSTEM_PROCESSOR "armv7-a" )
- set( VFPV3 true )
- set( NEON true )
-else()
- message( SEND_ERROR "Unknown ANDROID_ABI=\"${ANDROID_ABI}\" is specified." )
-endif()
-
-if( CMAKE_BINARY_DIR AND EXISTS "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" )
- # really dirty hack
- # it is not possible to change CMAKE_SYSTEM_PROCESSOR after the first run...
- file( APPEND "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeSystem.cmake" "SET(CMAKE_SYSTEM_PROCESSOR \"${CMAKE_SYSTEM_PROCESSOR}\")\n" )
-endif()
-
-if( ANDROID_ARCH_NAME STREQUAL "arm" AND NOT ARMEABI_V6 )
- __INIT_VARIABLE( ANDROID_FORCE_ARM_BUILD VALUES OFF )
- set( ANDROID_FORCE_ARM_BUILD ${ANDROID_FORCE_ARM_BUILD} CACHE BOOL "Use 32-bit ARM instructions instead of Thumb-1" FORCE )
- mark_as_advanced( ANDROID_FORCE_ARM_BUILD )
-else()
- unset( ANDROID_FORCE_ARM_BUILD CACHE )
-endif()
-
-# choose toolchain
-if( ANDROID_TOOLCHAIN_NAME )
- list( FIND __availableToolchains "${ANDROID_TOOLCHAIN_NAME}" __toolchainIdx )
- if( __toolchainIdx EQUAL -1 )
- list( SORT __availableToolchains )
- string( REPLACE ";" "\n * " toolchains_list "${__availableToolchains}" )
- set( toolchains_list " * ${toolchains_list}")
- message( FATAL_ERROR "Specified toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is missing in your NDK or broken. Please verify that your NDK is working or select another compiler toolchain.
-To configure the toolchain set CMake variable ANDROID_TOOLCHAIN_NAME to one of the following values:\n${toolchains_list}\n" )
- endif()
- list( GET __availableToolchainArchs ${__toolchainIdx} __toolchainArch )
- if( NOT __toolchainArch STREQUAL ANDROID_ARCH_NAME )
- message( SEND_ERROR "Selected toolchain \"${ANDROID_TOOLCHAIN_NAME}\" is not able to compile binaries for the \"${ANDROID_ARCH_NAME}\" platform." )
- endif()
-else()
- set( __toolchainIdx -1 )
- set( __applicableToolchains "" )
- set( __toolchainMaxVersion "0.0.0" )
- list( LENGTH __availableToolchains __availableToolchainsCount )
- math( EXPR __availableToolchainsCount "${__availableToolchainsCount}-1" )
- foreach( __idx RANGE ${__availableToolchainsCount} )
- list( GET __availableToolchainArchs ${__idx} __toolchainArch )
- if( __toolchainArch STREQUAL ANDROID_ARCH_NAME )
- list( GET __availableToolchainCompilerVersions ${__idx} __toolchainVersion )
- string( REPLACE "x" "99" __toolchainVersion "${__toolchainVersion}")
- if( __toolchainVersion VERSION_GREATER __toolchainMaxVersion )
- set( __toolchainMaxVersion "${__toolchainVersion}" )
- set( __toolchainIdx ${__idx} )
- endif()
- endif()
- endforeach()
- unset( __availableToolchainsCount )
- unset( __toolchainMaxVersion )
- unset( __toolchainVersion )
-endif()
-unset( __toolchainArch )
-if( __toolchainIdx EQUAL -1 )
- message( FATAL_ERROR "No one of available compiler toolchains is able to compile for ${ANDROID_ARCH_NAME} platform." )
-endif()
-list( GET __availableToolchains ${__toolchainIdx} ANDROID_TOOLCHAIN_NAME )
-list( GET __availableToolchainMachines ${__toolchainIdx} ANDROID_TOOLCHAIN_MACHINE_NAME )
-list( GET __availableToolchainCompilerVersions ${__toolchainIdx} ANDROID_COMPILER_VERSION )
-
-unset( __toolchainIdx )
-unset( __availableToolchains )
-unset( __availableToolchainMachines )
-unset( __availableToolchainArchs )
-unset( __availableToolchainCompilerVersions )
-
-# choose native API level
-__INIT_VARIABLE( ANDROID_NATIVE_API_LEVEL ENV_ANDROID_NATIVE_API_LEVEL ANDROID_API_LEVEL ENV_ANDROID_API_LEVEL ANDROID_STANDALONE_TOOLCHAIN_API_LEVEL ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME} ANDROID_DEFAULT_NDK_API_LEVEL )
-string( REPLACE "android-" "" ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" )
-string( STRIP "${ANDROID_NATIVE_API_LEVEL}" ANDROID_NATIVE_API_LEVEL )
-# adjust API level
-set( __real_api_level ${ANDROID_DEFAULT_NDK_API_LEVEL_${ANDROID_ARCH_NAME}} )
-foreach( __level ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
- if( (__level LESS ANDROID_NATIVE_API_LEVEL OR __level STREQUAL ANDROID_NATIVE_API_LEVEL) AND NOT __level LESS __real_api_level )
- set( __real_api_level ${__level} )
- endif()
-endforeach()
-if( __real_api_level AND NOT ANDROID_NATIVE_API_LEVEL STREQUAL __real_api_level )
- message( STATUS "Adjusting Android API level 'android-${ANDROID_NATIVE_API_LEVEL}' to 'android-${__real_api_level}'")
- set( ANDROID_NATIVE_API_LEVEL ${__real_api_level} )
-endif()
-unset(__real_api_level)
-# validate
-list( FIND ANDROID_SUPPORTED_NATIVE_API_LEVELS "${ANDROID_NATIVE_API_LEVEL}" __levelIdx )
-if( __levelIdx EQUAL -1 )
- message( SEND_ERROR "Specified Android native API level 'android-${ANDROID_NATIVE_API_LEVEL}' is not supported by your NDK/toolchain." )
-else()
- if( BUILD_WITH_ANDROID_NDK )
- __DETECT_NATIVE_API_LEVEL( __realApiLevel "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}/usr/include/android/api-level.h" )
- if( NOT __realApiLevel EQUAL ANDROID_NATIVE_API_LEVEL AND NOT __realApiLevel GREATER 9000 )
- message( SEND_ERROR "Specified Android API level (${ANDROID_NATIVE_API_LEVEL}) does not match to the level found (${__realApiLevel}). Probably your copy of NDK is broken." )
- endif()
- unset( __realApiLevel )
- endif()
- set( ANDROID_NATIVE_API_LEVEL "${ANDROID_NATIVE_API_LEVEL}" CACHE STRING "Android API level for native code" FORCE )
- set( CMAKE_ANDROID_API ${ANDROID_NATIVE_API_LEVEL} )
- if( CMAKE_VERSION VERSION_GREATER "2.8" )
- list( SORT ANDROID_SUPPORTED_NATIVE_API_LEVELS )
- set_property( CACHE ANDROID_NATIVE_API_LEVEL PROPERTY STRINGS ${ANDROID_SUPPORTED_NATIVE_API_LEVELS} )
- endif()
-endif()
-unset( __levelIdx )
-
-
-# remember target ABI
-set( ANDROID_ABI "${ANDROID_ABI}" CACHE STRING "The target ABI for Android. If arm, then armeabi-v7a is recommended for hardware floating point." FORCE )
-if( CMAKE_VERSION VERSION_GREATER "2.8" )
- list( SORT ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME} )
- set_property( CACHE ANDROID_ABI PROPERTY STRINGS ${ANDROID_SUPPORTED_ABIS_${ANDROID_ARCH_NAME}} )
-endif()
-
-
-# runtime choice (STL, rtti, exceptions)
-if( NOT ANDROID_STL )
- set( ANDROID_STL gnustl_static )
-endif()
-set( ANDROID_STL "${ANDROID_STL}" CACHE STRING "C++ runtime" )
-set( ANDROID_STL_FORCE_FEATURES ON CACHE BOOL "automatically configure rtti and exceptions support based on C++ runtime" )
-mark_as_advanced( ANDROID_STL ANDROID_STL_FORCE_FEATURES )
-
-if( BUILD_WITH_ANDROID_NDK )
- if( NOT "${ANDROID_STL}" MATCHES "^(none|system|system_re|gabi\\+\\+_static|gabi\\+\\+_shared|stlport_static|stlport_shared|gnustl_static|gnustl_shared)$")
- message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
-The possible values are:
- none -> Do not configure the runtime.
- system -> Use the default minimal system C++ runtime library.
- system_re -> Same as system but with rtti and exceptions.
- gabi++_static -> Use the GAbi++ runtime as a static library.
- gabi++_shared -> Use the GAbi++ runtime as a shared library.
- stlport_static -> Use the STLport runtime as a static library.
- stlport_shared -> Use the STLport runtime as a shared library.
- gnustl_static -> (default) Use the GNU STL as a static library.
- gnustl_shared -> Use the GNU STL as a shared library.
-" )
- endif()
-elseif( BUILD_WITH_STANDALONE_TOOLCHAIN )
- if( NOT "${ANDROID_STL}" MATCHES "^(none|gnustl_static|gnustl_shared)$")
- message( FATAL_ERROR "ANDROID_STL is set to invalid value \"${ANDROID_STL}\".
-The possible values are:
- none -> Do not configure the runtime.
- gnustl_static -> (default) Use the GNU STL as a static library.
- gnustl_shared -> Use the GNU STL as a shared library.
-" )
- endif()
-endif()
-
-unset( ANDROID_RTTI )
-unset( ANDROID_EXCEPTIONS )
-unset( ANDROID_STL_INCLUDE_DIRS )
-unset( __libstl )
-unset( __libsupcxx )
-
-if( NOT _CMAKE_IN_TRY_COMPILE AND ANDROID_NDK_RELEASE STREQUAL "r7b" AND ARMEABI_V7A AND NOT VFPV3 AND ANDROID_STL MATCHES "gnustl" )
- message( WARNING "The GNU STL armeabi-v7a binaries from NDK r7b can crash non-NEON devices. The files provided with NDK r7b were not configured properly, resulting in crashes on Tegra2-based devices and others when trying to use certain floating-point functions (e.g., cosf, sinf, expf).
-You are strongly recommended to switch to another NDK release.
-" )
-endif()
-
-if( NOT _CMAKE_IN_TRY_COMPILE AND X86 AND ANDROID_STL MATCHES "gnustl" AND ANDROID_NDK_RELEASE STREQUAL "r6" )
- message( WARNING "The x86 system header file from NDK r6 has incorrect definition for ptrdiff_t. You are recommended to upgrade to a newer NDK release or manually patch the header:
-See https://android.googlesource.com/platform/development.git f907f4f9d4e56ccc8093df6fee54454b8bcab6c2
- diff --git a/ndk/platforms/android-9/arch-x86/include/machine/_types.h b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- index 5e28c64..65892a1 100644
- --- a/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- +++ b/ndk/platforms/android-9/arch-x86/include/machine/_types.h
- @@ -51,7 +51,11 @@ typedef long int ssize_t;
- #endif
- #ifndef _PTRDIFF_T
- #define _PTRDIFF_T
- -typedef long ptrdiff_t;
- +# ifdef __ANDROID__
- + typedef int ptrdiff_t;
- +# else
- + typedef long ptrdiff_t;
- +# endif
- #endif
-" )
-endif()
-
-
-# setup paths and STL for standalone toolchain
-if( BUILD_WITH_STANDALONE_TOOLCHAIN )
- set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
- set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_STANDALONE_TOOLCHAIN}" )
- set( ANDROID_SYSROOT "${ANDROID_STANDALONE_TOOLCHAIN}/sysroot" )
-
- if( NOT ANDROID_STL STREQUAL "none" )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/include/c++/${ANDROID_COMPILER_VERSION}" )
- if( NOT EXISTS "${ANDROID_STL_INCLUDE_DIRS}" )
- # old location ( pre r8c )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/include/c++/${ANDROID_COMPILER_VERSION}" )
- endif()
- if( ARMEABI_V7A AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}/bits" )
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/${CMAKE_SYSTEM_PROCESSOR}" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb/bits" )
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/thumb" )
- else()
- list( APPEND ANDROID_STL_INCLUDE_DIRS "${ANDROID_STL_INCLUDE_DIRS}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" )
- endif()
- # always search static GNU STL to get the location of libsupc++.a
- if( ARMEABI_V7A AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb" )
- elseif( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb" )
- elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libstdc++.a" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib" )
- endif()
- if( __libstl )
- set( __libsupcxx "${__libstl}/libsupc++.a" )
- set( __libstl "${__libstl}/libstdc++.a" )
- endif()
- if( NOT EXISTS "${__libsupcxx}" )
- message( FATAL_ERROR "The required libstdsupc++.a is missing in your standalone toolchain.
- Usually it happens because of bug in make-standalone-toolchain.sh script from NDK r7, r7b and r7c.
- You need to either upgrade to newer NDK or manually copy
- $ANDROID_NDK/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a
- to
- ${__libsupcxx}
- " )
- endif()
- if( ANDROID_STL STREQUAL "gnustl_shared" )
- if( ARMEABI_V7A AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libgnustl_shared.so" )
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD AND EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libgnustl_shared.so" )
- elseif( EXISTS "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
- set( __libstl "${ANDROID_STANDALONE_TOOLCHAIN}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libgnustl_shared.so" )
- endif()
- endif()
- endif()
-endif()
-
-# clang
-if( "${ANDROID_TOOLCHAIN_NAME}" STREQUAL "standalone-clang" )
- set( ANDROID_COMPILER_IS_CLANG 1 )
- execute_process( COMMAND "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/clang${TOOL_OS_SUFFIX}" --version OUTPUT_VARIABLE ANDROID_CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE )
- string( REGEX MATCH "[0-9]+[.][0-9]+" ANDROID_CLANG_VERSION "${ANDROID_CLANG_VERSION}")
-elseif( "${ANDROID_TOOLCHAIN_NAME}" MATCHES "-clang3[.][0-9]?$" )
- string( REGEX MATCH "3[.][0-9]$" ANDROID_CLANG_VERSION "${ANDROID_TOOLCHAIN_NAME}")
- string( REGEX REPLACE "-clang${ANDROID_CLANG_VERSION}$" "-${ANDROID_COMPILER_VERSION}" ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
- if( NOT EXISTS "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}/bin/clang${TOOL_OS_SUFFIX}" )
- message( FATAL_ERROR "Could not find the Clang compiler driver" )
- endif()
- set( ANDROID_COMPILER_IS_CLANG 1 )
- set( ANDROID_CLANG_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/llvm-${ANDROID_CLANG_VERSION}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
-else()
- set( ANDROID_GCC_TOOLCHAIN_NAME "${ANDROID_TOOLCHAIN_NAME}" )
- unset( ANDROID_COMPILER_IS_CLANG CACHE )
-endif()
-
-string( REPLACE "." "" _clang_name "clang${ANDROID_CLANG_VERSION}" )
-if( NOT EXISTS "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" )
- set( _clang_name "clang" )
-endif()
-
-
-# setup paths and STL for NDK
-if( BUILD_WITH_ANDROID_NDK )
- set( ANDROID_TOOLCHAIN_ROOT "${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}${ANDROID_NDK_TOOLCHAINS_SUBPATH}" )
- set( ANDROID_SYSROOT "${ANDROID_NDK}/platforms/android-${ANDROID_NATIVE_API_LEVEL}/arch-${ANDROID_ARCH_NAME}" )
-
- if( ANDROID_STL STREQUAL "none" )
- # do nothing
- elseif( ANDROID_STL STREQUAL "system" )
- set( ANDROID_RTTI OFF )
- set( ANDROID_EXCEPTIONS OFF )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
- elseif( ANDROID_STL STREQUAL "system_re" )
- set( ANDROID_RTTI ON )
- set( ANDROID_EXCEPTIONS ON )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/system/include" )
- elseif( ANDROID_STL MATCHES "gabi" )
- if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- message( FATAL_ERROR "gabi++ is not awailable in your NDK. You have to upgrade to NDK r7 or newer to use gabi++.")
- endif()
- set( ANDROID_RTTI ON )
- set( ANDROID_EXCEPTIONS OFF )
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/gabi++/include" )
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gabi++/libs/${ANDROID_NDK_ABI_NAME}/libgabi++_static.a" )
- elseif( ANDROID_STL MATCHES "stlport" )
- if( NOT ANDROID_NDK_RELEASE_NUM LESS 8004 ) # before r8d
- set( ANDROID_EXCEPTIONS ON )
- else()
- set( ANDROID_EXCEPTIONS OFF )
- endif()
- if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- set( ANDROID_RTTI OFF )
- else()
- set( ANDROID_RTTI ON )
- endif()
- set( ANDROID_STL_INCLUDE_DIRS "${ANDROID_NDK}/sources/cxx-stl/stlport/stlport" )
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/stlport/libs/${ANDROID_NDK_ABI_NAME}/libstlport_static.a" )
- elseif( ANDROID_STL MATCHES "gnustl" )
- set( ANDROID_EXCEPTIONS ON )
- set( ANDROID_RTTI ON )
- if( EXISTS "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
- if( ARMEABI_V7A AND ANDROID_COMPILER_VERSION VERSION_EQUAL "4.7" AND ANDROID_NDK_RELEASE STREQUAL "r8d" )
- # gnustl binary for 4.7 compiler is buggy :(
- # TODO: look for right fix
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/4.6" )
- else()
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}" )
- endif()
- else()
- set( __libstl "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++" )
- endif()
- set( ANDROID_STL_INCLUDE_DIRS "${__libstl}/include" "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/include" "${__libstl}/include/backward" )
- if( EXISTS "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
- set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libgnustl_static.a" )
- else()
- set( __libstl "${__libstl}/libs/${ANDROID_NDK_ABI_NAME}/libstdc++.a" )
- endif()
- else()
- message( FATAL_ERROR "Unknown runtime: ${ANDROID_STL}" )
- endif()
- # find libsupc++.a - rtti & exceptions
- if( ANDROID_STL STREQUAL "system_re" OR ANDROID_STL MATCHES "gnustl" )
- set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/${ANDROID_COMPILER_VERSION}/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r8b or newer
- if( NOT EXISTS "${__libsupcxx}" )
- set( __libsupcxx "${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++/libs/${ANDROID_NDK_ABI_NAME}/libsupc++.a" ) # r7-r8
- endif()
- if( NOT EXISTS "${__libsupcxx}" ) # before r7
- if( ARMEABI_V7A )
- if( ANDROID_FORCE_ARM_BUILD )
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/libsupc++.a" )
- else()
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/${CMAKE_SYSTEM_PROCESSOR}/thumb/libsupc++.a" )
- endif()
- elseif( ARMEABI AND NOT ANDROID_FORCE_ARM_BUILD )
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/thumb/libsupc++.a" )
- else()
- set( __libsupcxx "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}/lib/libsupc++.a" )
- endif()
- endif()
- if( NOT EXISTS "${__libsupcxx}")
- message( ERROR "Could not find libsupc++.a for a chosen platform. Either your NDK is not supported or is broken.")
- endif()
- endif()
-endif()
-
-
-# case of shared STL linkage
-if( ANDROID_STL MATCHES "shared" AND DEFINED __libstl )
- string( REPLACE "_static.a" "_shared.so" __libstl "${__libstl}" )
- # TODO: check if .so file exists before the renaming
-endif()
-
-
-# ccache support
-__INIT_VARIABLE( _ndk_ccache NDK_CCACHE ENV_NDK_CCACHE )
-if( _ndk_ccache )
- if( DEFINED NDK_CCACHE AND NOT EXISTS NDK_CCACHE )
- unset( NDK_CCACHE CACHE )
- endif()
- find_program( NDK_CCACHE "${_ndk_ccache}" DOC "The path to ccache binary")
-else()
- unset( NDK_CCACHE CACHE )
-endif()
-unset( _ndk_ccache )
-
-
-# setup the cross-compiler
-if( NOT CMAKE_C_COMPILER )
- if( NDK_CCACHE AND NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
- set( CMAKE_C_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C compiler" )
- set( CMAKE_CXX_COMPILER "${NDK_CCACHE}" CACHE PATH "ccache as C++ compiler" )
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- else()
- set( CMAKE_C_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER_ARG1 "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- endif()
- else()
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}${TOOL_OS_SUFFIX}" CACHE PATH "C compiler")
- set( CMAKE_CXX_COMPILER "${ANDROID_CLANG_TOOLCHAIN_ROOT}/bin/${_clang_name}++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler")
- else()
- set( CMAKE_C_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "C compiler" )
- set( CMAKE_CXX_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-g++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler" )
- endif()
- endif()
- set( CMAKE_ASM_COMPILER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-gcc${TOOL_OS_SUFFIX}" CACHE PATH "assembler" )
- set( CMAKE_STRIP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-strip${TOOL_OS_SUFFIX}" CACHE PATH "strip" )
- set( CMAKE_AR "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ar${TOOL_OS_SUFFIX}" CACHE PATH "archive" )
- set( CMAKE_LINKER "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ld${TOOL_OS_SUFFIX}" CACHE PATH "linker" )
- set( CMAKE_NM "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-nm${TOOL_OS_SUFFIX}" CACHE PATH "nm" )
- set( CMAKE_OBJCOPY "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objcopy${TOOL_OS_SUFFIX}" CACHE PATH "objcopy" )
- set( CMAKE_OBJDUMP "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-objdump${TOOL_OS_SUFFIX}" CACHE PATH "objdump" )
- set( CMAKE_RANLIB "${ANDROID_TOOLCHAIN_ROOT}/bin/${ANDROID_TOOLCHAIN_MACHINE_NAME}-ranlib${TOOL_OS_SUFFIX}" CACHE PATH "ranlib" )
-endif()
-
-set( _CMAKE_TOOLCHAIN_PREFIX "${ANDROID_TOOLCHAIN_MACHINE_NAME}-" )
-if( CMAKE_VERSION VERSION_LESS 2.8.5 )
- set( CMAKE_ASM_COMPILER_ARG1 "-c" )
-endif()
-if( APPLE )
- find_program( CMAKE_INSTALL_NAME_TOOL NAMES install_name_tool )
- if( NOT CMAKE_INSTALL_NAME_TOOL )
- message( FATAL_ERROR "Could not find install_name_tool, please check your installation." )
- endif()
- mark_as_advanced( CMAKE_INSTALL_NAME_TOOL )
-endif()
-
-# Force set compilers because standard identification works badly for us
-include( CMakeForceCompiler )
-CMAKE_FORCE_C_COMPILER( "${CMAKE_C_COMPILER}" GNU )
-if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_C_COMPILER_ID Clang )
-endif()
-set( CMAKE_C_PLATFORM_ID Linux )
-if( X86_64 OR MIPS64 OR ARM64_V8A )
- set( CMAKE_C_SIZEOF_DATA_PTR 8 )
-else()
- set( CMAKE_C_SIZEOF_DATA_PTR 4 )
-endif()
-set( CMAKE_C_HAS_ISYSROOT 1 )
-set( CMAKE_C_COMPILER_ABI ELF )
-CMAKE_FORCE_CXX_COMPILER( "${CMAKE_CXX_COMPILER}" GNU )
-if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_CXX_COMPILER_ID Clang)
-endif()
-set( CMAKE_CXX_PLATFORM_ID Linux )
-set( CMAKE_CXX_SIZEOF_DATA_PTR ${CMAKE_C_SIZEOF_DATA_PTR} )
-set( CMAKE_CXX_HAS_ISYSROOT 1 )
-set( CMAKE_CXX_COMPILER_ABI ELF )
-set( CMAKE_CXX_SOURCE_FILE_EXTENSIONS cc cp cxx cpp CPP c++ C )
-# force ASM compiler (required for CMake < 2.8.5)
-set( CMAKE_ASM_COMPILER_ID_RUN TRUE )
-set( CMAKE_ASM_COMPILER_ID GNU )
-set( CMAKE_ASM_COMPILER_WORKS TRUE )
-set( CMAKE_ASM_COMPILER_FORCED TRUE )
-set( CMAKE_COMPILER_IS_GNUASM 1)
-set( CMAKE_ASM_SOURCE_FILE_EXTENSIONS s S asm )
-
-foreach( lang C CXX ASM )
- if( ANDROID_COMPILER_IS_CLANG )
- set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_CLANG_VERSION} )
- else()
- set( CMAKE_${lang}_COMPILER_VERSION ${ANDROID_COMPILER_VERSION} )
- endif()
-endforeach()
-
-# flags and definitions
-remove_definitions( -DANDROID )
-add_definitions( -DANDROID )
-
-if( ANDROID_SYSROOT MATCHES "[ ;\"]" )
- if( CMAKE_HOST_WIN32 )
- # try to convert path to 8.3 form
- file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "@echo %~s1" )
- execute_process( COMMAND "$ENV{ComSpec}" /c "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/cvt83.cmd" "${ANDROID_SYSROOT}"
- OUTPUT_VARIABLE __path OUTPUT_STRIP_TRAILING_WHITESPACE
- RESULT_VARIABLE __result ERROR_QUIET )
- if( __result EQUAL 0 )
- file( TO_CMAKE_PATH "${__path}" ANDROID_SYSROOT )
- set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
- else()
- set( ANDROID_CXX_FLAGS "--sysroot=\"${ANDROID_SYSROOT}\"" )
- endif()
- else()
- set( ANDROID_CXX_FLAGS "'--sysroot=${ANDROID_SYSROOT}'" )
- endif()
- if( NOT _CMAKE_IN_TRY_COMPILE )
- # quotes can break try_compile and compiler identification
- message(WARNING "Path to your Android NDK (or toolchain) has non-alphanumeric symbols.\nThe build might be broken.\n")
- endif()
-else()
- set( ANDROID_CXX_FLAGS "--sysroot=${ANDROID_SYSROOT}" )
-endif()
-
-# NDK flags
-if (ARM64_V8A )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
- endif()
-elseif( ARMEABI OR ARMEABI_V7A)
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- if( NOT ANDROID_FORCE_ARM_BUILD AND NOT ARMEABI_V6 )
- set( ANDROID_CXX_FLAGS_RELEASE "-mthumb -fomit-frame-pointer -fno-strict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -finline-limit=64" )
- endif()
- else()
- # always compile ARMEABI_V6 in arm mode; otherwise there is no difference from ARMEABI
- set( ANDROID_CXX_FLAGS_RELEASE "-marm -fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-marm -fno-omit-frame-pointer -fno-strict-aliasing" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
- endif()
- endif()
-elseif( X86 OR X86_64 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funwind-tables" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -funswitch-loops -finline-limit=300" )
- endif()
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer -fstrict-aliasing" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer -fno-strict-aliasing" )
-elseif( MIPS OR MIPS64 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-strict-aliasing -finline-functions -funwind-tables -fmessage-length=0" )
- set( ANDROID_CXX_FLAGS_RELEASE "-fomit-frame-pointer" )
- set( ANDROID_CXX_FLAGS_DEBUG "-fno-omit-frame-pointer" )
- if( NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fno-inline-functions-called-once -fgcse-after-reload -frerun-cse-after-loop -frename-registers" )
- set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} -funswitch-loops -finline-limit=300" )
- endif()
-elseif()
- set( ANDROID_CXX_FLAGS_RELEASE "" )
- set( ANDROID_CXX_FLAGS_DEBUG "" )
-endif()
-
-set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fsigned-char" ) # good/necessary when porting desktop libraries
-
-if( NOT X86 AND NOT ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "-Wno-psabi ${ANDROID_CXX_FLAGS}" )
-endif()
-
-if( NOT ANDROID_COMPILER_VERSION VERSION_LESS "4.6" )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -no-canonical-prefixes" ) # see https://android-review.googlesource.com/#/c/47564/
-endif()
-
-# ABI-specific flags
-if( ARMEABI_V7A )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv7-a -mfloat-abi=softfp" )
- if( NEON )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=neon" )
- elseif( VFPV3 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3" )
- else()
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -mfpu=vfpv3-d16" )
- endif()
-elseif( ARMEABI_V6 )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv6 -mfloat-abi=softfp -mfpu=vfp" ) # vfp == vfpv2
-elseif( ARMEABI )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -march=armv5te -mtune=xscale -msoft-float" )
-endif()
-
-if( ANDROID_STL MATCHES "gnustl" AND (EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}") )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
-else()
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
-endif()
-
-# STL
-if( EXISTS "${__libstl}" OR EXISTS "${__libsupcxx}" )
- if( EXISTS "${__libstl}" )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libstl}\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libstl}\"" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libstl}\"" )
- endif()
- if( EXISTS "${__libsupcxx}" )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
- # C objects:
- set( CMAKE_C_CREATE_SHARED_LIBRARY "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_C_CREATE_SHARED_MODULE "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" )
- set( CMAKE_C_LINK_EXECUTABLE "<CMAKE_C_COMPILER> <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>" )
- set( CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_C_CREATE_SHARED_LIBRARY} \"${__libsupcxx}\"" )
- set( CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_C_CREATE_SHARED_MODULE} \"${__libsupcxx}\"" )
- set( CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINK_EXECUTABLE} \"${__libsupcxx}\"" )
- endif()
- if( ANDROID_STL MATCHES "gnustl" )
- if( NOT EXISTS "${ANDROID_LIBM_PATH}" )
- set( ANDROID_LIBM_PATH -lm )
- endif()
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} ${ANDROID_LIBM_PATH}" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} ${ANDROID_LIBM_PATH}" )
- set( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} ${ANDROID_LIBM_PATH}" )
- endif()
-endif()
-
-# variables controlling optional build flags
-if( ANDROID_NDK_RELEASE_NUM LESS 7000 ) # before r7
- # libGLESv2.so in NDK's prior to r7 refers to missing external symbols.
- # So this flag option is required for all projects using OpenGL from native.
- __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES ON )
-else()
- __INIT_VARIABLE( ANDROID_SO_UNDEFINED VALUES OFF )
-endif()
-__INIT_VARIABLE( ANDROID_NO_UNDEFINED VALUES ON )
-__INIT_VARIABLE( ANDROID_FUNCTION_LEVEL_LINKING VALUES ON )
-__INIT_VARIABLE( ANDROID_GOLD_LINKER VALUES ON )
-__INIT_VARIABLE( ANDROID_NOEXECSTACK VALUES ON )
-__INIT_VARIABLE( ANDROID_RELRO VALUES ON )
-
-set( ANDROID_NO_UNDEFINED ${ANDROID_NO_UNDEFINED} CACHE BOOL "Show all undefined symbols as linker errors" )
-set( ANDROID_SO_UNDEFINED ${ANDROID_SO_UNDEFINED} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
-set( ANDROID_FUNCTION_LEVEL_LINKING ${ANDROID_FUNCTION_LEVEL_LINKING} CACHE BOOL "Put each function in separate section and enable garbage collection of unused input sections at link time" )
-set( ANDROID_GOLD_LINKER ${ANDROID_GOLD_LINKER} CACHE BOOL "Enables gold linker" )
-set( ANDROID_NOEXECSTACK ${ANDROID_NOEXECSTACK} CACHE BOOL "Allows or disallows undefined symbols in shared libraries" )
-set( ANDROID_RELRO ${ANDROID_RELRO} CACHE BOOL "Enables RELRO - a memory corruption mitigation technique" )
-mark_as_advanced( ANDROID_NO_UNDEFINED ANDROID_SO_UNDEFINED ANDROID_FUNCTION_LEVEL_LINKING ANDROID_GOLD_LINKER ANDROID_NOEXECSTACK ANDROID_RELRO )
-
-# linker flags
-set( ANDROID_LINKER_FLAGS "" )
-
-if( ARMEABI_V7A )
- # this is *required* to use the following linker flags that routes around
- # a CPU bug in some Cortex-A8 implementations:
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--fix-cortex-a8" )
-endif()
-
-if( ANDROID_NO_UNDEFINED )
- if( MIPS )
- # there is some sysroot-related problem in mips linker...
- if( NOT ANDROID_SYSROOT MATCHES "[ ;\"]" )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined -Wl,-rpath-link,${ANDROID_SYSROOT}/usr/lib" )
- endif()
- else()
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--no-undefined" )
- endif()
-endif()
-
-if( ANDROID_SO_UNDEFINED )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-allow-shlib-undefined" )
-endif()
-
-if( ANDROID_FUNCTION_LEVEL_LINKING )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -fdata-sections -ffunction-sections" )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,--gc-sections" )
-endif()
-
-if( ANDROID_COMPILER_VERSION VERSION_EQUAL "4.6" )
- if( ANDROID_GOLD_LINKER AND (CMAKE_HOST_UNIX OR ANDROID_NDK_RELEASE_NUM GREATER 8002) AND (ARMEABI OR ARMEABI_V7A OR X86) )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=gold" )
- elseif( ANDROID_NDK_RELEASE_NUM GREATER 8002 ) # after r8b
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -fuse-ld=bfd" )
- elseif( ANDROID_NDK_RELEASE STREQUAL "r8b" AND ARMEABI AND NOT _CMAKE_IN_TRY_COMPILE )
- message( WARNING "The default bfd linker from arm GCC 4.6 toolchain can fail with 'unresolvable R_ARM_THM_CALL relocation' error message. See https://code.google.com/p/android/issues/detail?id=35342
- On Linux and OS X host platform you can workaround this problem using gold linker (default).
- Rerun cmake with -DANDROID_GOLD_LINKER=ON option in case of problems.
-" )
- endif()
-endif() # version 4.6
-
-if( ANDROID_NOEXECSTACK )
- if( ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Xclang -mnoexecstack" )
- else()
- set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS} -Wa,--noexecstack" )
- endif()
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,noexecstack" )
-endif()
-
-if( ANDROID_RELRO )
- set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} -Wl,-z,relro -Wl,-z,now" )
-endif()
-
-if( ANDROID_COMPILER_IS_CLANG )
- set( ANDROID_CXX_FLAGS "-target ${ANDROID_LLVM_TRIPLE} -Qunused-arguments ${ANDROID_CXX_FLAGS}" )
- if( BUILD_WITH_ANDROID_NDK )
- set( ANDROID_CXX_FLAGS "-gcc-toolchain ${ANDROID_TOOLCHAIN_ROOT} ${ANDROID_CXX_FLAGS}" )
- endif()
-endif()
-
-# cache flags
-set( CMAKE_CXX_FLAGS "" CACHE STRING "c++ flags" )
-set( CMAKE_C_FLAGS "" CACHE STRING "c flags" )
-set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c++ Release flags" )
-set( CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "c Release flags" )
-set( CMAKE_CXX_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c++ Debug flags" )
-set( CMAKE_C_FLAGS_DEBUG "-O0 -g -DDEBUG -D_DEBUG" CACHE STRING "c Debug flags" )
-set( CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "shared linker flags" )
-set( CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "module linker flags" )
-set( CMAKE_EXE_LINKER_FLAGS "-Wl,-z,nocopyreloc" CACHE STRING "executable linker flags" )
-
-# put flags to cache (for debug purpose only)
-set( ANDROID_CXX_FLAGS "${ANDROID_CXX_FLAGS}" CACHE INTERNAL "Android specific c/c++ flags" )
-set( ANDROID_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE}" CACHE INTERNAL "Android specific c/c++ Release flags" )
-set( ANDROID_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG}" CACHE INTERNAL "Android specific c/c++ Debug flags" )
-set( ANDROID_LINKER_FLAGS "${ANDROID_LINKER_FLAGS}" CACHE INTERNAL "Android specific c/c++ linker flags" )
-
-# finish flags
-set( CMAKE_CXX_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_CXX_FLAGS}" )
-set( CMAKE_C_FLAGS "${ANDROID_CXX_FLAGS} ${CMAKE_C_FLAGS}" )
-set( CMAKE_CXX_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}" )
-set( CMAKE_C_FLAGS_RELEASE "${ANDROID_CXX_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}" )
-set( CMAKE_CXX_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_CXX_FLAGS_DEBUG}" )
-set( CMAKE_C_FLAGS_DEBUG "${ANDROID_CXX_FLAGS_DEBUG} ${CMAKE_C_FLAGS_DEBUG}" )
-set( CMAKE_SHARED_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS}" )
-set( CMAKE_MODULE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_MODULE_LINKER_FLAGS}" )
-set( CMAKE_EXE_LINKER_FLAGS "${ANDROID_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS}" )
-
-if( MIPS AND BUILD_WITH_ANDROID_NDK AND ANDROID_NDK_RELEASE STREQUAL "r8" )
- set( CMAKE_SHARED_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_SHARED_LINKER_FLAGS}" )
- set( CMAKE_MODULE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.xsc ${CMAKE_MODULE_LINKER_FLAGS}" )
- set( CMAKE_EXE_LINKER_FLAGS "-Wl,-T,${ANDROID_NDK_TOOLCHAINS_PATH}/${ANDROID_GCC_TOOLCHAIN_NAME}/mipself.x ${CMAKE_EXE_LINKER_FLAGS}" )
-endif()
-
-# pie/pic
-if( NOT (ANDROID_NATIVE_API_LEVEL LESS 16) AND (NOT DEFINED ANDROID_APP_PIE OR ANDROID_APP_PIE) AND (CMAKE_VERSION VERSION_GREATER 2.8.8) )
- set( CMAKE_POSITION_INDEPENDENT_CODE TRUE )
- set( CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
-else()
- set( CMAKE_POSITION_INDEPENDENT_CODE FALSE )
- set( CMAKE_CXX_FLAGS "-fpic ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fpic ${CMAKE_C_FLAGS}" )
-endif()
-
-# configure rtti
-if( DEFINED ANDROID_RTTI AND ANDROID_STL_FORCE_FEATURES )
- if( ANDROID_RTTI )
- set( CMAKE_CXX_FLAGS "-frtti ${CMAKE_CXX_FLAGS}" )
- else()
- set( CMAKE_CXX_FLAGS "-fno-rtti ${CMAKE_CXX_FLAGS}" )
- endif()
-endif()
-
-# configure exceptios
-if( DEFINED ANDROID_EXCEPTIONS AND ANDROID_STL_FORCE_FEATURES )
- if( ANDROID_EXCEPTIONS )
- set( CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}" )
- else()
- set( CMAKE_CXX_FLAGS "-fno-exceptions ${CMAKE_CXX_FLAGS}" )
- set( CMAKE_C_FLAGS "-fno-exceptions ${CMAKE_C_FLAGS}" )
- endif()
-endif()
-
-# global includes and link directories
-include_directories( SYSTEM "${ANDROID_SYSROOT}/usr/include" ${ANDROID_STL_INCLUDE_DIRS} )
-get_filename_component(__android_install_path "${CMAKE_INSTALL_PREFIX}/libs/${ANDROID_NDK_ABI_NAME}" ABSOLUTE) # avoid CMP0015 policy warning
-link_directories( "${__android_install_path}" )
-
-# detect if need link crtbegin_so.o explicitly
-if( NOT DEFINED ANDROID_EXPLICIT_CRT_LINK )
- set( __cmd "${CMAKE_CXX_CREATE_SHARED_LIBRARY}" )
- string( REPLACE "<CMAKE_CXX_COMPILER>" "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_C_COMPILER>" "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_CXX_FLAGS>" "${CMAKE_CXX_FLAGS}" __cmd "${__cmd}" )
- string( REPLACE "<LANGUAGE_COMPILE_FLAGS>" "" __cmd "${__cmd}" )
- string( REPLACE "<LINK_FLAGS>" "${CMAKE_SHARED_LINKER_FLAGS}" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS>" "-shared" __cmd "${__cmd}" )
- string( REPLACE "<CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG>" "" __cmd "${__cmd}" )
- string( REPLACE "<TARGET_SONAME>" "" __cmd "${__cmd}" )
- string( REPLACE "<TARGET>" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/toolchain_crtlink_test.so" __cmd "${__cmd}" )
- string( REPLACE "<OBJECTS>" "\"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" __cmd "${__cmd}" )
- string( REPLACE "<LINK_LIBRARIES>" "" __cmd "${__cmd}" )
- separate_arguments( __cmd )
- foreach( __var ANDROID_NDK ANDROID_NDK_TOOLCHAINS_PATH ANDROID_STANDALONE_TOOLCHAIN )
- if( ${__var} )
- set( __tmp "${${__var}}" )
- separate_arguments( __tmp )
- string( REPLACE "${__tmp}" "${${__var}}" __cmd "${__cmd}")
- endif()
- endforeach()
- string( REPLACE "'" "" __cmd "${__cmd}" )
- string( REPLACE "\"" "" __cmd "${__cmd}" )
- execute_process( COMMAND ${__cmd} RESULT_VARIABLE __cmd_result OUTPUT_QUIET ERROR_QUIET )
- if( __cmd_result EQUAL 0 )
- set( ANDROID_EXPLICIT_CRT_LINK ON )
- else()
- set( ANDROID_EXPLICIT_CRT_LINK OFF )
- endif()
-endif()
-
-if( ANDROID_EXPLICIT_CRT_LINK )
- set( CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
- set( CMAKE_CXX_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE} \"${ANDROID_SYSROOT}/usr/lib/crtbegin_so.o\"" )
-endif()
-
-# setup output directories
-set( CMAKE_INSTALL_PREFIX "${ANDROID_TOOLCHAIN_ROOT}/user" CACHE STRING "path for installing" )
-
-if( DEFINED LIBRARY_OUTPUT_PATH_ROOT
- OR EXISTS "${CMAKE_SOURCE_DIR}/AndroidManifest.xml"
- OR (EXISTS "${CMAKE_SOURCE_DIR}/../AndroidManifest.xml" AND EXISTS "${CMAKE_SOURCE_DIR}/../jni/") )
- set( LIBRARY_OUTPUT_PATH_ROOT ${CMAKE_SOURCE_DIR} CACHE PATH "Root for binaries output, set this to change where Android libs are installed to" )
- if( NOT _CMAKE_IN_TRY_COMPILE )
- if( EXISTS "${CMAKE_SOURCE_DIR}/jni/CMakeLists.txt" )
- set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for applications" )
- else()
- set( EXECUTABLE_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/bin" CACHE PATH "Output directory for applications" )
- endif()
- set( LIBRARY_OUTPUT_PATH "${LIBRARY_OUTPUT_PATH_ROOT}/libs/${ANDROID_NDK_ABI_NAME}" CACHE PATH "Output directory for Android libs" )
- endif()
-endif()
-
-# copy shaed stl library to build directory
-if( NOT _CMAKE_IN_TRY_COMPILE AND __libstl MATCHES "[.]so$" AND DEFINED LIBRARY_OUTPUT_PATH )
- get_filename_component( __libstlname "${__libstl}" NAME )
- execute_process( COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${__libstl}" "${LIBRARY_OUTPUT_PATH}/${__libstlname}" RESULT_VARIABLE __fileCopyProcess )
- if( NOT __fileCopyProcess EQUAL 0 OR NOT EXISTS "${LIBRARY_OUTPUT_PATH}/${__libstlname}")
- message( SEND_ERROR "Failed copying of ${__libstl} to the ${LIBRARY_OUTPUT_PATH}/${__libstlname}" )
- endif()
- unset( __fileCopyProcess )
- unset( __libstlname )
-endif()
-
-
-# set these global flags for cmake client scripts to change behavior
-set( ANDROID True )
-set( BUILD_ANDROID True )
-
-# where is the target environment
-set( CMAKE_FIND_ROOT_PATH "${ANDROID_TOOLCHAIN_ROOT}/bin" "${ANDROID_TOOLCHAIN_ROOT}/${ANDROID_TOOLCHAIN_MACHINE_NAME}" "${ANDROID_SYSROOT}" "${CMAKE_INSTALL_PREFIX}" "${CMAKE_INSTALL_PREFIX}/share" )
-
-# only search for libraries and includes in the ndk toolchain
-set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
-set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
-set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
-
-
-# macro to find packages on the host OS
-macro( find_host_package )
- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
- set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
- set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
- if( CMAKE_HOST_WIN32 )
- SET( WIN32 1 )
- SET( UNIX )
- elseif( CMAKE_HOST_APPLE )
- SET( APPLE 1 )
- SET( UNIX )
- endif()
- find_package( ${ARGN} )
- SET( WIN32 )
- SET( APPLE )
- SET( UNIX 1 )
- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
- set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
- set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
-endmacro()
-
-
-# macro to find programs on the host OS
-macro( find_host_program )
- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
- set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER )
- set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER )
- if( CMAKE_HOST_WIN32 )
- SET( WIN32 1 )
- SET( UNIX )
- elseif( CMAKE_HOST_APPLE )
- SET( APPLE 1 )
- SET( UNIX )
- endif()
- find_program( ${ARGN} )
- SET( WIN32 )
- SET( APPLE )
- SET( UNIX 1 )
- set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY )
- set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
- set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
-endmacro()
-
-
-# export toolchain settings for the try_compile() command
-if( NOT _CMAKE_IN_TRY_COMPILE )
- set( __toolchain_config "")
- foreach( __var NDK_CCACHE LIBRARY_OUTPUT_PATH_ROOT ANDROID_FORBID_SYGWIN
- ANDROID_NDK_HOST_X64
- ANDROID_NDK
- ANDROID_NDK_LAYOUT
- ANDROID_STANDALONE_TOOLCHAIN
- ANDROID_TOOLCHAIN_NAME
- ANDROID_ABI
- ANDROID_NATIVE_API_LEVEL
- ANDROID_STL
- ANDROID_STL_FORCE_FEATURES
- ANDROID_FORCE_ARM_BUILD
- ANDROID_NO_UNDEFINED
- ANDROID_SO_UNDEFINED
- ANDROID_FUNCTION_LEVEL_LINKING
- ANDROID_GOLD_LINKER
- ANDROID_NOEXECSTACK
- ANDROID_RELRO
- ANDROID_LIBM_PATH
- ANDROID_EXPLICIT_CRT_LINK
- ANDROID_APP_PIE
- )
- if( DEFINED ${__var} )
- if( ${__var} MATCHES " ")
- set( __toolchain_config "${__toolchain_config}set( ${__var} \"${${__var}}\" CACHE INTERNAL \"\" )\n" )
- else()
- set( __toolchain_config "${__toolchain_config}set( ${__var} ${${__var}} CACHE INTERNAL \"\" )\n" )
- endif()
- endif()
- endforeach()
- file( WRITE "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/android.toolchain.config.cmake" "${__toolchain_config}" )
- unset( __toolchain_config )
-endif()
-
-
-# force cmake to produce / instead of \ in build commands for Ninja generator
-if( CMAKE_GENERATOR MATCHES "Ninja" AND CMAKE_HOST_WIN32 )
- # it is a bad hack after all
- # CMake generates Ninja makefiles with UNIX paths only if it thinks that we are going to build with MinGW
- set( CMAKE_COMPILER_IS_MINGW TRUE ) # tell CMake that we are MinGW
- set( CMAKE_CROSSCOMPILING TRUE ) # stop recursion
- enable_language( C )
- enable_language( CXX )
- # unset( CMAKE_COMPILER_IS_MINGW ) # can't unset because CMake does not convert back-slashes in response files without it
- unset( MINGW )
-endif()
-
-
-# Variables controlling behavior or set by cmake toolchain:
-# ANDROID_ABI : "armeabi-v7a" (default), "armeabi", "armeabi-v7a with NEON", "armeabi-v7a with VFPV3", "armeabi-v6 with VFP", "x86", "mips", "arm64-v8a", "x86_64", "mips64"
-# ANDROID_NATIVE_API_LEVEL : 3,4,5,8,9,14,15,16,17,18,19,21 (depends on NDK version)
-# ANDROID_STL : gnustl_static/gnustl_shared/stlport_static/stlport_shared/gabi++_static/gabi++_shared/system_re/system/none
-# ANDROID_FORBID_SYGWIN : ON/OFF
-# ANDROID_NO_UNDEFINED : ON/OFF
-# ANDROID_SO_UNDEFINED : OFF/ON (default depends on NDK version)
-# ANDROID_FUNCTION_LEVEL_LINKING : ON/OFF
-# ANDROID_GOLD_LINKER : ON/OFF
-# ANDROID_NOEXECSTACK : ON/OFF
-# ANDROID_RELRO : ON/OFF
-# ANDROID_FORCE_ARM_BUILD : ON/OFF
-# ANDROID_STL_FORCE_FEATURES : ON/OFF
-# ANDROID_LIBM_PATH : path to libm.so (set to something like $(TOP)/out/target/product/<product_name>/obj/lib/libm.so) to workaround unresolved `sincos`
-# Can be set only at the first run:
-# ANDROID_NDK : path to your NDK install
-# NDK_CCACHE : path to your ccache executable
-# ANDROID_TOOLCHAIN_NAME : the NDK name of compiler toolchain
-# ANDROID_NDK_HOST_X64 : try to use x86_64 toolchain (default for x64 host systems)
-# ANDROID_NDK_LAYOUT : the inner NDK structure (RELEASE, LINARO, ANDROID)
-# LIBRARY_OUTPUT_PATH_ROOT : <any valid path>
-# ANDROID_STANDALONE_TOOLCHAIN
-#
-# Primary read-only variables:
-# ANDROID : always TRUE
-# ARMEABI : TRUE for arm v6 and older devices
-# ARMEABI_V6 : TRUE for arm v6
-# ARMEABI_V7A : TRUE for arm v7a
-# ARM64_V8A : TRUE for arm64-v8a
-# NEON : TRUE if NEON unit is enabled
-# VFPV3 : TRUE if VFP version 3 is enabled
-# X86 : TRUE if configured for x86
-# X86_64 : TRUE if configured for x86_64
-# MIPS : TRUE if configured for mips
-# MIPS64 : TRUE if configured for mips64
-# BUILD_WITH_ANDROID_NDK : TRUE if NDK is used
-# BUILD_WITH_STANDALONE_TOOLCHAIN : TRUE if standalone toolchain is used
-# ANDROID_NDK_HOST_SYSTEM_NAME : "windows", "linux-x86" or "darwin-x86" depending on host platform
-# ANDROID_NDK_ABI_NAME : "armeabi", "armeabi-v7a", "x86", "mips", "arm64-v8a", "x86_64", "mips64" depending on ANDROID_ABI
-# ANDROID_NDK_RELEASE : from r5 to r10d; set only for NDK
-# ANDROID_NDK_RELEASE_NUM : numeric ANDROID_NDK_RELEASE version (1000*major+minor)
-# ANDROID_ARCH_NAME : "arm", "x86", "mips", "arm64", "x86_64", "mips64" depending on ANDROID_ABI
-# ANDROID_SYSROOT : path to the compiler sysroot
-# TOOL_OS_SUFFIX : "" or ".exe" depending on host platform
-# ANDROID_COMPILER_IS_CLANG : TRUE if clang compiler is used
-#
-# Secondary (less stable) read-only variables:
-# ANDROID_COMPILER_VERSION : GCC version used (not Clang version)
-# ANDROID_CLANG_VERSION : version of clang compiler if clang is used
-# ANDROID_CXX_FLAGS : C/C++ compiler flags required by Android platform
-# ANDROID_SUPPORTED_ABIS : list of currently allowed values for ANDROID_ABI
-# ANDROID_TOOLCHAIN_MACHINE_NAME : "arm-linux-androideabi", "arm-eabi" or "i686-android-linux"
-# ANDROID_TOOLCHAIN_ROOT : path to the top level of toolchain (standalone or placed inside NDK)
-# ANDROID_CLANG_TOOLCHAIN_ROOT : path to clang tools
-# ANDROID_SUPPORTED_NATIVE_API_LEVELS : list of native API levels found inside NDK
-# ANDROID_STL_INCLUDE_DIRS : stl include paths
-# ANDROID_RTTI : if rtti is enabled by the runtime
-# ANDROID_EXCEPTIONS : if exceptions are enabled by the runtime
-# ANDROID_GCC_TOOLCHAIN_NAME : read-only, differs from ANDROID_TOOLCHAIN_NAME only if clang is used
-#
-# Defaults:
-# ANDROID_DEFAULT_NDK_API_LEVEL
-# ANDROID_DEFAULT_NDK_API_LEVEL_${ARCH}
-# ANDROID_NDK_SEARCH_PATHS
-# ANDROID_SUPPORTED_ABIS_${ARCH}
-# ANDROID_SUPPORTED_NDK_VERSIONS
diff --git a/cmake/Toolchain-blackberry-armv7le.cmake b/cmake/Toolchain-blackberry-armv7le.cmake
index 9ee9c36c..60cc1ed9 100644
--- a/cmake/Toolchain-blackberry-armv7le.cmake
+++ b/cmake/Toolchain-blackberry-armv7le.cmake
@@ -1,32 +1,9 @@
# Basic cmake toolchain file for BlackBerry 10
-# Copyright (c) 2013-2016 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Rafael Roquetto <rafael.roquetto@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
# the name of the target operating system
set(CMAKE_SYSTEM_NAME QNX)
@@ -51,5 +28,6 @@ set(CMAKE_RANLIB "$ENV{QNX_HOST}/usr/bin/ntoarmv7-ranlib${HOST_EXECUTABLE_SUFFIX
# search headers and libraries in the target environment, search
# programs in the host environment
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/Toolchain-iMX6.cmake b/cmake/Toolchain-iMX6.cmake
index d5da1d20..f27146c5 100644
--- a/cmake/Toolchain-iMX6.cmake
+++ b/cmake/Toolchain-iMX6.cmake
@@ -2,37 +2,15 @@
# Assumptions: toolchain is in path, $SYSROOT points to the sysroot
#
-# Copyright (c) 2013-2016 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Volker Krause <volker.krause@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "armv7-a")
set(CMAKE_C_COMPILER "arm-linux-gcc")
+set(CMAKE_CXX_COMPILER "arm-linux-g++")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=$ENV{SYSROOT} -march=armv7-a -mfpu=neon")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=$ENV{SYSROOT} -march=armv7-a -mfpu=neon")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=$ENV{SYSROOT}")
@@ -42,5 +20,6 @@ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --sysroot=$ENV{SYSRO
set(CMAKE_FIND_ROOT_PATH "$ENV{SYSROOT}")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/Toolchain-iOS.cmake b/cmake/Toolchain-iOS.cmake
deleted file mode 100644
index 0bc7f744..00000000
--- a/cmake/Toolchain-iOS.cmake
+++ /dev/null
@@ -1,130 +0,0 @@
-# This file is based off of the Platform/Darwin.cmake and Platform/UnixPaths.cmake
-# files which are included with CMake 2.8.4
-# It has been altered for iOS development
-
-# Options:
-#
-# IOS_PLATFORM = OS (default) or SIMULATOR
-# This decides if SDKS will be selected from the iPhoneOS.platform or iPhoneSimulator.platform folders
-# OS - the default, used to build for iPhone and iPad physical devices, which have an arm arch.
-# SIMULATOR - used to build for the Simulator platforms, which have an x86 arch.
-#
-# CMAKE_IOS_DEVELOPER_ROOT = automatic(default) or /path/to/platform/Developer folder
-# By default this location is automatcially chosen based on the IOS_PLATFORM value above.
-# If set manually, it will override the default location and force the user of a particular Developer Platform
-#
-# CMAKE_IOS_SDK_ROOT = automatic(default) or /path/to/platform/Developer/SDKs/SDK folder
-# By default this location is automatcially chosen based on the CMAKE_IOS_DEVELOPER_ROOT value.
-# In this case it will always be the most up-to-date SDK found in the CMAKE_IOS_DEVELOPER_ROOT path.
-# If set manually, this will force the use of a specific SDK version
-
-# Standard settings
-set (CMAKE_SYSTEM_NAME Darwin)
-set (CMAKE_SYSTEM_VERSION 1 )
-set (UNIX True)
-set (APPLE True)
-set (IOS True)
-
-# Force the compilers to gcc for iOS
-include (CMakeForceCompiler)
-CMAKE_FORCE_C_COMPILER (gcc gcc)
-CMAKE_FORCE_CXX_COMPILER (g++ g++)
-
-# Skip the platform compiler checks for cross compiling
-set (CMAKE_CXX_COMPILER_WORKS TRUE)
-set (CMAKE_C_COMPILER_WORKS TRUE)
-
-# All iOS/Darwin specific settings - some may be redundant
-set (CMAKE_SHARED_LIBRARY_PREFIX "lib")
-set (CMAKE_SHARED_LIBRARY_SUFFIX ".dylib")
-set (CMAKE_SHARED_MODULE_PREFIX "lib")
-set (CMAKE_SHARED_MODULE_SUFFIX ".so")
-set (CMAKE_MODULE_EXISTS 1)
-set (CMAKE_DL_LIBS "")
-
-set (CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG "-compatibility_version ")
-set (CMAKE_C_OSX_CURRENT_VERSION_FLAG "-current_version ")
-set (CMAKE_CXX_OSX_COMPATIBILITY_VERSION_FLAG "${CMAKE_C_OSX_COMPATIBILITY_VERSION_FLAG}")
-set (CMAKE_CXX_OSX_CURRENT_VERSION_FLAG "${CMAKE_C_OSX_CURRENT_VERSION_FLAG}")
-
-# Hidden visibility is required for cxx on iOS
-set (CMAKE_C_FLAGS "")
-set (CMAKE_CXX_FLAGS "-headerpad_max_install_names -fvisibility=hidden -fvisibility-inlines-hidden")
-
-set (CMAKE_C_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_C_LINK_FLAGS}")
-set (CMAKE_CXX_LINK_FLAGS "-Wl,-search_paths_first ${CMAKE_CXX_LINK_FLAGS}")
-
-set (CMAKE_PLATFORM_HAS_INSTALLNAME 1)
-set (CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -headerpad_max_install_names")
-set (CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -headerpad_max_install_names")
-set (CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
-set (CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
-set (CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")
-
-# hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree
-# (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache
-# and still cmake didn't fail in CMakeFindBinUtils.cmake (because it isn't rerun)
-# hardcode CMAKE_INSTALL_NAME_TOOL here to install_name_tool, so it behaves as it did before, Alex
-if (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
- find_program(CMAKE_INSTALL_NAME_TOOL install_name_tool)
-endif (NOT DEFINED CMAKE_INSTALL_NAME_TOOL)
-
-# Setup iOS platform
-if (NOT DEFINED IOS_PLATFORM)
- set (IOS_PLATFORM "OS")
-endif (NOT DEFINED IOS_PLATFORM)
-set (IOS_PLATFORM ${IOS_PLATFORM} CACHE STRING "Type of iOS Platform")
-
-# Check the platform selection and setup for developer root
-if (${IOS_PLATFORM} STREQUAL "OS")
- set (IOS_PLATFORM_LOCATION "iPhoneOS.platform")
-elseif (${IOS_PLATFORM} STREQUAL "SIMULATOR")
- set (IOS_PLATFORM_LOCATION "iPhoneSimulator.platform")
-else (${IOS_PLATFORM} STREQUAL "OS")
- message (FATAL_ERROR "Unsupported IOS_PLATFORM value selected. Please choose OS or SIMULATOR")
-endif (${IOS_PLATFORM} STREQUAL "OS")
-
-# Setup iOS developer location
-if (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
- set (CMAKE_IOS_DEVELOPER_ROOT "/Developer/Platforms/${IOS_PLATFORM_LOCATION}/Developer")
-endif (NOT DEFINED CMAKE_IOS_DEVELOPER_ROOT)
-set (CMAKE_IOS_DEVELOPER_ROOT ${CMAKE_IOS_DEVELOPER_ROOT} CACHE PATH "Location of iOS Platform")
-
-# Find and use the most recent iOS sdk
-if (NOT DEFINED CMAKE_IOS_SDK_ROOT)
- file (GLOB _CMAKE_IOS_SDKS "${CMAKE_IOS_DEVELOPER_ROOT}/SDKs/*")
- if (_CMAKE_IOS_SDKS)
- list (SORT _CMAKE_IOS_SDKS)
- list (REVERSE _CMAKE_IOS_SDKS)
- list (GET _CMAKE_IOS_SDKS 0 CMAKE_IOS_SDK_ROOT)
- else (_CMAKE_IOS_SDKS)
- message (FATAL_ERROR "No iOS SDKs found in default search path ${CMAKE_IOS_DEVELOPER_ROOT}. Manually set CMAKE_IOS_SDK_ROOT or install the iOS SDK.")
- endif (_CMAKE_IOS_SDKS)
- message (STATUS "Toolchain using default iOS SDK: ${CMAKE_IOS_SDK_ROOT}")
-endif (NOT DEFINED CMAKE_IOS_SDK_ROOT)
-set (CMAKE_IOS_SDK_ROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Location of the selected iOS SDK")
-
-# Set the sysroot default to the most recent SDK
-set (CMAKE_OSX_SYSROOT ${CMAKE_IOS_SDK_ROOT} CACHE PATH "Sysroot used for iOS support")
-
-# set the architecture for iOS - using ARCHS_STANDARD_32_BIT sets armv6,armv7 and appears to be XCode's standard.
-# The other value that works is ARCHS_UNIVERSAL_IPHONE_OS but that sets armv7 only
-set (CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD_32_BIT)" CACHE string "Build architecture for iOS")
-
-# Set the find root to the iOS developer roots and to user defined paths
-set (CMAKE_FIND_ROOT_PATH ${CMAKE_IOS_DEVELOPER_ROOT} ${CMAKE_IOS_SDK_ROOT} ${CMAKE_PREFIX_PATH} CACHE string "iOS find search path root")
-
-# default to searching for frameworks first
-set (CMAKE_FIND_FRAMEWORK FIRST)
-
-# set up the default search directories for frameworks
-set (CMAKE_SYSTEM_FRAMEWORK_PATH
- ${CMAKE_IOS_SDK_ROOT}/System/Library/Frameworks
- ${CMAKE_IOS_SDK_ROOT}/System/Library/PrivateFrameworks
- ${CMAKE_IOS_SDK_ROOT}/Developer/Library/Frameworks
-)
-
-# only search the iOS sdks, not the remainder of the host filesystem
-set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
-set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
-set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
diff --git a/cmake/Toolchain-jetson-tk1.cmake b/cmake/Toolchain-jetson-tk1.cmake
index bfd08505..14c984b9 100644
--- a/cmake/Toolchain-jetson-tk1.cmake
+++ b/cmake/Toolchain-jetson-tk1.cmake
@@ -2,33 +2,10 @@
# Assumptions: toolchain is in path, $SYSROOT points to the sysroot
#
-# Copyright (c) 2013-2018 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
-# All rights reserved.
-#
+# SPDX-FileCopyrightText: 2013-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
# Author: Volker Krause <volker.krause@kdab.com>
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# 1. Redistributions of source code must retain the copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-# 3. The name of the author may not be used to endorse or promote products
-# derived from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
+
+# SPDX-License-Identifier: BSD-3-Clause
set(CMAKE_SYSTEM_NAME "Linux")
set(CMAKE_SYSTEM_PROCESSOR "armv7-a")
diff --git a/cmake/modules/FindBDB.cmake b/cmake/modules/FindBDB.cmake
index 8c9616eb..312901c0 100644
--- a/cmake/modules/FindBDB.cmake
+++ b/cmake/modules/FindBDB.cmake
@@ -1,3 +1,7 @@
+#
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: BSD-3-Clause
+#
# Finds the Berkeley DB Library
#
# BDB_FOUND - True if Berkeley DB found.
diff --git a/cmake/modules/FindBerkeleyDB.cmake b/cmake/modules/FindBerkeleyDB.cmake
new file mode 100644
index 00000000..63ffe9dc
--- /dev/null
+++ b/cmake/modules/FindBerkeleyDB.cmake
@@ -0,0 +1,168 @@
+
+# SPDX-FileCopyrightText: sum01 <sum01@protonmail.com>
+# SPDX-License-Identifier: Unlicense
+
+# Git: https://github.com/sum01/FindBerkeleyDB
+
+# NOTE: If Berkeley DB ever gets a Pkg-config ".pc" file, add pkg_check_modules() here
+
+# Checks if environment paths are empty, set them if they aren't
+set(_BERKELEYDB_PATHS "")
+if(NOT _BERKELEYDB_PATHS AND DEFINED BERKELEYDB_ROOT)
+ if($ENV{BERKELEYDB_ROOT} AND NOT "$ENV{BERKELEYDB_ROOT}" STREQUAL "")
+ set(_BERKELEYDB_PATHS "$ENV{BERKELEYDB_ROOT}")
+ endif()
+endif()
+if(NOT _BERKELEYDB_PATHS AND DEFINED Berkeleydb_ROOT)
+ if($ENV{Berkeleydb_ROOT} AND NOT "$ENV{Berkeleydb_ROOT}" STREQUAL "")
+ set(_BERKELEYDB_PATHS "$ENV{Berkeleydb_ROOT}")
+ endif()
+endif()
+if(NOT _BERKELEYDB_PATHS AND DEFINED BERKELEYDBROOT)
+ if($ENV{BERKELEYDBROOT} AND NOT "$ENV{BERKELEYDBROOT}" STREQUAL "")
+ set(_BERKELEYDB_PATHS "$ENV{BERKELEYDBROOT}")
+ endif()
+endif()
+
+# Allow user to pass a path instead of guessing
+if(BerkeleyDB_ROOT_DIR)
+ set(_BERKELEYDB_PATHS "${BerkeleyDB_ROOT_DIR}")
+elseif(CMAKE_SYSTEM_NAME MATCHES ".*[wW]indows.*")
+ # MATCHES is used to work on any devies with windows in the name
+ # Shameless copy-paste from FindOpenSSL.cmake v3.8
+ file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
+ list(APPEND _BERKELEYDB_PATHS "${_programfiles}")
+
+ # There's actually production release and version numbers in the file path.
+ # For example, if they're on v6.2.32: C:/Program Files/Oracle/Berkeley DB 12cR1 6.2.32/
+ # But this still works to find it, so I'm guessing it can accept partial path matches.
+
+ foreach(_target_berkeleydb_path "Oracle/Berkeley DB" "Berkeley DB")
+ list(APPEND _BERKELEYDB_PATHS
+ "${_programfiles}/${_target_berkeleydb_path}"
+ "C:/Program Files (x86)/${_target_berkeleydb_path}"
+ "C:/Program Files/${_target_berkeleydb_path}"
+ "C:/${_target_berkeleydb_path}"
+ )
+ endforeach()
+else()
+ # Paths for anything other than Windows
+ # Cellar/berkeley-db is for macOS from homebrew installation
+ list(APPEND _BERKELEYDB_PATHS
+ "/usr"
+ "/usr/local"
+ "/usr/local/Cellar/berkeley-db"
+ "/opt"
+ "/opt/local"
+ )
+endif()
+
+# Find includes path
+find_path(BerkeleyDB_INCLUDE_DIRS
+ NAMES "db.h"
+ HINTS ${_BERKELEYDB_PATHS}
+ PATH_SUFFIXES "include" "includes"
+)
+
+# Checks if the version file exists, save the version file to a var, and fail if there's no version file
+if(BerkeleyDB_INCLUDE_DIRS)
+ # Read the version file db.h into a variable
+ file(READ "${BerkeleyDB_INCLUDE_DIRS}/db.h" _BERKELEYDB_DB_HEADER)
+ # Parse the DB version into variables to be used in the lib names
+ string(REGEX REPLACE ".*DB_VERSION_MAJOR ([0-9]+).*" "\\1" BerkeleyDB_VERSION_MAJOR "${_BERKELEYDB_DB_HEADER}")
+ string(REGEX REPLACE ".*DB_VERSION_MINOR ([0-9]+).*" "\\1" BerkeleyDB_VERSION_MINOR "${_BERKELEYDB_DB_HEADER}")
+ # Patch version example on non-crypto installs: x.x.xNC
+ string(REGEX REPLACE ".*DB_VERSION_PATCH ([0-9]+(NC)?).*" "\\1" BerkeleyDB_VERSION_PATCH "${_BERKELEYDB_DB_HEADER}")
+else()
+ if(BerkeleyDB_FIND_REQUIRED)
+ # If the find_package(BerkeleyDB REQUIRED) was used, fail since we couldn't find the header
+ message(FATAL_ERROR
+ "Failed to find Berkeley DB's header file \"db.h\"! Try setting \"BerkeleyDB_ROOT_DIR\" when initiating Cmake.")
+ endif()
+ # Set some garbage values to the versions since we didn't find a file to read
+ set(BerkeleyDB_VERSION_MAJOR "0")
+ set(BerkeleyDB_VERSION_MINOR "0")
+ set(BerkeleyDB_VERSION_PATCH "0")
+endif()
+
+# The actual returned/output version variable (the others can be used if needed)
+set(BerkeleyDB_VERSION "${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}.${BerkeleyDB_VERSION_PATCH}")
+
+set(BerkeleyDB_LIBRARIES "")
+# Finds the target library for berkeley db, since they all follow the same naming conventions
+macro(findpackage_berkeleydb_get_lib _berkeleydb_output_varname _target_berkeleydb_lib)
+ # Different systems sometimes have a version in the lib name...
+ # and some have a dash or underscore before the versions.
+ # CMake recommends to put unversioned names before versioned names
+ find_library(${_berkeleydb_output_varname}
+ NAMES
+ "${_target_berkeleydb_lib}"
+ "lib${_target_berkeleydb_lib}"
+ "lib${_target_berkeleydb_lib}${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}-${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}_${BerkeleyDB_VERSION_MAJOR}.${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}-${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}_${BerkeleyDB_VERSION_MAJOR}${BerkeleyDB_VERSION_MINOR}"
+ "lib${_target_berkeleydb_lib}${BerkeleyDB_VERSION_MAJOR}"
+ "lib${_target_berkeleydb_lib}-${BerkeleyDB_VERSION_MAJOR}"
+ "lib${_target_berkeleydb_lib}_${BerkeleyDB_VERSION_MAJOR}"
+ HINTS ${_BERKELEYDB_PATHS}
+ PATH_SUFFIXES "lib" "lib64" "libs" "libs64"
+ )
+ # If the library was found, add it to our list of libraries
+ if(${_berkeleydb_output_varname})
+ # If found, append to our libraries variable
+ # The ${{}} is because the first expands to target the real variable, the second expands
+ # the variable's contents... and the real variable's contents is the path to the lib. Thus,
+ # it appends the path of the lib to BerkeleyDB_LIBRARIES.
+ list(APPEND BerkeleyDB_LIBRARIES "${${_berkeleydb_output_varname}}")
+ endif()
+endmacro()
+
+# Find and set the paths of the specific library to the variable
+findpackage_berkeleydb_get_lib(BerkeleyDB_LIBRARY "db")
+# NOTE: Windows doesn't have a db_cxx lib, but instead compiles the cxx code into the "db" lib
+findpackage_berkeleydb_get_lib(BerkeleyDB_Cxx_LIBRARY "db_cxx")
+# NOTE: I don't think Linux/Unix gets an SQL lib
+findpackage_berkeleydb_get_lib(BerkeleyDB_Sql_LIBRARY "db_sql")
+findpackage_berkeleydb_get_lib(BerkeleyDB_Stl_LIBRARY "db_stl")
+
+# Needed for find_package_handle_standard_args()
+include(FindPackageHandleStandardArgs)
+# Fails if required vars aren't found, or if the version doesn't meet specifications.
+find_package_handle_standard_args(BerkeleyDB
+ FOUND_VAR BerkeleyDB_FOUND
+ REQUIRED_VARS
+ BerkeleyDB_INCLUDE_DIRS
+ BerkeleyDB_LIBRARY
+ VERSION_VAR BerkeleyDB_VERSION
+)
+
+# Create an imported lib for easy linking by external projects
+if(BerkeleyDB_FOUND AND BerkeleyDB_LIBRARIES AND NOT TARGET Oracle::BerkeleyDB)
+ add_library(Oracle::BerkeleyDB UNKNOWN IMPORTED)
+ set_target_properties(Oracle::BerkeleyDB PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${BerkeleyDB_INCLUDE_DIRS}"
+ IMPORTED_LOCATION "${BerkeleyDB_LIBRARY}"
+ INTERFACE_LINK_LIBRARIES "${BerkeleyDB_LIBRARIES}"
+ )
+endif()
+
+# Only show the includes path and libraries in the GUI if they click "advanced".
+# Does nothing when using the CLI
+mark_as_advanced(FORCE
+ BerkeleyDB_INCLUDE_DIRS
+ BerkeleyDB_LIBRARIES
+ BerkeleyDB_LIBRARY
+ BerkeleyDB_Cxx_LIBRARY
+ BerkeleyDB_Sql_LIBRARY
+ BerkeleyDB_Stl_LIBRARY
+)
+
+include(FindPackageMessage)
+# A message that tells the user what includes/libs were found, and obeys the QUIET command.
+find_package_message(BerkeleyDB
+ "Found BerkeleyDB libraries: ${BerkeleyDB_LIBRARIES}"
+ "[${BerkeleyDB_LIBRARIES}[${BerkeleyDB_INCLUDE_DIRS}]]"
+)
diff --git a/cmake/modules/FindGLib.cmake b/cmake/modules/FindGLib.cmake
index 1092dc14..9dabe310 100644
--- a/cmake/modules/FindGLib.cmake
+++ b/cmake/modules/FindGLib.cmake
@@ -1,5 +1,8 @@
-# - try to find glib
#
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# - try to find glib
# Once done this will define
#
# GLIB_FOUND - system has GLib 2.0
diff --git a/cmake/modules/FindGObjectIntrospection.cmake b/cmake/modules/FindGObjectIntrospection.cmake
index 02841f4f..2eb289a9 100644
--- a/cmake/modules/FindGObjectIntrospection.cmake
+++ b/cmake/modules/FindGObjectIntrospection.cmake
@@ -11,11 +11,11 @@
# GObjectIntrospection_CFLAGS
# GObjectIntrospection_LIBS
#
-# Copyright (C) 2010, Pino Toscano, <pino@kde.org>
+# SPDX-FileCopyrightText: 2010, Pino Toscano, <pino@kde.org>
+# SPDX-License-Identifier: BSD-3-Clause
#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+# Get gobject-introspection's specified pkg-config variable
macro(_GIR_GET_PKGCONFIG_VAR _outvar _varname)
execute_process(
COMMAND ${PKG_CONFIG_EXECUTABLE} --variable=${_varname} gobject-introspection-1.0
@@ -27,7 +27,7 @@ macro(_GIR_GET_PKGCONFIG_VAR _outvar _varname)
else()
string(REGEX REPLACE "[\r\n]" " " _result "${_result}")
string(REGEX REPLACE " +$" "" _result "${_result}")
- separate_arguments(_result)
+ separate_arguments(_result UNIX_COMMAND ${_result})
set(${_outvar} ${_result} CACHE INTERNAL "")
endif()
endmacro(_GIR_GET_PKGCONFIG_VAR)
diff --git a/cmake/modules/FindLibXML.cmake b/cmake/modules/FindLibXML.cmake
index 3c418b67..891a8004 100644
--- a/cmake/modules/FindLibXML.cmake
+++ b/cmake/modules/FindLibXML.cmake
@@ -1,5 +1,8 @@
-# - try to find libxml
#
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# - try to find libxml
# Once done this will define
#
# LIBXML_FOUND - system has libxml 2.0
diff --git a/cmake/modules/FindWcecompat.cmake b/cmake/modules/FindWcecompat.cmake
index 4af53aa5..c054dc4d 100644
--- a/cmake/modules/FindWcecompat.cmake
+++ b/cmake/modules/FindWcecompat.cmake
@@ -5,9 +5,11 @@
# WCECOMPAT_INCLUDE_DIR - Wcecompat include directory
# WCECOMPAT_LIBRARIES - Libraries needed to use Wcecompat
#
-# Copyright (c) 2010, Andreas Holzammer, <andy@kdab.com>
+# SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
+# Author: Andreas Holzammer, <andy@kdab.com>
+#
+# SPDX-License-Identifier: BSD-3-Clause
#
-# Redistribution and use is allowed according to the terms of the BSD license.
if(WCECOMPAT_INCLUDE_DIR AND WCECOMPAT_LIB_FOUND)
set(Wcecompat_FIND_QUIETLY TRUE)
diff --git a/cmake/modules/GObjectIntrospectionMacros.cmake b/cmake/modules/GObjectIntrospectionMacros.cmake
index 83aff931..3af08ee8 100644
--- a/cmake/modules/GObjectIntrospectionMacros.cmake
+++ b/cmake/modules/GObjectIntrospectionMacros.cmake
@@ -1,8 +1,7 @@
-# Copyright (C) 2010, Pino Toscano, <pino at kde.org>
-#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+# SPDX-FileCopyrightText: 2010, Pino Toscano, <pino at kde.org>
+# SPDX-License-Identifier: BSD-3-Clause
+# Generate list from another list, but with each item prepended with a prefix
macro(_gir_list_prefix _outvar _listvar _prefix)
set(${_outvar})
foreach(_item IN LISTS ${_listvar})
@@ -10,13 +9,12 @@ macro(_gir_list_prefix _outvar _listvar _prefix)
endforeach()
endmacro(_gir_list_prefix)
+# cmake-lint: disable=R0915
macro(gir_add_introspections introspections_girs)
-
set(_gir_girs)
set(_gir_typelibs)
foreach(gir IN LISTS ${introspections_girs})
-
set(_gir_name "${gir}")
## Transform the gir filename to something which can reference through a variable
@@ -26,20 +24,44 @@ macro(gir_add_introspections introspections_girs)
# Namespace and Version is either fetched from the gir filename
# or the _NAMESPACE/_VERSION variable combo
- set(_gir_namespace "${${_gir_name}_NAMESPACE}")
+ set(_gir_namespace "")
+ if(DEFINED ${_gir_name}_NAMESPACE)
+ set(_gir_namespace "${${_gir_name}_NAMESPACE}")
+ endif()
if (_gir_namespace STREQUAL "")
string(REGEX REPLACE "([^-]+)-.*" "\\1" _gir_namespace "${gir}")
endif ()
- set(_gir_version "${${_gir_name}_VERSION}")
+
+ set(_gir_version "")
+ if(DEFINED ${_gir_name}_VERSION)
+ set(_gir_version "${${_gir_name}_VERSION}")
+ endif()
if (_gir_version STREQUAL "")
string(REGEX REPLACE ".*-([^-]+).gir" "\\1" _gir_version "${gir}")
endif ()
# _PROGRAM is an optional variable which needs its own --program argument
- set(_gir_program "${${_gir_name}_PROGRAM}")
+ set(_gir_program "")
+ if(DEFINED ${_gir_name}_PROGRAM)
+ set(_gir_program "${${_gir_name}_PROGRAM}")
+ endif()
if (NOT _gir_program STREQUAL "")
set(_gir_program "--program=${_gir_program}")
- endif ()
+ endif()
+
+ # _SCANNERFLAGS is optional
+ set(_gir_scannerflags "")
+ if(DEFINED ${_gir_name}_SCANNERFLAGS)
+ set(_gir_scannerflags "${${_gir_name}_SCANNERFLAGS}")
+ endif()
+
+ # _FILES
+ set(_gir_files "")
+ if(DEFINED ${_gir_name}_FILES)
+ set(_gir_files "${${_gir_name}_FILES}")
+ else()
+ message(ERROR "Unspecified or empty ${_gir_name}_FILES variable")
+ endif()
# Variables which provides a list of things
_gir_list_prefix(_gir_libraries ${_gir_name}_LIBS "--library=")
@@ -50,47 +72,54 @@ macro(gir_add_introspections introspections_girs)
set(_gir_libtool "--no-libtool")
add_custom_command(
- COMMAND ${CMAKE_COMMAND} -E env "CC='${CMAKE_C_COMPILER}'"
- ${GObjectIntrospection_SCANNER}
- ${GObjectIntrospection_SCANNER_ARGS}
- --namespace=${_gir_namespace}
- --nsversion=${_gir_version}
- ${_gir_libtool}
- ${_gir_program}
- ${_gir_libraries}
- ${_gir_packages}
- ${_gir_includes}
- ${${_gir_name}_SCANNERFLAGS}
- ${${_gir_name}_CFLAGS}
- ${${_gir_name}_FILES}
- --output ${CMAKE_CURRENT_BINARY_DIR}/${gir}
- --accept-unprefixed
- DEPENDS ${${_gir_name}_FILES}
- ${${_gir_name}_LIBS}
OUTPUT ${gir}
+ COMMAND ${GObjectIntrospection_SCANNER}
+ ${GObjectIntrospection_SCANNER_ARGS}
+ --namespace=${_gir_namespace}
+ --nsversion=${_gir_version}
+ ${_gir_libtool}
+ ${_gir_program}
+ ${_gir_libraries}
+ ${_gir_packages}
+ ${_gir_includes}
+ ${_gir_scannerflags}
+ ${${_gir_name}_CFLAGS}
+ ${_gir_files}
+ --output ${CMAKE_CURRENT_BINARY_DIR}/${gir}
+ --accept-unprefixed
+ DEPENDS ${_gir_files} ${${_gir_name}_LIBS}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM
+ COMMENT "Run the gobject introspection scanner"
)
list(APPEND _gir_girs ${CMAKE_CURRENT_BINARY_DIR}/${gir})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${gir} DESTINATION ${SHARE_INSTALL_DIR}/gir-1.0)
string(REPLACE ".gir" ".typelib" _typelib "${gir}")
add_custom_command(
+ OUTPUT ${_typelib}
COMMAND ${GObjectIntrospection_COMPILER}
- ${GObjectIntrospection_COMPILER_ARGS}
- --includedir=.
- ${CMAKE_CURRENT_BINARY_DIR}/${gir}
- -o ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}
+ --includedir=.
+ ${CMAKE_CURRENT_BINARY_DIR}/${gir}
+ -o ${CMAKE_CURRENT_BINARY_DIR}/${_typelib}
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${gir}
- OUTPUT ${_typelib}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ COMMENT "Run the gobject introspection compiler"
)
list(APPEND _gir_typelibs ${CMAKE_CURRENT_BINARY_DIR}/${_typelib})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${_typelib} DESTINATION ${LIB_INSTALL_DIR}/girepository-1.0)
endforeach()
- add_custom_target(gir-girs-${_gir_name} ALL DEPENDS ${_gir_girs})
- add_custom_target(gir-typelibs-${_gir_name} ALL DEPENDS ${_gir_typelibs})
+ add_custom_target(gir-girs-${_gir_name}
+ ALL
+ DEPENDS ${_gir_girs}
+ COMMENT "Target for the gobject introspection compiler"
+ )
+ add_custom_target(gir-typelibs-${_gir_name}
+ ALL
+ DEPENDS ${_gir_typelibs}
+ COMMENT "Target for the gobject introspection typelibs"
+ )
endmacro(gir_add_introspections)
diff --git a/cmake/modules/GtkDoc.cmake b/cmake/modules/GtkDoc.cmake
index 6090cb85..f81a33b8 100644
--- a/cmake/modules/GtkDoc.cmake
+++ b/cmake/modules/GtkDoc.cmake
@@ -1,5 +1,8 @@
# GtkDoc.cmake
#
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: BSD-3-Clause
+#
# Macros to support develper documentation build from sources with gtk-doc.
#
# Note that every target and dependency should be defined before the macro is
@@ -18,12 +21,6 @@
# It also adds custom target gtkdoc-rebuild-${_module}-sgml to rebuild the sgml.in
# file based on the current sources.
-libical_option(ENABLE_GTK_DOC "Use gtk-doc to build documentation" True)
-
-if(NOT ENABLE_GTK_DOC)
- return()
-endif()
-
find_program(GTKDOC_SCAN gtkdoc-scan)
find_program(GTKDOC_SCANGOBJ gtkdoc-scangobj)
find_program(GTKDOC_MKDB gtkdoc-mkdb)
@@ -36,13 +33,14 @@ if(NOT (GTKDOC_SCAN AND GTKDOC_MKDB AND GTKDOC_MKHTML AND GTKDOC_FIXXREF))
endif()
if(NOT TARGET gtkdocs)
- add_custom_target(gtkdocs ALL)
+ add_custom_target(gtkdocs ALL COMMENT "Target to run gtkdoc for all modules")
endif()
if(NOT TARGET gtkdoc-rebuild-sgmls)
- add_custom_target(gtkdoc-rebuild-sgmls)
+ add_custom_target(gtkdoc-rebuild-sgmls COMMENT "Target to rebuild sgml for all modules")
endif()
+# cmake-lint: disable=R0912,R0915
macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ignoreheadersvar)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in
@@ -61,7 +59,10 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
if(APPLE)
if(NOT DEFINED ENV{XML_CATALOG_FILES})
- message(FATAL_ERROR "On OSX, please run \'export XML_CATALOG_FILES=/usr/local/etc/xml/catalog\' first; else the gtk entities cannot be located.")
+ message(FATAL_ERROR
+ "On OSX, please run \'export XML_CATALOG_FILES=/usr/local/etc/xml/catalog\' first; "
+ "else the gtk entities cannot be located."
+ )
endif()
endif()
@@ -75,7 +76,9 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
if(TARGET ${opt})
set(_target_type)
get_target_property(_target_type ${opt} TYPE)
- if((_target_type STREQUAL "STATIC_LIBRARY") OR (_target_type STREQUAL "SHARED_LIBRARY") OR (_target_type STREQUAL "MODULE_LIBRARY"))
+ if((_target_type STREQUAL "STATIC_LIBRARY") OR
+ (_target_type STREQUAL "SHARED_LIBRARY") OR
+ (_target_type STREQUAL "MODULE_LIBRARY"))
set(_compile_options)
set(_link_libraries)
@@ -113,7 +116,9 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
if(TARGET ${opt})
set(_target_type)
get_target_property(_target_type ${opt} TYPE)
- if((_target_type STREQUAL "STATIC_LIBRARY") OR (_target_type STREQUAL "SHARED_LIBRARY") OR (_target_type STREQUAL "MODULE_LIBRARY"))
+ if((_target_type STREQUAL "STATIC_LIBRARY") OR
+ (_target_type STREQUAL "SHARED_LIBRARY") OR
+ (_target_type STREQUAL "MODULE_LIBRARY"))
set(_output_name "")
get_target_property(_output_name ${opt} OUTPUT_NAME)
if(NOT _output_name)
@@ -142,7 +147,18 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
# Add it as the last, thus in-tree libs have precedence
set(_scangobj_ldflags "${_scangobj_ldflags} -L${LIB_INSTALL_DIR}")
- set(_scangobj_prefix ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH="${_scangobj_ld_lib_dirs}:${LIB_INSTALL_DIR}:$ENV{LD_LIBRARY_PATH}")
+ if(APPLE)
+ set(ld_lib_path "DYLD_LIBRARY_PATH=${_scangobj_ld_lib_dirs}:${LIB_INSTALL_DIR}")
+ if(DEFINED DYLD_LIBRARY_PATH)
+ set(ld_lib_path "${ld_lib_path}:$ENV{DYLD_LIBRARY_PATH}")
+ endif()
+ elseif(NOT WIN32 AND NOT WINCE) #ie. unix-like
+ set(ld_lib_path "LD_LIBRARY_PATH=${_scangobj_ld_lib_dirs}:${LIB_INSTALL_DIR}")
+ if(DEFINED LD_LIBRARY_PATH)
+ set(ld_lib_path "${ld_lib_path}:$ENV{LD_LIBRARY_PATH}")
+ endif()
+ endif()
+ set(_scangobj_prefix ${CMAKE_COMMAND} -E env "${ld_lib_path}")
# if(NOT (_scangobj_cflags STREQUAL ""))
# set(_scangobj_cflags --cflags "${_scangobj_cflags}")
@@ -176,7 +192,11 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/html"
- COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/html" ${GTKDOC_MKHTML} --path=.. ${_module} ../${_module}-docs.sgml
+ COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/html"
+ ${GTKDOC_MKHTML}
+ --path=..
+ ${_module}
+ ../${_module}-docs.sgml
COMMAND ${GTKDOC_FIXXREF}
--module=${_module}
@@ -192,6 +212,7 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
add_custom_target(gtkdoc-${_module}
DEPENDS html/index.html
+ COMMENT "Target for running gtkdoc for module"
)
if(${_depsvar})
@@ -216,12 +237,14 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
${GTKDOC_SCAN}
--module=${_module}
--deprecated-guards="${_deprecated_guards}"
- --ignore-headers="${_ignore_headers}"
+ --ignore-headers="${${_ignoreheadersvar}}"
--rebuild-sections
--rebuild-types
${_srcdirs}
- COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}" ${_scangobj_prefix} ${GTKDOC_SCANGOBJ}
+ COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}"
+ ${_scangobj_prefix}
+ ${GTKDOC_SCANGOBJ}
--module=${_module}
${_scangobj_cflags}
${_scangobj_ldflags}
@@ -235,9 +258,14 @@ macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ign
--output-format=xml
${_srcdirs}
- COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/tmp/${_module}-docs.sgml ${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in
+ COMMAND ${CMAKE_COMMAND} -E rename
+ ${CMAKE_CURRENT_BINARY_DIR}/tmp/${_module}-docs.sgml
+ ${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in
- COMMAND ${CMAKE_COMMAND} -E echo "File '${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in' overwritten, make sure you replace generated strings with proper content before committing."
+ COMMAND ${CMAKE_COMMAND} -E echo
+ "File '${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in' overwritten, "
+ "make sure to replace generated strings with proper content before committing."
+ COMMENT "Target to rebuild the sgml for the specified module"
)
add_dependencies(gtkdoc-rebuild-sgmls gtkdoc-rebuild-${_module}-sgml)
diff --git a/cmake/modules/LibIcalMacrosInternal.cmake b/cmake/modules/LibIcalMacrosInternal.cmake
index cbea8155..acf020eb 100644
--- a/cmake/modules/LibIcalMacrosInternal.cmake
+++ b/cmake/modules/LibIcalMacrosInternal.cmake
@@ -1,20 +1,29 @@
# CMake support macros and functions for the libical project
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
+# Call option() and then add_feature_info()
function(libical_option option description)
set(extra_option_arguments ${ARGN})
option(${option} "${description}" ${extra_option_arguments})
add_feature_info("Option ${option}" ${option} "${description}")
endfunction()
+# Warn about deprecated cmake options then call libical_option
function(libical_deprecated_option deprecated_option option description)
set(extra_option_arguments ${ARGN})
- message(STATUS "WARNING: ${deprecated_option} is deprecated. Use ${option} instead")
+ if(${deprecated_option})
+ message(WARNING "${deprecated_option} is deprecated. Use ${option} instead")
+ set(${option} ${deprecated_option} CACHE BOOL "${description}")
+ endif()
libical_option(${option} "${description}" ${extra_option_arguments})
endfunction()
+# If condition is True, append the specified value to each ARGN
function(libical_append_if condition value)
if(${condition})
foreach(variable ${ARGN})
@@ -23,11 +32,17 @@ function(libical_append_if condition value)
endif()
endfunction()
+# Create a variable C_SUPPORTS_<flag> with a boolean denoting
+# if the C compiler supports that flag; if so, append the flag
+# to the global CMAKE_C_FLAGS variable.
macro(libical_add_cflag flag name)
check_c_compiler_flag("${flag}" "C_SUPPORTS_${name}")
libical_append_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS)
endmacro()
+# Create a variable CXX_SUPPORTS_<flag> with a boolean denoting
+# if the C++ compiler supports that flag; if so, append the flag
+# to the global CMAKE_CXX_FLAGS variable.
macro(libical_add_cxxflag flag name)
check_cxx_compiler_flag("${flag}" "CXX_SUPPORTS_${name}")
libical_append_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS)
diff --git a/cmake/run_test.cmake b/cmake/run_test.cmake
index db6c5c4d..8e76dbb2 100644
--- a/cmake/run_test.cmake
+++ b/cmake/run_test.cmake
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
#-------------------------------------------------
# some argument checking:
# test_cmd is the command to run with all its arguments
@@ -16,7 +19,7 @@ if(NOT output_test)
endif()
# convert the space-separated string to a list
-separate_arguments(test_args)
+separate_arguments(test_args UNIX_COMMAND ${test_args})
execute_process(
COMMAND ${test_cmd} ${test_args}
@@ -40,5 +43,7 @@ execute_process(
)
if(test_not_successful)
- message(SEND_ERROR "Output does not match for ${output_blessed} and ${output_test}: ${err} : shell output: ${test_not_successful}!")
+ message(SEND_ERROR
+ "Output does not match for ${output_blessed} and ${output_test}: ${err} : shell output: ${test_not_successful}!"
+ )
endif()
diff --git a/config.h.cmake b/config.h.cmake
index b7e1d5c9..a4b52aad 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -1,5 +1,10 @@
/* config.h. Generated by cmake from config.h.cmake */
+/**
+SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
/* Define if you have the ICU library. */
#cmakedefine HAVE_LIBICU 1
@@ -211,8 +216,10 @@ typedef unsigned long size_t;
/* Typedef ssize_t if needed */
#cmakedefine HAVE_SIZEOF_SSIZE_T
#if !defined(HAVE_SIZEOF_SSIZE_T)
+#if !defined(HAVE_BDB) && !defined(_WIN32)
typedef long ssize_t;
#endif
+#endif
/* Typedef pid_t if needed */
#cmakedefine HAVE_SIZEOF_PID_T 1
@@ -231,6 +238,7 @@ typedef unsigned int wint_t;
#endif
#cmakedefine SIZEOF_TIME_T ${SIZEOF_TIME_T}
+#cmakedefine SIZEOF_ICALTIME_T ${SIZEOF_ICALTIME_T}
/* whether we have ICU DANGI calendar */
#cmakedefine HAVE_ICU_DANGI
@@ -518,7 +526,28 @@ typedef ssize_t IO_SSIZE_T;
/* FYI: The localtime() in Microsoft's C library is MT-safe */
#define localtime_r(tp,tmp) (localtime(tp)?(*(tmp)=*localtime(tp),(tmp)):0)
#endif
-#include <time.h>
+
+/*
+ * Substitute functions for those from time.h but working with icaltime_t instead of time_t.
+ */
+#cmakedefine LIBICAL_ENABLE_64BIT_ICALTIME_T 1
+#if (defined(LIBICAL_ENABLE_64BIT_ICALTIME_T) && (SIZEOF_TIME_T != 8))
+#if defined(_MSC_VER)
+#define icaltime(timer) _time64(timer)
+#define icalctime(timer) _ctime64(timer)
+#define icalmktime(timeptr) _mktime64(timeptr)
+#define icalgmtime_r(tp,tmp) (_gmtime64(tp)?(*(tmp)=*_gmtime64(tp),(tmp)):0)
+#define icallocaltime_r(tp,tmp) (_localtime64(tp)?(*(tmp)=*_localtime64(tp),(tmp)):0)
+#else
+#error "This compiler is not supported together with the 'LIBICAL_ENABLE_64BIT_ICALTIME_T' option."
+#endif
+#else
+#define icaltime(timer) time(timer)
+#define icalctime(timer) ctime(timer)
+#define icalmktime(timeptr) mktime(timeptr)
+#define icalgmtime_r(timer, buf) gmtime_r(timer, buf)
+#define icallocaltime_r(timer, buf) localtime_r(timer, buf)
+#endif
/* define MAXPATHLEN */
#if defined(_WIN32)
@@ -541,8 +570,15 @@ typedef ssize_t IO_SSIZE_T;
/* Unused argument macro */
#if !defined(_unused)
#if defined(__LCLINT__) || defined(S_SPLINT_S)
-#define _unused(x) /*@unused@*/ x
+#define _unused(x) x
#else
#define _unused(x) (void)x
#endif
#endif
+
+#define icalassert(...) assert(__VA_ARGS__)
+#define icalerrprintf(...) fprintf(stderr, __VA_ARGS__)
+
+#define ICALMEMORY_DEFAULT_MALLOC malloc
+#define ICALMEMORY_DEFAULT_REALLOC realloc
+#define ICALMEMORY_DEFAULT_FREE free
diff --git a/design-data/CMakeLists.txt b/design-data/CMakeLists.txt
index 0b7b3433..b650e8dc 100644
--- a/design-data/CMakeLists.txt
+++ b/design-data/CMakeLists.txt
@@ -1,3 +1,4 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
########### install files ###############
-
diff --git a/design-data/components.txt b/design-data/components.txt
index 09108903..83156544 100644
--- a/design-data/components.txt
+++ b/design-data/components.txt
@@ -1,4 +1,5 @@
ANY
+PARTICIPANT
VAGENDA
VALARM
VAVAILABILITY
@@ -8,9 +9,11 @@ VCOMMAND
VEVENT
VFREEBUSY
VJOURNAL
-VQUERY
+VLOCATION
VPATCH
VPOLL
+VQUERY
+VRESOURCE
VSCHEDULE
VTIMEZONE
VTODO
diff --git a/design-data/parameters.csv b/design-data/parameters.csv
index 21696b8c..32962c00 100644
--- a/design-data/parameters.csv
+++ b/design-data/parameters.csv
@@ -15,19 +15,24 @@
"PARTSTAT","20","icalparameter_partstat","X=20600;NEEDS-ACTION;ACCEPTED;DECLINED;TENTATIVE;DELEGATED;COMPLETED;INPROCESS;FAILED;NONE=20699"
"RANGE","21","icalparameter_range","X=20700;THISANDPRIOR;THISANDFUTURE;NONE=20799"
"RELATED","22","icalparameter_related","X=20800;START;END;NONE=20899"
-"RELTYPE","23","icalparameter_reltype","X=20900;PARENT;CHILD;SIBLING;POLL;NONE=20999"
+"#RELTYPE:SNOOZE from RFC9073",,,
+"RELTYPE","23","icalparameter_reltype","X=20900;PARENT;CHILD;SIBLING;POLL;SNOOZE;NONE=20999"
"ROLE","24","icalparameter_role","X=21100;CHAIR;REQ-PARTICIPANT;OPT-PARTICIPANT;NON-PARTICIPANT;NONE=21199"
"RSVP","25","icalparameter_rsvp","X=21200;TRUE;FALSE;NONE=21299"
"SENT-BY","26","const char*",
"TZID","27","const char*",
"VALUE","28","icalparameter_value","X=21600;BINARY;BOOLEAN;DATE;DURATION;FLOAT;INTEGER;PERIOD;RECUR;TEXT;URI;ERROR;DATE-TIME;UTC-OFFSET;CAL-ADDRESS;NONE=21699"
"X","29","const char*",
+
+"#libical Internal Properties"
"X-LIC-ERRORTYPE","31","icalparameter_xlicerrortype","X=21800;COMPONENT-PARSE-ERROR;PROPERTY-PARSE-ERROR;PARAMETER-NAME-PARSE-ERROR;PARAMETER-VALUE-PARSE-ERROR;VALUE-PARSE-ERROR;INVALID-ITIP;UNKNOWN-VCAL-PROP-ERROR;MIME-PARSE-ERROR;VCAL-PROP-PARSE-ERROR;NONE=21899"
"X-LIC-COMPARETYPE","30","icalparameter_xliccomparetype","X=21700;EQUAL;NOTEQUAL;LESS;GREATER;LESSEQUAL;GREATEREQUAL;REGEX;ISNULL;ISNOTNULL;NONE=21799"
+
"#Parameters from Scheduling Extensions to CalDAV (RFC 6638)"
"SCHEDULE-AGENT","34","icalparameter_scheduleagent","X=21300;SERVER;CLIENT;NONE=21399"
"SCHEDULE-FORCE-SEND","35","icalparameter_scheduleforcesend","X=21400;REQUEST;REPLY;NONE=21499"
"SCHEDULE-STATUS","36","const char*",
+
"#CAP Parameters","Draft 8",
"#this parameter should really be called ACTION, but this conflicts with the ACTION property"
"ACTIONPARAM","1","icalparameter_action","X=20000;ASK;ABORT;NONE=20099"
@@ -38,30 +43,41 @@
"LOCALIZE","17","const char*",
"OPTIONS","19","const char*",
"NO","32",,
+
"#In practice any unknown parameter that is not an xparam is treated as an ianaparam"
"IANA","33","const char*",
"ANY","0",,
+
"#VPOLL Parameters","draft-york-vpoll","PUBLIC-COMMENT and RESPONSE are deprecated"
"PUBLIC-COMMENT","37","const char*",
"RESPONSE","38","int",
"REQUIRED","43","icalparameter_required","X=21000;TRUE;FALSE;NONE=21099"
"STAY-INFORMED","39","icalparameter_stayinformed","X=21500;TRUE;FALSE;NONE=21599"
+
"#CalDAV Managed Attachment Parameters","draft-ietf-calext-caldav-attachments"
"MANAGED-ID","40","const char*",
"SIZE","41","const char*",
"FILENAME","42","const char*",
+
"#Task Extension Parameters","draft-apthorp-ical-tasks"
-"REASON","43","const char*",
+"REASON","47","const char*",
"MODIFIED","44","const char*",
"SUBSTATE","45","icalparameter_substate",X=21900;OK;ERROR;SUSPENDED;NONE=21999",
+
"#Parameters from New Properties for iCalendar","RFC 7986 Section 6"
"DISPLAY","46","icalparameter_display",X=22000;BADGE;GRAPHIC;FULLSIZE;THUMBNAIL;NONE=22099",
-"EMAIL","47","const char*",
+"EMAIL","50","const char*",
"FEATURE","48","icalparameter_feature",X=22100;AUDIO;CHAT;FEED;MODERATOR;PHONE;SCREEN;VIDEO;NONE=22199",
"LABEL","49","const char*",
-"EMAIL","50","const char*",
+
"#VPATCH Extension Parameters","draft-daboo-icalendar-vpatch"
"PATCH-ACTION","51","icalparameter_patchaction",X=22200;CREATE;BYNAME;BYVALUE;BYPARAM;NONE=22299",
+
+"#Event Publishing Extensions Parameters","RFC 9073 Section 5"
+"ORDER","52","int",
+"SCHEMA","53","const char*",
+"DERIVED","54","icalparameter_derived","X=22300;TRUE;FALSE;NONE=22399"
+
"#NOTE for updaters. Preserve the icalparameter_kind Enum values to aid forward compatibility"
"# New Enum values for an existing icalparameter_kind should be inserted before the corresponding NONE value"
-"# New icalparamter_kind types should start their Enum value after the highest NONE value (currently 22299)"
+"# New icalparamter_kind types should start their Enum value after the highest NONE value (currently 22399)"
diff --git a/design-data/params-in-prop.txt b/design-data/params-in-prop.txt
index d455e231..633a3f63 100644
--- a/design-data/params-in-prop.txt
+++ b/design-data/params-in-prop.txt
@@ -77,3 +77,10 @@ PATCH-ORDER X
PATCH-TARGET X
PATCH-DELETE X
PATCH-PARAMETER ANY
+PROXIMITY X
+LOCATION-TYPE X
+PARTICIPANT-TYPE X
+RESOURCE-TYPE X
+CALENDAR-ADDRESS X
+STYLED-DESCRIPTION ALTREP DERIVED FMTTYPE LANGUAGE VALUE X
+STRUCTURED-DATA ENCODING FMTTYPE SCHEMA VALUE X
diff --git a/design-data/properties.csv b/design-data/properties.csv
index 7e36ded7..26867360 100644
--- a/design-data/properties.csv
+++ b/design-data/properties.csv
@@ -1,5 +1,6 @@
,,
"#Property Name","C icalproperty_kind Enum","libical Value type","iCalendar default value",Property Flags
+
"#iCalendar Properties","RFC 5545 Sections 3.7 and 3.8",
"CALSCALE","8","TEXT","TEXT"
"METHOD","48","METHOD","METHOD"
@@ -10,7 +11,7 @@
"CLASS","13","CLASS","CLASS"
"COMMENT","15","TEXT","TEXT"
"DESCRIPTION","29","TEXT","TEXT"
-"GEO","39","GEO","FLOAT",is_structured
+"GEO","39","GEO","TEXT",is_structured
"LOCATION","43","TEXT","TEXT"
"PERCENT-COMPLETE","54","INTEGER","INTEGER"
"PRIORITY","56","INTEGER","INTEGER"
@@ -48,8 +49,10 @@
"SEQUENCE","75","INTEGER","INTEGER"
"REQUEST-STATUS","70","REQUEST-STATUS","REQUEST-STATUS"
"X","90","X","X",is_multivalued
+
"#Deprecated RFC 2445 Properties","See RFC 5545 Section A.3",
"EXRULE","37","RECUR","RECUR"
+
"#CAP Properties","RFC 4324 Section 2.1.2",
,"FIXME","Should be BOOLEAN"
"ALLOW-CONFLICT","3","TEXT","TEXT"
@@ -77,7 +80,7 @@
"MAX-COMPONENT-SIZE","44","INTEGER","INTEGER"
"MINDATE","49","DATE-TIME","DATE-TIME"
"MULTIPART","50","TEXT","TEXT"
-"NAME","51","TEXT","TEXT"
+"NAME","115","TEXT","TEXT"
"OWNER","53","TEXT","TEXT"
"PERMISSION","55","TEXT","TEXT"
"QUERY","58","QUERY","QUERY"
@@ -90,6 +93,7 @@
"SCOPE","74","TEXT","TEXT"
"STORES-EXPANDED","77","TEXT","TEXT"
"TARGET","79","CAL-ADDRESS","CAL-ADDRESS"
+
"#Miscellaneous Properties","Origin Unknown",
"MAXRESULTS","46","INTEGER","INTEGER"
"MAXRESULTSSIZE","47","INTEGER","INTEGER"
@@ -97,6 +101,7 @@
"RELCALID","68","TEXT","TEXT"
"DATE-MAX","21","DATE-TIME","DATE-TIME"
"DATE-MIN","22","DATE-TIME","DATE-TIME"
+
"#libical Internal Properties",,
"X-LIC-ERROR","93","TEXT","TEXT"
"X-LIC-CLUSTERCOUNT","92","STRING","STRING"
@@ -109,10 +114,14 @@
"X-LIC-CLASS","91","X-LIC-CLASS","X-LIC-CLASS"
"ANY","0","NO","NO"
"NO","100","NO","NO"
-"#VALARM Extension Properties","draft-daboo-valarm-extensions Section 13.1",
+
+"#VALARM Extension Properties", "RFC 9073 Sections 6.1, 8.1",
"ACKNOWLEDGED","1","DATE-TIME","DATE-TIME"
+"PROXIMITY","126","PROXIMITY","PROXIMITY"
+
"#VAVAILABILITY Properties","RFC 7953 Section 3.2",
"BUSYTYPE","101","BUSYTYPE","BUSYTYPE"
+
"#VPOLL Properties","draft-york-vpoll",
"ACCEPT-RESPONSE","102","TEXT,"TEXT",is_multivalued
"POLL-COMPLETION","110","POLLCOMPLETION,"POLLCOMPLETION"
@@ -123,23 +132,36 @@
"REPLY-URL","111","URI,"URI"
"RESPONSE","112","INTEGER,"INTEGER"
"VOTER","107","CAL-ADDRESS,"CAL-ADDRESS"
+
"#TZdist Properties","RFC 7808 Section 7",
"TZID-ALIAS-OF","108","TEXT","TEXT"
"TZUNTIL","109","DATE-TIME","DATE-TIME"
+
"#Task Extension Properties","draft-apthorp-ical-tasks",
"ESTIMATED-DURATION","113","DURATION","DURATION"
"TASK-MODE","114","TASKMODE","TASKMODE"
+
"#New Properties for iCalendar","RFC 7986 Section 5",
-"NAME","115","TEXT","TEXT"
+#"NAME","115","TEXT","TEXT" (conflicts with NAME from rfc4324#section-2.1.2)
"REFRESH-INTERVAL","116","DURATION","NO"
"SOURCE","117","URI","NO"
"COLOR","118","TEXT","TEXT"
"IMAGE","119","ATTACH","NO",is_structured
"CONFERENCE","120","URI","NO"
+
"#VPATCH Extension Properties", "draft-daboo_icalendar-vpatch Section 4",
"PATCH-VERSION","121","TEXT","TEXT"
"PATCH-ORDER","122","INTEGER","INTEGER"
"PATCH-TARGET","123","TEXT","TEXT"
"PATCH-DELETE","124","TEXT","TEXT"
"PATCH-PARAMETER","125","TEXT","TEXT"
+
+"#Event Publication Extensions Properties","RFC 9073 Section 6",
+"LOCATION-TYPE","127","TEXT","TEXT",is_multivalued
+"PARTICIPANT-TYPE","128","PARTICIPANTTYPE","PARTICIPANTTYPE"
+"RESOURCE-TYPE","129","RESOURCETYPE","RESOURCETYPE"
+"CALENDAR-ADDRESS","130","CAL-ADDRESS","CAL-ADDRESS"
+"STYLED-DESCRIPTION","131","TEXT","NO"
+"STRUCTURED-DATA","132","ATTACH","NO",is_structured
+
"#NOTE for updaters. Preserve the icalproperty_kind Enum values to aid forward compatibility"
diff --git a/design-data/restrictions.csv b/design-data/restrictions.csv
index 439c9dc9..5d77c3f7 100644
--- a/design-data/restrictions.csv
+++ b/design-data/restrictions.csv
@@ -26,7 +26,7 @@ PUBLISH,VEVENT,RDATE,NONE,ZEROPLUS
PUBLISH,VEVENT,RELATEDTO,NONE,ZEROPLUS
PUBLISH,VEVENT,RESOURCES,NONE,ZEROORONE
PUBLISH,VEVENT,RRULE,NONE,ZEROPLUS
-PUBLISH,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel
+PUBLISH,VEVENT,STATUS,NONE,ZEROORONE,validate_status_value
PUBLISH,VEVENT,TRANSP,NONE,ZEROORONE
PUBLISH,VEVENT,URL,NONE,ZEROORONE
PUBLISH,VEVENT,X,NONE,ZEROPLUS
@@ -42,6 +42,14 @@ PUBLISH,VEVENT,NONE,VTODO,ZERO
PUBLISH,VEVENT,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
PUBLISH,VEVENT,NONE,X,ZEROPLUS
PUBLISH,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+PUBLISH,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+PUBLISH,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+PUBLISH,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+PUBLISH,VEVENT,NONE,VLOCATION,ZEROPLUS
+PUBLISH,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
REQUEST,VEVENT,NONE,NONE,ONEPLUS
REQUEST,VEVENT,ATTENDEE,NONE,ONEPLUS
REQUEST,VEVENT,DTSTAMP,NONE,ONE
@@ -71,7 +79,7 @@ REQUEST,VEVENT,RELATEDTO,NONE,ZEROPLUS
REQUEST,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
REQUEST,VEVENT,RESOURCES,NONE,ZEROORONE
REQUEST,VEVENT,RRULE,NONE,ZEROPLUS
-REQUEST,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf
+REQUEST,VEVENT,STATUS,NONE,ZEROORONE,validate_status_value
REQUEST,VEVENT,TRANSP,NONE,ZEROORONE
REQUEST,VEVENT,URL,NONE,ZEROORONE
REQUEST,VEVENT,X,NONE,ZEROPLUS
@@ -85,6 +93,14 @@ REQUEST,VEVENT,NONE,VFREEBUSY,ZERO
REQUEST,VEVENT,NONE,VJOURNAL,ZERO
REQUEST,VEVENT,NONE,VTODO,ZERO
REQUEST,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REQUEST,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REQUEST,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+REQUEST,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+REQUEST,VEVENT,NONE,VLOCATION,ZEROPLUS
+REQUEST,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
REPLY,VEVENT,NONE,NONE,ONEPLUS
REPLY,VEVENT,ATTENDEE,NONE,ONE
REPLY,VEVENT,DTSTAMP,NONE,ONE
@@ -128,6 +144,14 @@ REPLY,VEVENT,NONE,VFREEBUSY,ZERO
REPLY,VEVENT,NONE,VJOURNAL,ZERO
REPLY,VEVENT,NONE,VTODO,ZERO
REPLY,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REPLY,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REPLY,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+REPLY,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+REPLY,VEVENT,NONE,VLOCATION,ZEROPLUS
+REPLY,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
ADD,VEVENT,NONE,NONE,ONE
ADD,VEVENT,DTSTAMP,NONE,ONE
ADD,VEVENT,DTSTART,NONE,ONE
@@ -155,7 +179,7 @@ ADD,VEVENT,RDATE,NONE,ZEROPLUS
ADD,VEVENT,RELATEDTO,NONE,ZEROPLUS
ADD,VEVENT,RESOURCES,NONE,ZEROORONE
ADD,VEVENT,RRULE,NONE,ZEROPLUS
-ADD,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf
+ADD,VEVENT,STATUS,NONE,ZEROORONE,validate_status_value
ADD,VEVENT,TRANSP,NONE,ZEROORONE
ADD,VEVENT,URL,NONE,ZEROORONE
ADD,VEVENT,X,NONE,ZEROPLUS
@@ -171,6 +195,14 @@ ADD,VEVENT,NONE,VFREEBUSY,ZERO
ADD,VEVENT,NONE,VTODO,ZERO
ADD,VEVENT,NONE,VJOURNAL,ZERO
ADD,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+ADD,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+ADD,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+ADD,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+ADD,VEVENT,NONE,VLOCATION,ZEROPLUS
+ADD,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
CANCEL,VEVENT,NONE,NONE,ONEPLUS
CANCEL,VEVENT,ATTENDEE,NONE,ZEROPLUS
CANCEL,VEVENT,DTSTAMP,NONE,ONE
@@ -184,7 +216,7 @@ CANCEL,VEVENT,CLASS,NONE,ZEROORONE
CANCEL,VEVENT,CONTACT,NONE,ZEROPLUS
CANCEL,VEVENT,CREATED,NONE,ZEROORONE
CANCEL,VEVENT,DESCRIPTION,NONE,ZEROORONE
-CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE ,no_duration
+CANCEL,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
CANCEL,VEVENT,DTSTART,NONE,ZEROORONE
CANCEL,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
CANCEL,VEVENT,EXDATE,NONE,ZEROPLUS
@@ -198,7 +230,7 @@ CANCEL,VEVENT,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
CANCEL,VEVENT,RELATEDTO,NONE,ZEROPLUS
CANCEL,VEVENT,RESOURCES,NONE,ZEROORONE
CANCEL,VEVENT,RRULE,NONE,ZEROPLUS
-CANCEL,VEVENT,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee
+CANCEL,VEVENT,STATUS,NONE,ZEROORONE,validate_status_value
CANCEL,VEVENT,SUMMARY,NONE,ZEROORONE
CANCEL,VEVENT,TRANSP,NONE,ZEROORONE
CANCEL,VEVENT,URL,NONE,ZEROORONE
@@ -214,6 +246,14 @@ CANCEL,VEVENT,NONE,VJOURNAL,ZERO
CANCEL,VEVENT,NONE,VFREEBUSY,ZERO
CANCEL,VEVENT,NONE,VALARM,ZERO
CANCEL,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+CANCEL,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+CANCEL,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+CANCEL,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+CANCEL,VEVENT,NONE,VLOCATION,ZEROPLUS
+CANCEL,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
REFRESH,VEVENT,NONE,NONE,ONE
REFRESH,VEVENT,ATTENDEE,NONE,ONE
REFRESH,VEVENT,DTSTAMP,NONE,ONE
@@ -257,6 +297,14 @@ REFRESH,VEVENT,NONE,VFREEBUSY,ZERO
REFRESH,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref
REFRESH,VEVENT,NONE,VALARM,ZERO
REFRESH,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REFRESH,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REFRESH,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+REFRESH,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+REFRESH,VEVENT,NONE,VLOCATION,ZEROPLUS
+REFRESH,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
COUNTER,VEVENT,NONE,NONE,ONE
COUNTER,VEVENT,DTSTAMP,NONE,ONE
COUNTER,VEVENT,DTSTART,NONE,ONE
@@ -286,7 +334,7 @@ COUNTER,VEVENT,RELATEDTO,NONE,ZEROPLUS
COUNTER,VEVENT,REQUESTSTATUS,NONE,ZEROPLUS
COUNTER,VEVENT,RESOURCES,NONE,ZEROORONE
COUNTER,VEVENT,RRULE,NONE,ZEROPLUS
-COUNTER,VEVENT,STATUS,NONE,ZEROORONE,may_be_tent_conf_cancel
+COUNTER,VEVENT,STATUS,NONE,ZEROORONE,validate_status_value
COUNTER,VEVENT,TRANSP,NONE,ZEROORONE
COUNTER,VEVENT,URL,NONE,ZEROORONE
COUNTER,VEVENT,X,NONE,ZEROPLUS
@@ -300,6 +348,14 @@ COUNTER,VEVENT,NONE,VTODO,ZERO
COUNTER,VEVENT,NONE,VJOURNAL,ZERO
COUNTER,VEVENT,NONE,VFREEBUSY,ZERO
COUNTER,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+COUNTER,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+COUNTER,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+COUNTER,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+COUNTER,VEVENT,NONE,VLOCATION,ZEROPLUS
+COUNTER,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
DECLINECOUNTER,VEVENT,NONE,NONE,ONE
DECLINECOUNTER,VEVENT,DTSTAMP,NONE,ONE
DECLINECOUNTER,VEVENT,ORGANIZER,NONE,ONE
@@ -316,9 +372,9 @@ DECLINECOUNTER,VEVENT,CLASS,NONE,ZERO
DECLINECOUNTER,VEVENT,CONTACT,NONE,ZERO
DECLINECOUNTER,VEVENT,CREATED,NONE,ZERO
DECLINECOUNTER,VEVENT,DESCRIPTION,NONE,ZERO
-DECLINECOUNTER,VEVENT,DTEND,NONE,ZERO
+DECLINECOUNTER,VEVENT,DTEND,NONE,ONEEXCLUSIVE,no_duration
DECLINECOUNTER,VEVENT,DTSTART,NONE,ZERO
-DECLINECOUNTER,VEVENT,DURATION,NONE,ZERO
+DECLINECOUNTER,VEVENT,DURATION,NONE,ONEEXCLUSIVE,no_dtend
DECLINECOUNTER,VEVENT,EXDATE,NONE,ZERO
DECLINECOUNTER,VEVENT,EXRULE,NONE,ZERO
DECLINECOUNTER,VEVENT,GEO,NONE,ZERO
@@ -343,6 +399,14 @@ DECLINECOUNTER,VEVENT,NONE,VFREEBUSY,ZERO
DECLINECOUNTER,VEVENT,NONE,VTIMEZONE,ZERO,must_if_tz_ref
DECLINECOUNTER,VEVENT,NONE,VALARM,ZERO
DECLINECOUNTER,VEVENT,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+DECLINECOUNTER,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+DECLINECOUNTER,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+DECLINECOUNTER,VEVENT,NONE,VLOCATION,ZEROPLUS
+DECLINECOUNTER,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
PUBLISH,VFREEBUSY,NONE,NONE,ONEPLUS
PUBLISH,VFREEBUSY,DTSTAMP,NONE,ONE
PUBLISH,VFREEBUSY,DTSTART,NONE,ONE
@@ -363,6 +427,13 @@ PUBLISH,VFREEBUSY,NONE,VTODO,ZERO
PUBLISH,VFREEBUSY,NONE,VJOURNAL,ZERO
PUBLISH,VFREEBUSY,NONE,VTIMEZONE,ZERO,must_if_tz_ref
PUBLISH,VFREEBUSY,NONE,VALARM,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+PUBLISH,VFREEBUSY,STYLEDDESCRIPTION,NONE,ZEROPLUS
+PUBLISH,VFREEBUSY,NONE,PARTICIPANT,ZEROPLUS
+PUBLISH,VFREEBUSY,NONE,VLOCATION,ZEROPLUS
+PUBLISH,VFREEBUSY,NONE,VRESOURCE,ZEROPLUS
+
REQUEST,VFREEBUSY,NONE,NONE,ONE
REQUEST,VFREEBUSY,ATTENDEE,NONE,ONEPLUS
REQUEST,VFREEBUSY,DTEND,NONE,ONE
@@ -383,6 +454,13 @@ REQUEST,VFREEBUSY,NONE,VEVENT,ZERO
REQUEST,VFREEBUSY,NONE,VTODO,ZERO
REQUEST,VFREEBUSY,NONE,VJOURNAL,ZERO
REQUEST,VFREEBUSY,NONE,VTIMEZONE,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+REQUEST,VFREEBUSY,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REQUEST,VFREEBUSY,NONE,PARTICIPANT,ZEROPLUS
+REQUEST,VFREEBUSY,NONE,VLOCATION,ZEROPLUS
+REQUEST,VFREEBUSY,NONE,VRESOURCE,ZEROPLUS
+
REPLY,VFREEBUSY,NONE,NONE,ONE
REPLY,VFREEBUSY,ATTENDEE,NONE,ONE
REPLY,VFREEBUSY,DTSTAMP,NONE,ONE
@@ -404,6 +482,13 @@ REPLY,VFREEBUSY,NONE,VEVENT,ZERO
REPLY,VFREEBUSY,NONE,VTODO,ZERO
REPLY,VFREEBUSY,NONE,VJOURNAL,ZERO
REPLY,VFREEBUSY,NONE,VTIMEZONE,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+REPLY,VFREEBUSY,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REPLY,VFREEBUSY,NONE,PARTICIPANT,ZEROPLUS
+REPLY,VFREEBUSY,NONE,VLOCATION,ZEROPLUS
+REPLY,VFREEBUSY,NONE,VRESOURCE,ZEROPLUS
+
PUBLISH,VTODO,NONE,NONE,ONEPLUS
PUBLISH,VTODO,DTSTAMP,NONE,ONE
PUBLISH,VTODO,DTSTART,NONE,ONE
@@ -447,6 +532,14 @@ PUBLISH,VTODO,NONE,VFREEBUSY,ZERO
PUBLISH,VTODO,NONE,VEVENT,ZERO
PUBLISH,VTODO,NONE,VJOURNAL,ZERO
PUBLISH,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+PUBLISH,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+PUBLISH,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+PUBLISH,VTODO,NONE,PARTICIPANT,ZEROPLUS
+PUBLISH,VTODO,NONE,VLOCATION,ZEROPLUS
+PUBLISH,VTODO,NONE,VRESOURCE,ZEROPLUS
+
REQUEST,VTODO,NONE,NONE,ONEPLUS
REQUEST,VTODO,ATTENDEE,NONE,ONEPLUS
REQUEST,VTODO,DTSTAMP,NONE,ONE
@@ -476,7 +569,7 @@ REQUEST,VTODO,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
REQUEST,VTODO,RELATEDTO,NONE,ZEROPLUS
REQUEST,VTODO,RESOURCES,NONE,ZEROORONE
REQUEST,VTODO,RRULE,NONE,ZEROPLUS
-REQUEST,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+REQUEST,VTODO,STATUS,NONE,ZEROORONE,validate_status_value
REQUEST,VTODO,URL,NONE,ZEROORONE
REQUEST,VTODO,X,NONE,ZEROPLUS
REQUEST,VTODO,REQUESTSTATUS,NONE,ZERO
@@ -490,6 +583,14 @@ REQUEST,VTODO,NONE,VEVENT,ZERO
REQUEST,VTODO,NONE,VFREEBUSY,ZERO
REQUEST,VTODO,NONE,VJOURNAL,ZERO
REQUEST,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REQUEST,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REQUEST,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+REQUEST,VTODO,NONE,PARTICIPANT,ZEROPLUS
+REQUEST,VTODO,NONE,VLOCATION,ZEROPLUS
+REQUEST,VTODO,NONE,VRESOURCE,ZEROPLUS
+
REPLY,VTODO,NONE,NONE,ONEPLUS
REPLY,VTODO,ATTENDEE,NONE,ONEPLUS
REPLY,VTODO,DTSTAMP,NONE,ONE
@@ -532,6 +633,14 @@ REPLY,VTODO,NONE,VALARM,ZERO
REPLY,VTODO,NONE,VEVENT,ZERO
REPLY,VTODO,NONE,VFREEBUSY,ZERO
REPLY,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REPLY,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REPLY,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+REPLY,VTODO,NONE,PARTICIPANT,ZEROPLUS
+REPLY,VTODO,NONE,VLOCATION,ZEROPLUS
+REPLY,VTODO,NONE,VRESOURCE,ZEROPLUS
+
ADD,VTODO,NONE,NONE,ONE
ADD,VTODO,DTSTAMP,NONE,ONE
ADD,VTODO,ORGANIZER,NONE,ONE
@@ -560,7 +669,7 @@ ADD,VTODO,RDATE,NONE,ZEROPLUS
ADD,VTODO,RELATEDTO,NONE,ZEROPLUS
ADD,VTODO,RESOURCES,NONE,ZEROORONE
ADD,VTODO,RRULE,NONE,ZEROPLUS
-ADD,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+ADD,VTODO,STATUS,NONE,ZEROORONE,validate_status_value
ADD,VTODO,URL,NONE,ZEROORONE
ADD,VTODO,X,NONE,ZEROPLUS
ADD,VTODO,RECURRENCEID,NONE,ZERO,must_be_recurring
@@ -575,6 +684,14 @@ ADD,VTODO,NONE,VEVENT,ZERO
ADD,VTODO,NONE,VJOURNAL,ZERO
ADD,VTODO,NONE,VFREEBUSY,ZERO
ADD,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+ADD,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+ADD,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+ADD,VTODO,NONE,PARTICIPANT,ZEROPLUS
+ADD,VTODO,NONE,VLOCATION,ZEROPLUS
+ADD,VTODO,NONE,VRESOURCE,ZEROPLUS
+
CANCEL,VTODO,NONE,NONE,ONE
CANCEL,VTODO,ATTENDEE,NONE,ZEROPLUS
CANCEL,VTODO,UID,NONE,ONE
@@ -603,7 +720,7 @@ CANCEL,VTODO,RELATEDTO,NONE,ZEROPLUS
CANCEL,VTODO,RESOURCES,NONE,ZEROORONE
CANCEL,VTODO,RRULE,NONE,ZEROPLUS
CANCEL,VTODO,PRIORITY,NONE,ZEROORONE
-CANCEL,VTODO,STATUS,NONE,ZEROORONE,must_be_canceled_no_attendee
+CANCEL,VTODO,STATUS,NONE,ZEROORONE,validate_status_value
CANCEL,VTODO,URL,NONE,ZEROORONE
CANCEL,VTODO,X,NONE,ZEROPLUS
CANCEL,VTODO,REQUESTSTATUS,NONE,ZERO
@@ -616,6 +733,14 @@ CANCEL,VTODO,NONE,VALARM,ZERO
CANCEL,VTODO,NONE,VEVENT,ZERO
CANCEL,VTODO,NONE,VFREEBUSY,ZERO
CANCEL,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+CANCEL,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+CANCEL,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+CANCEL,VTODO,NONE,PARTICIPANT,ZEROPLUS
+CANCEL,VTODO,NONE,VLOCATION,ZEROPLUS
+CANCEL,VTODO,NONE,VRESOURCE,ZEROPLUS
+
REFRESH,VTODO,NONE,NONE,ONE
REFRESH,VTODO,ATTENDEE,NONE,ONE
REFRESH,VTODO,DTSTAMP,NONE,ONE
@@ -657,6 +782,14 @@ REFRESH,VTODO,NONE,VEVENT,ZERO
REFRESH,VTODO,NONE,VFREEBUSY,ZERO
REFRESH,VTODO,NONE,VTIMEZONE,ZERO
REFRESH,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+REFRESH,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+REFRESH,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+REFRESH,VTODO,NONE,PARTICIPANT,ZEROPLUS
+REFRESH,VTODO,NONE,VLOCATION,ZEROPLUS
+REFRESH,VTODO,NONE,VRESOURCE,ZEROPLUS
+
COUNTER,VTODO,NONE,NONE,ONE
COUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
COUNTER,VTODO,DTSTAMP,NONE,ONE
@@ -687,7 +820,7 @@ COUNTER,VTODO,REQUESTSTATUS,NONE,ZEROPLUS
COUNTER,VTODO,RESOURCES,NONE,ZEROORONE
COUNTER,VTODO,RRULE,NONE,ZEROORONE
COUNTER,VTODO,SEQUENCE,NONE,ZEROORONE
-COUNTER,VTODO,STATUS,NONE,ZEROORONE,may_be_comp_need_process
+COUNTER,VTODO,STATUS,NONE,ZEROORONE,validate_status_value
COUNTER,VTODO,URL,NONE,ZEROORONE
COUNTER,VTODO,X,NONE,ZEROPLUS
COUNTER,VTODO,COLOR,NONE,ZEROORONE
@@ -699,6 +832,14 @@ COUNTER,VTODO,NONE,X,ZEROPLUS
COUNTER,VTODO,NONE,VEVENT,ZERO
COUNTER,VTODO,NONE,VFREEBUSY,ZERO
COUNTER,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+COUNTER,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+COUNTER,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+COUNTER,VTODO,NONE,PARTICIPANT,ZEROPLUS
+COUNTER,VTODO,NONE,VLOCATION,ZEROPLUS
+COUNTER,VTODO,NONE,VRESOURCE,ZEROPLUS
+
DECLINECOUNTER,VTODO,NONE,NONE,ONE
DECLINECOUNTER,VTODO,ATTENDEE,NONE,ONEPLUS
DECLINECOUNTER,VTODO,DTSTAMP,NONE,ONE
@@ -740,6 +881,14 @@ DECLINECOUNTER,VTODO,NONE,VALARM,ZERO
DECLINECOUNTER,VTODO,NONE,VEVENT,ZERO
DECLINECOUNTER,VTODO,NONE,VFREEBUSY,ZERO
DECLINECOUNTER,VTODO,RELCALID,NONE,ZEROORONE
+
+# Event Publishing Extensions (RFC 9073)
+DECLINECOUNTER,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,PARTICIPANT,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VLOCATION,ZEROPLUS
+DECLINECOUNTER,VTODO,NONE,VRESOURCE,ZEROPLUS
+
PUBLISH,VJOURNAL,NONE,NONE,ONEPLUS
PUBLISH,VJOURNAL,DESCRIPTION,NONE,ONE
PUBLISH,VJOURNAL,DTSTAMP,NONE,ONE
@@ -760,7 +909,7 @@ PUBLISH,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
PUBLISH,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
PUBLISH,VJOURNAL,RRULE,NONE,ZEROPLUS
PUBLISH,VJOURNAL,SEQUENCE,NONE,ZEROORONE
-PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE,may_be_draft_final_canceled
+PUBLISH,VJOURNAL,STATUS,NONE,ZEROORONE,validate_status_value
PUBLISH,VJOURNAL,SUMMARY,NONE,ZEROORONE
PUBLISH,VJOURNAL,URL,NONE,ZEROORONE
PUBLISH,VJOURNAL,X,NONE,ZEROPLUS
@@ -773,6 +922,14 @@ PUBLISH,VJOURNAL,NONE,X,ZEROPLUS
PUBLISH,VJOURNAL,NONE,VEVENT,ZERO
PUBLISH,VJOURNAL,NONE,VFREEBUSY,ZERO
PUBLISH,VJOURNAL,NONE,VTODO,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+PUBLISH,VJOURNAL,STYLEDDESCRIPTION,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,STRUCTUREDDATA,NONE,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,PARTICIPANT,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VLOCATION,ZEROPLUS
+PUBLISH,VJOURNAL,NONE,VRESOURCE,ZEROPLUS
+
ADD,VJOURNAL,NONE,NONE,ONE
ADD,VJOURNAL,DESCRIPTION,NONE,ONE
ADD,VJOURNAL,DTSTAMP,NONE,ONE
@@ -806,6 +963,14 @@ ADD,VJOURNAL,NONE,X,ZEROPLUS
ADD,VJOURNAL,NONE,VEVENT,ZERO
ADD,VJOURNAL,NONE,VFREEBUSY,ZERO
ADD,VJOURNAL,NONE,VTODO,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+ADD,VJOURNAL,STYLEDDESCRIPTION,NONE,ZEROPLUS
+ADD,VJOURNAL,STRUCTUREDDATA,NONE,ZEROPLUS
+ADD,VJOURNAL,NONE,PARTICIPANT,ZEROPLUS
+ADD,VJOURNAL,NONE,VLOCATION,ZEROPLUS
+ADD,VJOURNAL,NONE,VRESOURCE,ZEROPLUS
+
CANCEL,VJOURNAL,NONE,NONE,ONEPLUS
CANCEL,VJOURNAL,DTSTAMP,NONE,ONE
CANCEL,VJOURNAL,ORGANIZER,NONE,ONE
@@ -827,7 +992,7 @@ CANCEL,VJOURNAL,RDATE,NONE,ZEROPLUS
CANCEL,VJOURNAL,RECURRENCEID,NONE,ZEROORONE,must_be_recurring
CANCEL,VJOURNAL,RELATEDTO,NONE,ZEROPLUS
CANCEL,VJOURNAL,RRULE,NONE,ZEROPLUS
-CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE,must_be_cancel_if_present
+CANCEL,VJOURNAL,STATUS,NONE,ZEROORONE,validate_status_value
CANCEL,VJOURNAL,SUMMARY,NONE,ZEROORONE
CANCEL,VJOURNAL,URL,NONE,ZEROORONE
CANCEL,VJOURNAL,X,NONE,ZEROPLUS
@@ -840,46 +1005,62 @@ CANCEL,VJOURNAL,NONE,VALARM,ZERO
CANCEL,VJOURNAL,NONE,VEVENT,ZERO
CANCEL,VJOURNAL,NONE,VFREEBUSY,ZERO
CANCEL,VJOURNAL,NONE,VTODO,ZERO
+
+# Event Publishing Extensions (RFC 9073)
+CANCEL,VJOURNAL,STYLEDDESCRIPTION,NONE,ZEROPLUS
+CANCEL,VJOURNAL,STRUCTUREDDATA,NONE,ZEROPLUS
+CANCEL,VJOURNAL,NONE,PARTICIPANT,ZEROPLUS
+CANCEL,VJOURNAL,NONE,VLOCATION,ZEROPLUS
+CANCEL,VJOURNAL,NONE,VRESOURCE,ZEROPLUS
+
PUBLISH,VAGENDA,NONE,NONE,ONEPLUS
PUBLISH,VAGENDA,CALMASTER,NONE,ONE
PUBLISH,VAGENDA,OWNER,NONE,ZEROORONE
PUBLISH,VAGENDA,RELCALID,NONE,ZEROORONE
PUBLISH,VAGENDA,TZID,NONE,ONE
+
REQUEST,VAGENDA,NONE,NONE,ONEPLUS
REQUEST,VAGENDA,CALMASTER,NONE,ONE
REQUEST,VAGENDA,OWNER,NONE,ZEROORONE
REQUEST,VAGENDA,RELCALID,NONE,ZEROORONE
REQUEST,VAGENDA,TZID,NONE,ONE
+
REPLY,VAGENDA,NONE,NONE,ONEPLUS
REPLY,VAGENDA,CALMASTER,NONE,ONE
REPLY,VAGENDA,OWNER,NONE,ZEROORONE
REPLY,VAGENDA,RELCALID,NONE,ZEROORONE
REPLY,VAGENDA,TZID,NONE,ONE
+
ADD,VAGENDA,NONE,NONE,ONEPLUS
ADD,VAGENDA,CALMASTER,NONE,ONE
ADD,VAGENDA,OWNER,NONE,ZEROORONE
ADD,VAGENDA,RELCALID,NONE,ZEROORONE
ADD,VAGENDA,TZID,NONE,ONE
+
CANCEL,VAGENDA,NONE,NONE,ONEPLUS
CANCEL,VAGENDA,CALMASTER,NONE,ONE
CANCEL,VAGENDA,OWNER,NONE,ZEROORONE
CANCEL,VAGENDA,RELCALID,NONE,ZEROORONE
CANCEL,VAGENDA,TZID,NONE,ONE
+
REFRESH,VAGENDA,NONE,NONE,ONEPLUS
REFRESH,VAGENDA,CALMASTER,NONE,ONE
REFRESH,VAGENDA,OWNER,NONE,ZEROORONE
REFRESH,VAGENDA,RELCALID,NONE,ZEROORONE
REFRESH,VAGENDA,TZID,NONE,ONE
+
COUNTER,VAGENDA,NONE,NONE,ONEPLUS
COUNTER,VAGENDA,CALMASTER,NONE,ONE
COUNTER,VAGENDA,OWNER,NONE,ZEROORONE
COUNTER,VAGENDA,RELCALID,NONE,ZEROORONE
COUNTER,VAGENDA,TZID,NONE,ONE
+
DECLINECOUNTER,VAGENDA,NONE,NONE,ONEPLUS
DECLINECOUNTER,VAGENDA,CALMASTER,NONE,ONE
DECLINECOUNTER,VAGENDA,OWNER,NONE,ZEROORONE
DECLINECOUNTER,VAGENDA,RELCALID,NONE,ZEROORONE
DECLINECOUNTER,VAGENDA,TZID,NONE,ONE
+
NONE,VAGENDA,ALLOWCONFLICT,NONE,ONE
NONE,VAGENDA,CALMASTER,NONE,ONE
NONE,VAGENDA,OWNER,NONE,ZEROORONE
@@ -888,6 +1069,7 @@ NONE,VAGENDA,TZID,NONE,ONE
NONE,VAGENDA,DEFAULTCHARSET,NONE,ONE
NONE,VAGENDA,DEFAULTLOCALE,NONE,ONE
NONE,VAGENDA,DEFAULTTZID,NONE,ONE
+
NONE,VCALENDAR,ACTION,NONE,ZERO
NONE,VCALENDAR,ATTACH,NONE,ZERO
NONE,VCALENDAR,ATTENDEE,NONE,ZERO
@@ -942,6 +1124,7 @@ NONE,VCALENDAR,REFRESHINTERVAL,NONE,ZEROORONE
NONE,VCALENDAR,SOURCE,NONE,ZEROORONE
NONE,VCALENDAR,IMAGE,NONE,ZEROPLUS
NONE,VCALENDAR,NAME,NONE,ZEROPLUS
+
NONE,VEVENT,ACTION,NONE,ZERO
NONE,VEVENT,ATTACH,NONE,ZEROPLUS
NONE,VEVENT,ATTENDEE,NONE,ZEROPLUS
@@ -994,6 +1177,14 @@ NONE,VEVENT,RELCALID,NONE,ZEROORONE
NONE,VEVENT,COLOR,NONE,ZEROORONE
NONE,VEVENT,CONFERENCE,NONE,ZEROPLUS
NONE,VEVENT,IMAGE,NONE,ZEROPLUS
+
+# Event Publishing Extensions (RFC 9073)
+NONE,VEVENT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+NONE,VEVENT,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,VEVENT,NONE,PARTICIPANT,ZEROPLUS
+NONE,VEVENT,NONE,VLOCATION,ZEROPLUS
+NONE,VEVENT,NONE,VRESOURCE,ZEROPLUS
+
NONE,VTODO,ACTION,NONE,ZERO
NONE,VTODO,ATTACH,NONE,ZEROPLUS
NONE,VTODO,ATTENDEE,NONE,ZEROPLUS
@@ -1046,6 +1237,14 @@ NONE,VTODO,RELCALID,NONE,ZEROORONE
NONE,VTODO,COLOR,NONE,ZEROORONE
NONE,VTODO,CONFERENCE,NONE,ZEROPLUS
NONE,VTODO,IMAGE,NONE,ZEROPLUS
+
+# Event Publishing Extensions (RFC 9073)
+NONE,VTODO,STYLEDDESCRIPTION,NONE,ZEROPLUS
+NONE,VTODO,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,VTODO,NONE,PARTICIPANT,ZEROPLUS
+NONE,VTODO,NONE,VLOCATION,ZEROPLUS
+NONE,VTODO,NONE,VRESOURCE,ZEROPLUS
+
NONE,VJOURNAL,ACTION,NONE,ZERO
NONE,VJOURNAL,ATTACH,NONE,ZEROPLUS
NONE,VJOURNAL,ATTENDEE,NONE,ZEROPLUS
@@ -1096,6 +1295,14 @@ NONE,VJOURNAL,VERSION,NONE,ZERO
NONE,VJOURNAL,X,NONE,ZEROPLUS
NONE,VJOURNAL,COLOR,NONE,ZEROORONE
NONE,VJOURNAL,IMAGE,NONE,ZEROPLUS
+
+# Event Publishing Extensions (RFC 9073)
+NONE,VJOURNAL,STYLEDDESCRIPTION,NONE,ZEROPLUS
+NONE,VJOURNAL,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,VJOURNAL,NONE,PARTICIPANT,ZEROPLUS
+NONE,VJOURNAL,NONE,VLOCATION,ZEROPLUS
+NONE,VJOURNAL,NONE,VRESOURCE,ZEROPLUS
+
NONE,VFREEBUSY,ACTION,NONE,ZERO
NONE,VFREEBUSY,ATTACH,NONE,ZERO
NONE,VFREEBUSY,ATTENDEE,NONE,ZEROPLUS
@@ -1144,6 +1351,13 @@ NONE,VFREEBUSY,UID,NONE,ONE
NONE,VFREEBUSY,URL,NONE,ZEROORONE
NONE,VFREEBUSY,VERSION,NONE,ZERO
NONE,VFREEBUSY,X,NONE,ZEROPLUS
+
+# Event Publishing Extensions (RFC 9073)
+NONE,VFREEBUSY,STYLEDDESCRIPTION,NONE,ZEROPLUS
+NONE,VFREEBUSY,NONE,PARTICIPANT,ZEROPLUS
+NONE,VFREEBUSY,NONE,VLOCATION,ZEROPLUS
+NONE,VFREEBUSY,NONE,VRESOURCE,ZEROPLUS
+
NONE,VTIMEZONE,ACTION,NONE,ZERO
NONE,VTIMEZONE,ATTACH,NONE,ZERO
NONE,VTIMEZONE,ATTENDEE,NONE,ZERO
@@ -1196,6 +1410,7 @@ NONE,VTIMEZONE,VERSION,NONE,ZERO
NONE,VTIMEZONE,X,NONE,ZEROPLUS
NONE,VTIMEZONE,NONE,XSTANDARD,ZEROPLUS
NONE,VTIMEZONE,NONE,XDAYLIGHT,ZEROPLUS
+
NONE,XSTANDARD,ACTION,NONE,ZERO
NONE,XSTANDARD,ATTACH,NONE,ZERO
NONE,XSTANDARD,ATTENDEE,NONE,ZERO
@@ -1244,6 +1459,7 @@ NONE,XSTANDARD,UID,NONE,ZERO
NONE,XSTANDARD,URL,NONE,ZERO
NONE,XSTANDARD,VERSION,NONE,ZERO
NONE,XSTANDARD,X,NONE,ZEROPLUS
+
NONE,XDAYLIGHT,ACTION,NONE,ZERO
NONE,XDAYLIGHT,ATTACH,NONE,ZERO
NONE,XDAYLIGHT,ATTENDEE,NONE,ZERO
@@ -1292,201 +1508,69 @@ NONE,XDAYLIGHT,UID,NONE,ZERO
NONE,XDAYLIGHT,URL,NONE,ZERO
NONE,XDAYLIGHT,VERSION,NONE,ZERO
NONE,XDAYLIGHT,X,NONE,ZEROPLUS
-NONE,XAUDIOALARM,ACTION,NONE,ONE
-NONE,XAUDIOALARM,ATTACH,NONE,ZEROORONE
-NONE,XAUDIOALARM,ATTENDEE,NONE,ZERO
-NONE,XAUDIOALARM,CALSCALE,NONE,ZERO
-NONE,XAUDIOALARM,CATEGORIES,NONE,ZERO
-NONE,XAUDIOALARM,CLASS,NONE,ZERO
-NONE,XAUDIOALARM,COMMENT,NONE,ZERO
-NONE,XAUDIOALARM,COMPLETED,NONE,ZERO
-NONE,XAUDIOALARM,CONTACT,NONE,ZERO
-NONE,XAUDIOALARM,CREATED,NONE,ZERO
-NONE,XAUDIOALARM,DESCRIPTION,NONE,ZERO
-NONE,XAUDIOALARM,DTEND,NONE,ZERO
-NONE,XAUDIOALARM,DTSTAMP,NONE,ZERO
-NONE,XAUDIOALARM,DTSTART,NONE,ZERO
-NONE,XAUDIOALARM,DUE,NONE,ZERO
-NONE,XAUDIOALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
-NONE,XAUDIOALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
-NONE,XAUDIOALARM,EXDATE,NONE,ZERO
-NONE,XAUDIOALARM,EXRULE,NONE,ZERO
-NONE,XAUDIOALARM,FREEBUSY,NONE,ZERO
-NONE,XAUDIOALARM,GEO,NONE,ZERO
-NONE,XAUDIOALARM,LASTMODIFIED,NONE,ZERO
-NONE,XAUDIOALARM,LOCATION,NONE,ZERO
-NONE,XAUDIOALARM,METHOD,NONE,ZERO
-NONE,XAUDIOALARM,ORGANIZER,NONE,ZERO
-NONE,XAUDIOALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XAUDIOALARM,PRIORITY,NONE,ZERO
-NONE,XAUDIOALARM,PRODID,NONE,ZERO
-NONE,XAUDIOALARM,RDATE,NONE,ZERO
-NONE,XAUDIOALARM,RECURRENCEID,NONE,ZERO
-NONE,XAUDIOALARM,RELATEDTO,NONE,ZERO
-NONE,XAUDIOALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XAUDIOALARM,RESOURCES,NONE,ZERO
-NONE,XAUDIOALARM,RRULE,NONE,ZERO
-NONE,XAUDIOALARM,SEQUENCE,NONE,ZERO
-NONE,XAUDIOALARM,STATUS,NONE,ZERO
-NONE,XAUDIOALARM,SUMMARY,NONE,ZERO
-NONE,XAUDIOALARM,TRANSP,NONE,ZERO
-NONE,XAUDIOALARM,TRIGGER,NONE,ONE
-NONE,XAUDIOALARM,TZID,NONE,ZERO
-NONE,XAUDIOALARM,TZNAME,NONE,ZERO
-NONE,XAUDIOALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XAUDIOALARM,TZOFFSETTO,NONE,ZERO
-NONE,XAUDIOALARM,TZURL,NONE,ZERO
-NONE,XAUDIOALARM,UID,NONE,ZERO
-NONE,XAUDIOALARM,URL,NONE,ZERO
-NONE,XAUDIOALARM,VERSION,NONE,ZERO
-NONE,XAUDIOALARM,X,NONE,ZEROPLUS
-NONE,XDISPLAYALARM,ACTION,NONE,ONE
-NONE,XDISPLAYALARM,ATTACH,NONE,ZERO
-NONE,XDISPLAYALARM,ATTENDEE,NONE,ZERO
-NONE,XDISPLAYALARM,CALSCALE,NONE,ZERO
-NONE,XDISPLAYALARM,CATEGORIES,NONE,ZERO
-NONE,XDISPLAYALARM,CLASS,NONE,ZERO
-NONE,XDISPLAYALARM,COMMENT,NONE,ZERO
-NONE,XDISPLAYALARM,COMPLETED,NONE,ZERO
-NONE,XDISPLAYALARM,CONTACT,NONE,ZERO
-NONE,XDISPLAYALARM,CREATED,NONE,ZERO
-NONE,XDISPLAYALARM,DESCRIPTION,NONE,ONE
-NONE,XDISPLAYALARM,DTEND,NONE,ZERO
-NONE,XDISPLAYALARM,DTSTAMP,NONE,ZERO
-NONE,XDISPLAYALARM,DTSTART,NONE,ZERO
-NONE,XDISPLAYALARM,DUE,NONE,ZERO
-NONE,XDISPLAYALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
-NONE,XDISPLAYALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
-NONE,XDISPLAYALARM,EXDATE,NONE,ZERO
-NONE,XDISPLAYALARM,EXRULE,NONE,ZERO
-NONE,XDISPLAYALARM,FREEBUSY,NONE,ZERO
-NONE,XDISPLAYALARM,GEO,NONE,ZERO
-NONE,XDISPLAYALARM,LASTMODIFIED,NONE,ZERO
-NONE,XDISPLAYALARM,LOCATION,NONE,ZERO
-NONE,XDISPLAYALARM,METHOD,NONE,ZERO
-NONE,XDISPLAYALARM,ORGANIZER,NONE,ZERO
-NONE,XDISPLAYALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XDISPLAYALARM,PRIORITY,NONE,ZERO
-NONE,XDISPLAYALARM,PRODID,NONE,ZERO
-NONE,XDISPLAYALARM,RDATE,NONE,ZERO
-NONE,XDISPLAYALARM,RECURRENCEID,NONE,ZERO
-NONE,XDISPLAYALARM,RELATEDTO,NONE,ZERO
-NONE,XDISPLAYALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XDISPLAYALARM,RESOURCES,NONE,ZERO
-NONE,XDISPLAYALARM,RRULE,NONE,ZERO
-NONE,XDISPLAYALARM,SEQUENCE,NONE,ZERO
-NONE,XDISPLAYALARM,STATUS,NONE,ZERO
-NONE,XDISPLAYALARM,SUMMARY,NONE,ZERO
-NONE,XDISPLAYALARM,TRANSP,NONE,ZERO
-NONE,XDISPLAYALARM,TRIGGER,NONE,ONE
-NONE,XDISPLAYALARM,TZID,NONE,ZERO
-NONE,XDISPLAYALARM,TZNAME,NONE,ZERO
-NONE,XDISPLAYALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XDISPLAYALARM,TZOFFSETTO,NONE,ZERO
-NONE,XDISPLAYALARM,TZURL,NONE,ZERO
-NONE,XDISPLAYALARM,UID,NONE,ZERO
-NONE,XDISPLAYALARM,URL,NONE,ZERO
-NONE,XDISPLAYALARM,VERSION,NONE,ZERO
-NONE,XDISPLAYALARM,X,NONE,ZEROPLUS
-NONE,XEMAILALARM,ACTION,NONE,ONE,must_be_email
-NONE,XEMAILALARM,ATTACH,NONE,ZEROPLUS
-NONE,XEMAILALARM,ATTENDEE,NONE,ONEPLUS
-NONE,XEMAILALARM,CALSCALE,NONE,ZERO
-NONE,XEMAILALARM,CATEGORIES,NONE,ZERO
-NONE,XEMAILALARM,CLASS,NONE,ZERO
-NONE,XEMAILALARM,COMMENT,NONE,ZERO
-NONE,XEMAILALARM,COMPLETED,NONE,ZERO
-NONE,XEMAILALARM,CONTACT,NONE,ZERO
-NONE,XEMAILALARM,CREATED,NONE,ZERO
-NONE,XEMAILALARM,DESCRIPTION,NONE,ONE
-NONE,XEMAILALARM,DTEND,NONE,ZERO
-NONE,XEMAILALARM,DTSTAMP,NONE,ZERO
-NONE,XEMAILALARM,DTSTART,NONE,ZERO
-NONE,XEMAILALARM,DUE,NONE,ZERO
-NONE,XEMAILALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
-NONE,XEMAILALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
-NONE,XEMAILALARM,EXDATE,NONE,ZERO
-NONE,XEMAILALARM,EXRULE,NONE,ZERO
-NONE,XEMAILALARM,FREEBUSY,NONE,ZERO
-NONE,XEMAILALARM,GEO,NONE,ZERO
-NONE,XEMAILALARM,LASTMODIFIED,NONE,ZERO
-NONE,XEMAILALARM,LOCATION,NONE,ZERO
-NONE,XEMAILALARM,METHOD,NONE,ZERO
-NONE,XEMAILALARM,ORGANIZER,NONE,ZERO
-NONE,XEMAILALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XEMAILALARM,PRIORITY,NONE,ZERO
-NONE,XEMAILALARM,PRODID,NONE,ZERO
-NONE,XEMAILALARM,RDATE,NONE,ZERO
-NONE,XEMAILALARM,RECURRENCEID,NONE,ZERO
-NONE,XEMAILALARM,RELATEDTO,NONE,ZERO
-NONE,XEMAILALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XEMAILALARM,RESOURCES,NONE,ZERO
-NONE,XEMAILALARM,RRULE,NONE,ZERO
-NONE,XEMAILALARM,SEQUENCE,NONE,ZERO
-NONE,XEMAILALARM,STATUS,NONE,ZERO
-NONE,XEMAILALARM,SUMMARY,NONE,ONE
-NONE,XEMAILALARM,TRANSP,NONE,ZERO
-NONE,XEMAILALARM,TRIGGER,NONE,ONE
-NONE,XEMAILALARM,TZID,NONE,ZERO
-NONE,XEMAILALARM,TZNAME,NONE,ZERO
-NONE,XEMAILALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XEMAILALARM,TZOFFSETTO,NONE,ZERO
-NONE,XEMAILALARM,TZURL,NONE,ZERO
-NONE,XEMAILALARM,UID,NONE,ZERO
-NONE,XEMAILALARM,URL,NONE,ZERO
-NONE,XEMAILALARM,VERSION,NONE,ZERO
-NONE,XEMAILALARM,X,NONE,ZEROPLUS
-NONE,XPROCEDUREALARM,ACTION,NONE,ONE
-NONE,XPROCEDUREALARM,ATTACH,NONE,ZEROORONE
-NONE,XPROCEDUREALARM,ATTENDEE,NONE,ZERO
-NONE,XPROCEDUREALARM,CALSCALE,NONE,ZERO
-NONE,XPROCEDUREALARM,CATEGORIES,NONE,ZERO
-NONE,XPROCEDUREALARM,CLASS,NONE,ZERO
-NONE,XPROCEDUREALARM,COMMENT,NONE,ZERO
-NONE,XPROCEDUREALARM,COMPLETED,NONE,ZERO
-NONE,XPROCEDUREALARM,CONTACT,NONE,ZERO
-NONE,XPROCEDUREALARM,CREATED,NONE,ZERO
-NONE,XPROCEDUREALARM,DESCRIPTION,NONE,ZEROORONE
-NONE,XPROCEDUREALARM,DTEND,NONE,ZERO
-NONE,XPROCEDUREALARM,DTSTAMP,NONE,ZERO
-NONE,XPROCEDUREALARM,DTSTART,NONE,ZERO
-NONE,XPROCEDUREALARM,DUE,NONE,ZERO
-NONE,XPROCEDUREALARM,DURATION,NONE,ONEMUTUAL,must_have_repeat
-NONE,XPROCEDUREALARM,REPEAT,NONE,ONEMUTUAL,must_have_duration
-NONE,XPROCEDUREALARM,EXDATE,NONE,ZERO
-NONE,XPROCEDUREALARM,EXRULE,NONE,ZERO
-NONE,XPROCEDUREALARM,FREEBUSY,NONE,ZERO
-NONE,XPROCEDUREALARM,GEO,NONE,ZERO
-NONE,XPROCEDUREALARM,LASTMODIFIED,NONE,ZERO
-NONE,XPROCEDUREALARM,LOCATION,NONE,ZERO
-NONE,XPROCEDUREALARM,METHOD,NONE,ZERO
-NONE,XPROCEDUREALARM,ORGANIZER,NONE,ZERO
-NONE,XPROCEDUREALARM,PERCENTCOMPLETE,NONE,ZERO
-NONE,XPROCEDUREALARM,PRIORITY,NONE,ZERO
-NONE,XPROCEDUREALARM,PRODID,NONE,ZERO
-NONE,XPROCEDUREALARM,RDATE,NONE,ZERO
-NONE,XPROCEDUREALARM,RECURRENCEID,NONE,ZERO
-NONE,XPROCEDUREALARM,RELATEDTO,NONE,ZERO
-NONE,XPROCEDUREALARM,REQUESTSTATUS,NONE,ZERO
-NONE,XPROCEDUREALARM,RESOURCES,NONE,ZERO
-NONE,XPROCEDUREALARM,RRULE,NONE,ZERO
-NONE,XPROCEDUREALARM,SEQUENCE,NONE,ZERO
-NONE,XPROCEDUREALARM,STATUS,NONE,ZERO
-NONE,XPROCEDUREALARM,SUMMARY,NONE,ZERO
-NONE,XPROCEDUREALARM,TRANSP,NONE,ZERO
-NONE,XPROCEDUREALARM,TRIGGER,NONE,ONE
-NONE,XPROCEDUREALARM,TZID,NONE,ZERO
-NONE,XPROCEDUREALARM,TZNAME,NONE,ZERO
-NONE,XPROCEDUREALARM,TZOFFSETFROM,NONE,ZERO
-NONE,XPROCEDUREALARM,TZOFFSETTO,NONE,ZERO
-NONE,XPROCEDUREALARM,TZURL,NONE,ZERO
-NONE,XPROCEDUREALARM,UID,NONE,ZERO
-NONE,XPROCEDUREALARM,URL,NONE,ZERO
-NONE,XPROCEDUREALARM,VERSION,NONE,ZERO
-NONE,XPROCEDUREALARM,X,NONE,ZEROPLUS
+
+NONE,VALARM,ACTION,NONE,ONE
+NONE,VALARM,ATTACH,NONE,ZEROPLUS,validate_valarm_prop
+NONE,VALARM,ATTENDEE,NONE,ZEROPLUS,validate_valarm_prop
+NONE,VALARM,CALSCALE,NONE,ZERO
+NONE,VALARM,CATEGORIES,NONE,ZERO
+NONE,VALARM,CLASS,NONE,ZERO
+NONE,VALARM,COMMENT,NONE,ZERO
+NONE,VALARM,COMPLETED,NONE,ZERO
+NONE,VALARM,CONTACT,NONE,ZERO
+NONE,VALARM,CREATED,NONE,ZERO
+NONE,VALARM,DESCRIPTION,NONE,ZEROORONE,validate_valarm_prop
+NONE,VALARM,DTEND,NONE,ZERO
+NONE,VALARM,DTSTAMP,NONE,ZERO
+NONE,VALARM,DTSTART,NONE,ZERO
+NONE,VALARM,DUE,NONE,ZERO
+NONE,VALARM,DURATION,NONE,ONEMUTUAL,validate_valarm_prop
+NONE,VALARM,REPEAT,NONE,ONEMUTUAL,validate_valarm_prop
+NONE,VALARM,EXDATE,NONE,ZERO
+NONE,VALARM,EXRULE,NONE,ZERO
+NONE,VALARM,FREEBUSY,NONE,ZERO
+NONE,VALARM,GEO,NONE,ZERO
+NONE,VALARM,LASTMODIFIED,NONE,ZERO
+NONE,VALARM,LOCATION,NONE,ZERO
+NONE,VALARM,METHOD,NONE,ZERO
+NONE,VALARM,ORGANIZER,NONE,ZERO
+NONE,VALARM,PERCENTCOMPLETE,NONE,ZERO
+NONE,VALARM,PRIORITY,NONE,ZERO
+NONE,VALARM,PRODID,NONE,ZERO
+NONE,VALARM,RDATE,NONE,ZERO
+NONE,VALARM,RECURRENCEID,NONE,ZERO
+NONE,VALARM,RELATEDTO,NONE,ZERO
+NONE,VALARM,REQUESTSTATUS,NONE,ZERO
+NONE,VALARM,RESOURCES,NONE,ZERO
+NONE,VALARM,RRULE,NONE,ZERO
+NONE,VALARM,SEQUENCE,NONE,ZERO
+NONE,VALARM,STATUS,NONE,ZERO
+NONE,VALARM,SUMMARY,NONE,ZEROORONE,validate_valarm_prop
+NONE,VALARM,TRANSP,NONE,ZERO
+NONE,VALARM,TRIGGER,NONE,ONE
+NONE,VALARM,TZID,NONE,ZERO
+NONE,VALARM,TZNAME,NONE,ZERO
+NONE,VALARM,TZOFFSETFROM,NONE,ZERO
+NONE,VALARM,TZOFFSETTO,NONE,ZERO
+NONE,VALARM,TZURL,NONE,ZERO
+NONE,VALARM,UID,NONE,ZEROORONE
+NONE,VALARM,URL,NONE,ZERO
+NONE,VALARM,VERSION,NONE,ZERO
+NONE,VALARM,X,NONE,ZEROPLUS
+NONE,VALARM,NONE,VLOCATION,ZEROPLUS,validate_valarm_prop
+NONE,VALARM,NONE,VEVENT,ZERO
+NONE,VALARM,NONE,VTODO,ZERO
+NONE,VALARM,NONE,VJOURNAL,ZERO
+NONE,VALARM,NONE,VFREEBUSY,ZERO
+NONE,VALARM,NONE,VAVAILABILITY,ZERO
+NONE,VALARM,NONE,VPOLL,ZERO
+NONE,VALARM,NONE,VTIMEZONE,ZERO
+NONE,VALARM,NONE,VALARM,ZERO
+
NONE,VQUERY,QUERY,NONE,ZEROORONE
NONE,VQUERY,QUERYNAME,NONE,ONE
NONE,VQUERY,EXPAND,NONE,ONE
+
NONE,VAVAILABILITY,ACTION,NONE,ZERO
NONE,VAVAILABILITY,ATTACH,NONE,ZERO
NONE,VAVAILABILITY,ATTENDEE,NONE,ZERO
@@ -1537,6 +1621,7 @@ NONE,VAVAILABILITY,URL,NONE,ZEROORONE
NONE,VAVAILABILITY,VERSION,NONE,ZERO
NONE,VAVAILABILITY,X,NONE,ZEROPLUS
NONE,VAVAILABILITY,NONE,XAVAILABLE,ZEROPLUS
+
NONE,XAVAILABLE,ACTION,NONE,ZERO
NONE,XAVAILABLE,ATTACH,NONE,ZERO
NONE,XAVAILABLE,ATTENDEE,NONE,ZERO
@@ -1585,6 +1670,7 @@ NONE,XAVAILABLE,UID,NONE,ONE
NONE,XAVAILABLE,URL,NONE,ZERO
NONE,XAVAILABLE,VERSION,NONE,ZERO
NONE,XAVAILABLE,X,NONE,ZEROPLUS
+
PUBLISH,VPOLL,NONE,NONE,ONEPLUS
PUBLISH,VPOLL,DTSTAMP,NONE,ONE
PUBLISH,VPOLL,DTSTART,NONE,ZEROORONE
@@ -1624,6 +1710,7 @@ PUBLISH,VPOLL,NONE,VJOURNAL,ZEROPLUS
PUBLISH,VPOLL,NONE,VTODO,ZEROPLUS
PUBLISH,VPOLL,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
PUBLISH,VPOLL,NONE,X,ZEROPLUS
+
REQUEST,VPOLL,NONE,NONE,ONE
REQUEST,VPOLL,DTSTAMP,NONE,ONE
REQUEST,VPOLL,DTSTART,NONE,ZEROORONE
@@ -1666,6 +1753,7 @@ REQUEST,VPOLL,NONE,VFREEBUSY,ZERO
REQUEST,VPOLL,NONE,VAVAILABILITY,ZERO
REQUEST,VPOLL,NONE,VJOURNAL,ZEROPLUS
REQUEST,VPOLL,NONE,VTODO,ZEROPLUS
+
REPLY,VPOLL,NONE,NONE,ONEPLUS
REPLY,VPOLL,DTSTAMP,NONE,ONE
REPLY,VPOLL,ORGANIZER,NONE,ONE
@@ -1708,6 +1796,7 @@ REPLY,VPOLL,NONE,VFREEBUSY,ZERO
REPLY,VPOLL,NONE,VAVAILABILITY,ZERO
REPLY,VPOLL,NONE,VJOURNAL,ZERO
REPLY,VPOLL,NONE,VTODO,ZERO
+
CANCEL,VPOLL,NONE,NONE,ONEPLUS
CANCEL,VPOLL,UID,NONE,ONE
CANCEL,VPOLL,DTSTAMP,NONE,ONE
@@ -1735,7 +1824,7 @@ CANCEL,VPOLL,POLLPROPERTIES,NONE,ZERO
CANCEL,VPOLL,PRIORITY,NONE,ZEROORONE
CANCEL,VPOLL,RELATEDTO,NONE,ZEROPLUS
CANCEL,VPOLL,RESOURCES,NONE,ZEROPLUS
-CANCEL,VPOLL,STATUS,NONE,ZEROORONE,must_be_cancel_if_present
+CANCEL,VPOLL,STATUS,NONE,ZEROORONE,validate_status_value
CANCEL,VPOLL,SUMMARY,NONE,ONE
CANCEL,VPOLL,TRANSP,NONE,ZEROORONE
CANCEL,VPOLL,URL,NONE,ZEROORONE
@@ -1750,6 +1839,7 @@ CANCEL,VPOLL,NONE,VFREEBUSY,ZERO
CANCEL,VPOLL,NONE,VAVAILABILITY,ZERO
CANCEL,VPOLL,NONE,VJOURNAL,ZERO
CANCEL,VPOLL,NONE,VTODO,ZERO
+
REFRESH,VPOLL,NONE,NONE,ONE
REFRESH,VPOLL,DTSTAMP,NONE,ONE
REFRESH,VPOLL,ORGANIZER,NONE,ONE
@@ -1791,6 +1881,7 @@ REFRESH,VPOLL,NONE,VJOURNAL,ZERO
REFRESH,VPOLL,NONE,VEVENT,ZERO
REFRESH,VPOLL,NONE,VFREEBUSY,ZERO
REFRESH,VPOLL,NONE,VAVAILABILITY,ZERO
+
POLLSTATUS,VPOLL,NONE,NONE,ONEPLUS
POLLSTATUS,VPOLL,COMPLETED,NONE,ZEROORONE
POLLSTATUS,VPOLL,DTSTAMP,NONE,ONE
@@ -1830,6 +1921,7 @@ POLLSTATUS,VPOLL,NONE,VJOURNAL,ZEROPLUS
POLLSTATUS,VPOLL,NONE,VTODO,ZEROPLUS
POLLSTATUS,VPOLL,NONE,VTIMEZONE,ZEROPLUS,must_if_tz_ref
POLLSTATUS,VPOLL,NONE,X,ZEROPLUS
+
NONE,VPOLL,DTSTAMP,NONE,ONE
NONE,VPOLL,UID,NONE,ONE
NONE,VPOLL,ORGANIZER,NONE,ONE
@@ -1868,6 +1960,7 @@ NONE,VPOLL,NONE,VAVAILABILITY,ZEROPLUS
NONE,VPOLL,NONE,VJOURNAL,ZEROPLUS
NONE,VPOLL,NONE,VTODO,ZEROPLUS
NONE,VPOLL,NONE,VVOTER,ZEROPLUS
+
NONE,VVOTER,DTSTAMP,NONE,ONE
NONE,VVOTER,VOTER,NONE,ONE
NONE,VVOTER,CREATED,NONE,ZEROORONE
@@ -1894,11 +1987,12 @@ NONE,VVOTER,NONE,VJOURNAL,ZERO
NONE,VVOTER,NONE,VTODO,ZERO
NONE,VVOTER,NONE,XVOTE,ZEROPLUS
NONE,VVOTER,NONE,X,ZEROPLUS
+
NONE,XVOTE,POLLITEMID,NONE,ZEROORONE
NONE,XVOTE,RESPONSE,NONE,ZEROORONE
NONE,XVOTE,COMMENT,NONE,ZEROPLUS
NONE,XVOTE,X,NONE,ZEROPLUS
-NONE,XVOTE,NONE,VALARM,ZEROP
+NONE,XVOTE,NONE,VALARM,ZERO
NONE,XVOTE,NONE,VTIMEZONE,ZERO
NONE,XVOTE,NONE,VEVENT,ZERO
NONE,XVOTE,NONE,VFREEBUSY,ZERO
@@ -1907,6 +2001,7 @@ NONE,XVOTE,NONE,VJOURNAL,ZERO
NONE,XVOTE,NONE,VTODO,ZERO
NONE,XVOTE,NONE,VVOTER,ZERO
NONE,XVOTE,NONE,X,ZEROPLUS
+
NONE,VPATCH,DTSTAMP,NONE,ONE
NONE,VPATCH,UID,NONE,ONE
NONE,VPATCH,PATCHVERSION,NONE,ZEROORONE
@@ -1914,6 +2009,7 @@ NONE,VPATCH,PATCHORDER,NONE,ZEROORONE
NONE,VPATCH,X,NONE,ZEROPLUS
NONE,VPATCH,NONE,XPATCH,ONEPLUS
NONE,VPATCH,NONE,X,ZEROPLUS
+
NONE,XPATCH,PATCHTARGET,NONE,ONE
NONE,XPATCH,PATCHDELETE,NONE,ZEROPLUS
NONE,XPATCH,PATCHPARAMETER,NONE,ZEROPLUS
@@ -1921,3 +2017,47 @@ NONE,XPATCH,X,NONE,ZEROPLUS
NONE,XPATCH,NONE,VPATCH,ZERO
NONE,XPATCH,NONE,XPATCH,ZERO
NONE,XPATCH,NONE,X,ZEROPLUS
+
+NONE,PARTICIPANT,UID,NONE,ONE
+NONE,PARTICIPANT,PARTICIPANTTYPE,NONE,ONE
+NONE,PARTICIPANT,CALENDARADDRESS,NONE,ZEROORONE
+NONE,PARTICIPANT,CREATED,NONE,ZEROORONE
+NONE,PARTICIPANT,DESCRIPTION,NONE,ZEROORONE
+NONE,PARTICIPANT,DTSTAMP,NONE,ZEROORONE
+NONE,PARTICIPANT,GEO,NONE,ZEROORONE
+NONE,PARTICIPANT,LASTMODIFIED,NONE,ZEROORONE
+NONE,PARTICIPANT,PRIORITY,NONE,ZEROORONE
+NONE,PARTICIPANT,SEQUENCE,NONE,ZEROORONE
+NONE,PARTICIPANT,STATUS,NONE,ZEROORONE
+NONE,PARTICIPANT,SUMMARY,NONE,ZEROORONE
+NONE,PARTICIPANT,URL,NONE,ZEROORONE
+NONE,PARTICIPANT,ATTACH,NONE,ZEROPLUS
+NONE,PARTICIPANT,CATEGORIES,NONE,ZEROPLUS
+NONE,PARTICIPANT,COMMENT,NONE,ZEROPLUS
+NONE,PARTICIPANT,CONTACT,NONE,ZEROPLUS
+NONE,PARTICIPANT,LOCATION,NONE,ZEROPLUS
+NONE,PARTICIPANT,REQUESTSTATUS,NONE,ZEROPLUS
+NONE,PARTICIPANT,RELATEDTO,NONE,ZEROPLUS
+NONE,PARTICIPANT,RESOURCES,NONE,ZEROPLUS
+NONE,PARTICIPANT,STYLEDDESCRIPTION,NONE,ZEROPLUS
+NONE,PARTICIPANT,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,PARTICIPANT,X,NONE,ZEROPLUS
+NONE,PARTICIPANT,NONE,VLOCATION,ZEROPLUS
+NONE,PARTICIPANT,NONE,VRESOURCE,ZEROPLUS
+NONE,PARTICIPANT,NONE,X,ZEROPLUS
+
+NONE,VLOCATION,UID,NONE,ONE
+NONE,VLOCATION,DESCRIPTION,NONE,ZEROORONE
+NONE,VLOCATION,GEO,NONE,ZEROORONE
+NONE,VLOCATION,LOCATIONTYPE,NONE,ZEROORONE
+NONE,VLOCATION,NAME,NONE,ZEROORONE
+NONE,VLOCATION,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,VLOCATION,X,NONE,ZEROPLUS
+
+NONE,VRESOURCE,UID,NONE,ONE
+NONE,VRESOURCE,DESCRIPTION,NONE,ZEROORONE
+NONE,VRESOURCE,GEO,NONE,ZEROORONE
+NONE,VRESOURCE,NAME,NONE,ZEROORONE
+NONE,VRESOURCE,RESOURCETYPE,NONE,ZEROORONE
+NONE,VRESOURCE,STRUCTUREDDATA,NONE,ZEROPLUS
+NONE,VRESOURCE,X,NONE,ZEROPLUS
diff --git a/design-data/value-types.csv b/design-data/value-types.csv
index 3e628344..af0ac9e5 100644
--- a/design-data/value-types.csv
+++ b/design-data/value-types.csv
@@ -13,11 +13,13 @@
"URI","5018","(a)const char*","string","unitary",
"UTC-OFFSET","5029","(a)int","integer","unitary",
"QUERY","5001","(a)const char*","string","unitary",
+
"#Non-standard multi-valued types",,,,
"ATTACH","5003","(m)icalattach *","none","URI;BINARY",
"DATE-TIME-DATE","5036","(m)struct icaltimetype","Time","DATE-TIME;DATE",
"DATE-TIME-PERIOD","5015","(m)struct icaldatetimeperiodtype","none","DATE-TIME;DATE;PERIOD",
"TRIGGER","5024","(m)struct icaltriggertype","string","DURATION;DATE-TIME",
+
"#Non-standard property enumeration types",,,,
"#METHOD:POLLSTATUS from draft-york-vpoll",,,,
"METHOD","5030","(a)enum icalproperty_method","string","unitary","X=10500;PUBLISH;REQUEST;REPLY;ADD;CANCEL;REFRESH;COUNTER;DECLINECOUNTER;CREATE;READ;RESPONSE;MOVE;MODIFY;GENERATEUID;DELETE;POLLSTATUS;NONE=10599"
@@ -26,24 +28,37 @@
"STATUS","5005","(a)enum icalproperty_status","string","unitary","X=10900;TENTATIVE;CONFIRMED;COMPLETED;NEEDS-ACTION;CANCELLED;IN-PROCESS;DRAFT;FINAL;SUBMITTED;PENDING;FAILED;DELETED;NONE=10999"
"TRANSP","5006","(a)enum icalproperty_transp","string","unitary","X=11000;OPAQUE;OPAQUE-NOCONFLICT;TRANSPARENT;TRANSPARENT-NOCONFLICT;NONE=11099"
"CLASS","5019","(m)enum icalproperty_class","string","unitary","X=10300;PUBLIC;PRIVATE;CONFIDENTIAL;NONE=10399"
+
"#Other non-standard",,,,
"REQUEST-STATUS","5009","(a)struct icalreqstattype","string","unitary"
"GEO","5004","(m)struct icalgeotype","tuple","unitary",
"STRING","5007","(a)const char*","string","unitary",
"X","5022","(m)const char*","string","unitary",
+
"#CAP enumeration types",,,,
"CMD","5010","(a)enum icalproperty_cmd","string","unitary","X=10400;ABORT;CONTINUE;CREATE;DELETE;GENERATE-UID;GET-CAPABILITY;IDENTIFY;MODIFY;MOVE;REPLY;SEARCH;SET-LOCALE;NONE=10499"
"QUERY-LEVEL","5012","(a)enum icalproperty_querylevel","string","unitary","X=10800;CAL-QL-1;CAL-QL-NONE;NONE=10899"
"CAR-LEVEL","5016","(a)enum icalproperty_carlevel","string","unitary","X=10200;CAR-NONE;CAR-MIN;CAR-FULL-1;NONE=10299"
"ANY","5000",,,,
"NO","5031",,,,
+
"#VAVAILABILITY types","RFC 7953 Section 3.2",,,
"BUSYTYPE","5032","(a)enum icalproperty_busytype","string","unitary","X=10100;BUSY;BUSY-UNAVAILABLE;BUSY-TENTATIVE;NONE=10199"
+
"#VPOLL types","draft-york-vpoll",,,
"POLLMODE","5033","(a)enum icalproperty_pollmode","string","unitary","X=10700;BASIC;NONE=10799"
"POLLCOMPLETION","5034","(a)enum icalproperty_pollcompletion","string","unitary","X=10600;SERVER;SERVER-SUBMIT;SERVER-CHOICE;CLIENT;NONE=10699"
+
"#Task Extension types","draft-apthorp-ical-tasks",,,
"TASKMODE","5035","(a)enum icalproperty_taskmode","string","unitary","X=11200;AUTOMATIC-COMPLETION;AUTOMATIC-FAILURE;AUTOMATIC-STATUS;NONE=11299"
+
+"#VALARM Extension types","RFC 9074 Section 8.1",,,
+"PROXIMITY","5039","(a)enum icalproperty_proximity","string","unitary","X=11300;ARRIVE;DEPART;CONNECT;DISCONNECT;NONE=11399"
+
+"#Event Publication Extension types","RFC 9073 Section 6",,,
+"PARTICIPANTTYPE","5037","(a)enum icalproperty_participanttype","string","unitary","X=11400;ACTIVE;INACTIVE;SPONSOR;CONTACT;BOOKING-CONTACT;EMERGENCY-CONTACT;PUBLICITY-CONTACT;PLANNER-CONTACT;PERFORMER;SPEAKER;NONE=11499"
+"RESOURCETYPE","5038","(a)enum icalproperty_resourcetype","string","unitary","X=11500;ROOM;PROJECTOR;REMOTE-CONFERENCE-AUDIO;REMOTE-CONFERENCE-VIDEO;NONE=11599"
+
"#NOTE for updaters. Preserve the icalvalue_kind Enum values and property Enum values to aid forward compatibility"
"# New Enum values for an existing icalvalue_kind should be inserted before the corresponding NONE value"
-"# New icalvalue_kind types should start their Enum value after the highest NONE value (currently 11299)"
+"# New icalvalue_kind types should start their Enum value after the highest NONE value (currently 11599)"
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 5a33a4d3..97d38815 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_subdirectory(reference)
#
@@ -18,7 +21,7 @@ set_package_properties(Doxygen PROPERTIES
PURPOSE "Needed to build the API documentation."
)
if(DOXYGEN_FOUND)
- file(GLOB _dox_deps *.dox *.html)
+ file(GLOB _dox_deps *.dox *.html *.md ${CMAKE_SOURCE_DIR}/README.md)
file(GLOB _all_hdrs
${CMAKE_SOURCE_DIR}/src/libical/*.h
${CMAKE_SOURCE_DIR}/src/libical/*.c
@@ -52,9 +55,11 @@ if(DOXYGEN_FOUND)
COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
DEPENDS ${_all_hdrs} ${_dox_deps} ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.cmake
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ COMMENT "Run Doxygen"
)
add_custom_target(docs
DEPENDS ${CMAKE_BINARY_DIR}/apidocs/html/index.html
+ COMMENT "Target to build the documentation"
)
add_dependencies(docs ical icalss icalvcal)
if(WITH_CXX_BINDINGS)
diff --git a/doc/Doxyfile.cmake b/doc/Doxyfile.cmake
index 0573c0e7..123fc512 100644
--- a/doc/Doxyfile.cmake
+++ b/doc/Doxyfile.cmake
@@ -1,3 +1,6 @@
+#SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+#SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
@@ -78,6 +81,7 @@ WARN_LOGFILE = doxygen.log
# configuration options related to the input files
#---------------------------------------------------------------------------
INPUT = @DOXYGEN_INPUT@
+USE_MDFILE_AS_MAINPAGE = README.md
FILE_PATTERNS = *.cpp \
*.c \
*.cc \
@@ -86,6 +90,7 @@ FILE_PATTERNS = *.cpp \
*.hh \
*.hxx \
*.hpp \
+ *.md \
*.dox
RECURSIVE = YES
EXCLUDE = @CMAKE_SOURCE_DIR@/src/java \
@@ -106,7 +111,7 @@ EXCLUDE_PATTERNS = */.svn/* \
EXAMPLE_PATH =
EXAMPLE_PATTERNS = *
EXAMPLE_RECURSIVE = NO
-IMAGE_PATH = @CMAKE_SOURCE_DIR@/docs
+IMAGE_PATH = @CMAKE_SOURCE_DIR@/doc
INPUT_FILTER =
FILTER_PATTERNS =
FILTER_SOURCE_FILES = NO
diff --git a/doc/Mainpage.dox b/doc/Mainpage.dox
deleted file mode 100644
index 7e9cd259..00000000
--- a/doc/Mainpage.dox
+++ /dev/null
@@ -1,37 +0,0 @@
-/*!
-@mainpage Libical - an implementation of iCalendar protocols and data formats
-
-@section about About
-
-Libical is an Open Source implementation of the iCalendar protocols
-and protocol data units. The iCalendar specification describes how
-calendar clients can communicate with calendar servers so users can
-store their calendar data and arrange meetings with other users.
-
-Libical implements RFC5545, RFC5546, RFC7529;
-the CalDav scheduling extensions in RFC6638;
-iCalendar extensions in RFC7986;
-plus the iCalendar iMIP protocol in RFC6047.
-
-@section license License
-
-The code and datafiles in this distribution are licensed under the
-Mozilla Public License (MPL) v2.0. See https://www.mozilla.org/MPL
-for a copy of the license.
-
-Alternately, you may use libical under the terms of the GNU Library
-General Public License (LGPL) v2.1. See https://www.gnu.org/licenses/lgpl-2.1.txt
-for a copy of the license.
-
-This dual license ensures that the library can be incorporated into
-both proprietary code and GPL'd programs, and will benefit from improvements
-made by programmers in both realms. I will only accept changes into
-my version of the library if they are similarly dual-licensed.
-
-@section acknowledgements Acknowledgments
-
-Portions of this distribution are (C) Copyright 1996 Apple Computer,
-Inc., AT&T Corp., International Business Machines Corporation and
-Siemens Rolm Communications Inc. See src/libicalvcal/README.TXT for details.
-
-*/
diff --git a/doc/UsingLibical.md b/doc/UsingLibical.md
index b158f560..f8ea3084 100644
--- a/doc/UsingLibical.md
+++ b/doc/UsingLibical.md
@@ -1,8 +1,8 @@
-# Using Libical
+# Using Libical {#UsingLibical}
-> Author: Eric Busboom <eric@civicknowledge.com>
->
-> Date: January 2001
+> Author: Eric Busboom <eric@civicknowledge.com>
+>
+> Date: January 2001
## 1 Introduction
@@ -11,9 +11,10 @@ and protocol data units. The iCalendar specification describes how
calendar clients can communicate with calendar servers so users can
store their calendar data and arrange meetings with other users.
-Libical implements [RFC5545][], [RFC5546][], [RFC7529][]; the
-iCalendar extensions in [RFC6638][]; and some of [RFC6047][].
-
+Libical implements [RFC5545][], [RFC5546][], [RFC7529][];
+the CalDav scheduling extensions in [RFC6638][];
+the iCalendar extensions in [RFC7986][], [RFC9073][], [RFC9074][];
+and some of [RFC6047][].
This documentation assumes that you are familiar with the iCalendar
standards RFC5545 and RFC5546. These specifications are available
@@ -23,13 +24,17 @@ at the [IETF Tools][] website:
[RFC5546]: https://tools.ietf.org/html/rfc5546
[RFC7529]: https://tools.ietf.org/html/rfc7529
[RFC6638]: https://tools.ietf.org/html/rfc6638
+[RFC7986]: https://tools.ietf.org/html/rfc7986
+[RFC9073]: https://tools.ietf.org/html/rfc9073
+[RFC9074]: https://tools.ietf.org/html/rfc9074
[RFC6047]: https://tools.ietf.org/html/rfc6047
+
[IETF Tools]: https://tools.ietf.org/
### 1.1 The libical project
This code is under active development. If you would like to contribute
-to the project, visit <https://libical.github.io/libical/>
+to the project, visit <https://libical.github.io/libical/>.
### 1.2 License
@@ -41,8 +46,8 @@ See <https://www.gnu.org/licenses/lgpl-2.1.html> for a copy of the LGPL.
This dual license ensures that the library can be incorporated into
both proprietary code and GPL'd programs, and will benefit from improvements
-made by programmers in both realms. I will only accept changes into
-my version of the library if they are similarly dual-licensed.
+made by programmers in both realms. We (the libical developers) will only
+accept changes to this library if they are similarly dual-licensed.
### 1.3 Example Code
@@ -156,7 +161,7 @@ or union.
#### 3.2.2 The parser
-The libical parser offers a variety of ways to convert [RFC5545][] text
+The libical parser offers a variety of ways to convert [RFC5545][] text
into a libical internal component structure. The parser can parse
blocks of text as a string, or it can parse line-by-line.
@@ -169,7 +174,7 @@ errors and component usage errors.
Since many of libical's interfaces return strings, the library has its
own memory management system to eliminate the need to free every string
-returned from the library.
+returned from the library. See [Memory Management](#memory).
#### 3.2.5 Storage classes
@@ -190,7 +195,7 @@ by maintaining a self-similar interface.
Libical defines components for groups of properties that look and act
like components, but are not defined as components in the specification.
`XDAYLIGHT` and `XSTANDARD` are notable examples. These pseudo components
-group properties within the `VTIMEZONE` components. For instanace, the
+group properties within the `VTIMEZONE` components. For instance, the
timezone properties associated with daylight savings time starts with
`BEGIN:DAYLIGHT` and ends with `END:DAYLIGHT`, just like other components,
but is not defined as a component in [RFC5545][] (see [section 3.6.5][RFC5545 3.6.5])
@@ -225,7 +230,7 @@ It is natural to have interfaces that would return the value of a property,
but it is cumbersome for a single routine to return multiple types.
So, in libical, properties that can have multiple types are given
a single type that is the union of their RFC5545 types. For instance,
-in libical, the value of the `TRIGGER` property resolves to struct
+in libical, the value of the `TRIGGER` property resolves to struct
`icaltriggertype`. This type is a union of a `DURATION` and a `DATE-TIME`.
### 4.3 Multi-Valued Properties
@@ -261,10 +266,11 @@ into one.
### 5.1 Creating Components
-There are three ways to create components in Libical:
-1. creating individual objects and assembling them,
-2. building entire objects in massive vaargs calls,
-3. and parsing a text file containing iCalendar data.
+There are three ways to create components in Libical:
+
+1. creating individual objects and assembling them,
+2. building entire objects in massive vargs calls,
+3. parsing a text file containing iCalendar data.
#### 5.1.1 Constructor Interfaces
@@ -300,7 +306,7 @@ Most things you work with are objects, that are instantiated with
a constructor that has "new" in the name. Also note that, other than
the object reference, most structure data is passed in to libical
routines by value. Libical has some complex but very regular memory
-handling rules. These are detailed in section [sec:memory].
+handling rules. These are detailed in section [Memory Management](#memory).
If any of the constructors fail, they will return 0. If you try to
insert 0 into a property or component, or use a zero-valued object
@@ -349,9 +355,9 @@ calendar =
This form is similar to the constructor form, except that the constructors
have `vanew` instead of `new` in the name. The arguments are similar
too, except that the component constructor can have a list of properties,
-and the property constructor can have a list of parameters.
+and the property constructor can have a list of parameters.
-*Be sure to terminate every list with a `NULL` (or a *`(void 0)`*, or your code
+*Be sure to terminate every list with a `NULL` (or a *`(void 0)`*, or your code
will crash, if you are lucky*. The reason you can't use 0 itself is that
depending on what platform you are on, `sizeof(int) ≠ sizeof(void*)`.
@@ -367,7 +373,7 @@ icalcomponent* icalparser_parse_string(char* str);
If the string contains only one component, the parser will return the
component in libical form. If the string contains multiple components,
-the multiple components will be returned as the children of an
+the multiple components will be returned as the children of an
`ICAL_XROOT_COMPONENT` component.
Parsing a whole string may seem wasteful if you want to pull a large
@@ -404,7 +410,7 @@ char* read_stream(char *s, size_t size, void *d)
return fgets(s, size, (FILE*)d);
}
-int main(int argc, char *argv[])
+int main(int argc, char *argv[])
{
char *line;
icalcomponent *component;
@@ -474,7 +480,7 @@ char* read_stream(char *s, size_t size, void *d)
return fgets(s, size, (FILE*)d);
}
-int main(int argc, char *argv[])
+int main(int argc, char *argv[])
{
char* line;
icalcomponent *component;
@@ -522,13 +528,13 @@ icalcomponent* icalcomponent_get_first_component(
This routine will return a reference to the first component of the
type `kind`. The key kind values, listed in icalenums.h are:
-- `ICAL_ANY_COMPONENT`
-- `ICAL_VEVENT_COMPONENT`
-- `ICAL_VTODO_COMPONENT`
-- `ICAL_VJOURNAL_COMPONENT`
-- `ICAL_VCALENDAR_COMPONENT`
-- `ICAL_VFREEBUSY_COMPONENT`
-- `ICAL_VALARM_COMPONENT`
+- `ICAL_ANY_COMPONENT`
+- `ICAL_VEVENT_COMPONENT`
+- `ICAL_VTODO_COMPONENT`
+- `ICAL_VJOURNAL_COMPONENT`
+- `ICAL_VCALENDAR_COMPONENT`
+- `ICAL_VFREEBUSY_COMPONENT`
+- `ICAL_VALARM_COMPONENT`
These are only the most common components; there are many more listed
in icalenums.h.
@@ -613,7 +619,7 @@ Here is an example of a loop using these routines:
```c
for(i = icalcomponent_begin_component(impl->cluster, ICAL_ANY_COMPONENT);
icalcompiter_deref(&i)!= 0;
- icalcompiter_next(&i))
+ icalcompiter_next(&i))
{
icalcomponent *this = icalcompiter_deref(&i);
}
@@ -640,7 +646,7 @@ for(c = icalcomponent_get_first_component(parent_comp, ICAL_ANY_COMPONENT);
}
```
-Another way to remove components is to rely on the side effect of
+Another way to remove components is to rely on the side effect of
`icalcomponent_remove_component()`:
if component iterator in the parent component is pointing to the child
that will be removed, it will move the iterator to the component after
@@ -712,17 +718,17 @@ their own. You can manipulate them either as part of the property
or independently.
The most common way to work with values to is to manipulate them from
-they properties that contain them. This involves fewer routine calls
+the properties that contain them. This involves fewer routine calls
and intermediate variables than working with them independently, and
it is type-safe.
-For each property, there are a `_get_()` and a `_set_()` routine that
-accesses the internal value. For instanace, for the `UID` property, the
+For each property, there are a `_get_()` and a `_set_()` routine that
+accesses the internal value. For instanace, for the `UID` property, the
routines are:
```c
void icalproperty_set_uid(
- icalproperty* prop,
+ icalproperty* prop,
const char* v);
const char* icalproperty_get_uid(
@@ -740,7 +746,7 @@ icalvalue* icalproperty_get_value(
icalproperty* prop);
void icalproperty_set_value(
- icalproperty* prop,
+ icalproperty* prop,
icalvalue* value);
```
@@ -754,7 +760,7 @@ struct icaltimetype icalvalue_get_datetime(
icalvalue* value);
void icalvalue_set_datetime(
- icalvalue* value,
+ icalvalue* value,
struct icaltimetype v);
```
@@ -764,7 +770,7 @@ always a string. To get and set the value, use:
```x
void icalproperty_set_x(
- icalproperty* prop,
+ icalproperty* prop,
char* v);
char* icalproperty_get_x(
@@ -779,7 +785,7 @@ char* icalproperty_get_x_name(
icalproperty* prop)
void icalproperty_set_x_name(
- icalproperty* prop,
+ icalproperty* prop,
char* name);
```
@@ -792,7 +798,7 @@ declares what operation a remote receiver should use to process a
component. For instance, if the `METHOD` is `REQUEST` and the component
is a `VEVENT`, the sender is probably asking the receiver to join in
a meeting. In this case, RFC5546 says that the component must specify
-a start time (`DTSTART`) and list the receiver as an attendee
+a start time (`DTSTART`) and list the receiver as an attendee
(`ATTENDEE`).
Libical can check these restrictions with the routine:
@@ -850,11 +856,11 @@ struct icaltimetype {
int minute;
int second;
int is_utc; /* 1-> time is in UTC timezone */
- int is_date; /* 1 -> interpret this as date. */
+ int is_date; /* 1 -> interpret this as date. */
};
```
-The `year`, `month`, `day`, `hour`, `minute` and `second` fields
+The `year`, `month`, `day`, `hour`, `minute` and `second` fields
hold the broken-out
time values. The `is_utc` field distinguishes between times in UTC and
a local time zone. The `is_date` field indicates if the time should
@@ -870,7 +876,7 @@ struct icaltimetype icaltime_from_string(
const char* str);
struct icaltimetype icaltime_from_timet_with_zone(
- time_t v,
+ icaltime_t v,
int is_date,
icaltimezone* zone);
```
@@ -881,7 +887,7 @@ struct icaltimetype icaltime_from_timet_with_zone(
struct icaltimetype tt = icaltime_from_string("19970101T103000");
```
-`icaltime_from_timet_with_zone()` takes a `time_t` value, representing seconds past
+`icaltime_from_timet_with_zone()` takes a `icaltime_t` value, representing seconds past
the POSIX epoch, a flag to indicate if the time is a date, and a time zone.
Dates have an identical structure to a time, but the time portion (hours,
minutes and seconds) is always 00:00:00. Dates act differently in
@@ -928,19 +934,19 @@ short icaltime_day_of_year(
struct icaltimetype t);
struct icaltimetype icaltime_from_day_of_year(
- short doy,
+ short doy,
short year);
short icaltime_day_of_week(
struct icaltimetype t);
short icaltime_start_doy_week(
- struct icaltimetype t,
+ struct icaltimetype t,
int fdow);
short icaltime_week_number(
- short day_of_month,
- short month,
+ short day_of_month,
+ short month,
short year);
short icaltime_days_in_month(
@@ -954,11 +960,11 @@ the hour, minute and second fields should be used in the conversion.
```c
struct icaltimetype icaltime_from_timet_with_zone(
- time_t v,
+ icaltime_t v,
int is_date,
icaltimezone* zone);
-time_t icaltime_as_timet(
+icaltime_t icaltime_as_timet(
struct icaltimetype);
```
@@ -966,7 +972,7 @@ The compare routine works exactly like `strcmp()`, but on time structures.
```c
int icaltime_compare(
- struct icaltimetype a,
+ struct icaltimetype a,
struct icaltimetype b);
```
@@ -987,17 +993,17 @@ time all year.
```c
int icaltime_utc_offset(
- struct icaltimetype tt,
+ struct icaltimetype tt,
char* tzid);
int icaltime_local_utc_offset();
struct icaltimetype icaltime_as_utc(
- struct icaltimetype tt,
+ struct icaltimetype tt,
char* tzid);
struct icaltimetype icaltime_as_zone(
- struct icaltimetype tt,
+ struct icaltimetype tt,
char* tzid);
struct icaltimetype icaltime_as_local(
@@ -1035,38 +1041,38 @@ icalerrorenum icaldirset_commit(
icaldirset* store);
icalerrorenum icaldirset_add_component(
- icaldirset* store,
+ icaldirset* store,
icalcomponent* comp);
icalerrorenum icaldirset_remove_component(
- icaldirset* store,
+ icaldirset* store,
icalcomponent* comp);
int icaldirset_count_components(
- icaldirset* store,
+ icaldirset* store,
icalcomponent_kind kind);
icalerrorenum icaldirset_select(
- icaldirset* store,
+ icaldirset* store,
icalcomponent* gauge);
void icaldirset_clear(
icaldirset* store);
icalcomponent* icaldirset_fetch(
- icaldirset* store,
+ icaldirset* store,
const char* uid);
int icaldirset_has_uid(
- icaldirset* store,
+ icaldirset* store,
const char* uid);
icalcomponent* icaldirset_fetch_match(
- icaldirset* set,
+ icaldirset* set,
icalcomponent *c);
icalerrorenum icaldirset_modify(
- icaldirset* store,
+ icaldirset* store,
icalcomponent *oldc,
icalcomponent *newc);
@@ -1103,13 +1109,13 @@ icalfileset* icalfileset_new(
const char* path);
icalfileset* icalfileset_new_open(
- const char* path,
- int flags,
+ const char* path,
+ int flags,
int mode);
```
`icalset_new_file()` is identical to `icalfileset_new()`. Both routines will
-open an existing file for readinga and writing, or create a new file
+open an existing file for reading and writing, or create a new file
if it does not exist. `icalfileset_new_open()` takes the same arguments
as the open() system routine and behaves in the same way.
@@ -1125,7 +1131,7 @@ To add components to a set, use:
```c
icalerrorenum icalfileset_add_component(
- icalfileset* cluster,
+ icalfileset* cluster,
icalcomponent* child);
```
@@ -1170,7 +1176,7 @@ Then, you can add the gauge to the set with :
```c
icalerrorenum icalfileset_select(
- icalfileset* store,
+ icalfileset* store,
icalgauge* gauge);
```
@@ -1191,8 +1197,7 @@ DTSTART <= '20000106T120000Z'");
fs = icalfileset_new(path);
for (i = 0; i!= 10; i++){
- c = make_component(i); /* Make a new component where DTSTART
-has month of i */
+ c = make_component(i); /* Make a new component where DTSTART has month of i */
icalfileset_add_component(fs,c);
}
@@ -1217,6 +1222,7 @@ has month of i */
There are several other routines in the icalset interface, but they
not fully implemented yet.
+<a id="memory"></a>
#### 5.5 Memory Management
Libical relies heavily on dynamic allocation for both the core objects
@@ -1224,35 +1230,35 @@ and for the strings used to hold values. Some of this memory the library
caller owns and must free, and some of the memory is managed by the
library. Here is a summary of the memory rules.
-1. If the function name has "new" in it (such as `icalcomponent_new()`,
- or `icalproperty_new_from_string()`), the caller gets control
- of the memory. The caller also gets control over an object that is
- cloned via a function that ends with "_clone" (like `icalcomponent_clone()`)
+1. If the function name has "new" in it (such as `icalcomponent_new()`,
+ or `icalproperty_new_from_string()`), the caller gets control
+ of the memory. The caller also gets control over an object that is
+ cloned via a function that ends with "_clone" (like `icalcomponent_clone()`)
-2. If you got the memory from a routine with "clone" or "new" in it, you
- must call the corresponding `*_free()` routine to free the memory,
- for example use `icalcomponent_free()` to free objects created with
- `icalcomponent_new()` or `icalcomponent_clone()`
+2. If you got the memory from a routine with "clone" or "new" in it, you
+ must call the corresponding `*_free()` routine to free the memory,
+ for example use `icalcomponent_free()` to free objects created with
+ `icalcomponent_new()` or `icalcomponent_clone()`
-3. If the function name has "add" in it, the caller is transferring
- control of the memory to the routine, for example the function
- ` icalproperty_add_parameter()`
+3. If the function name has "add" in it, the caller is transferring
+ control of the memory to the routine, for example the function
+ ` icalproperty_add_parameter()`
-4. If the function name has "remove" in it, the caller passes in
- a pointer to an object and after the call returns, the caller owns
- the object. So, before you call `icalcomponent_remove_property(comp, foo)`,
- you do not own "foo" and after the call returns, you do.
+4. If the function name has "remove" in it, the caller passes in
+ a pointer to an object and after the call returns, the caller owns
+ the object. So, before you call `icalcomponent_remove_property(comp, foo)`,
+ you do not own "foo" and after the call returns, you do.
-5. If the routine returns a string and its name does NOT end in `_r`,
- libical owns the memory and will put it on a ring buffer to reclaim
- later. For example, `icalcomponent_as_ical_string()`. You better
- `strdup()` it if you want to keep it, and you don't have to delete it.
+5. If the routine returns a string and its name does NOT end in `_r`,
+ libical owns the memory and will put it on a ring buffer to reclaim
+ later. For example, `icalcomponent_as_ical_string()`. You better
+ `strdup()` it if you want to keep it, and you don't have to delete it.
-6. If the routine returns a string and its name *does* end in `_r`, the
- caller gets control of the memory and is responsible for freeing it.
- For example, `icalcomponent_as_ical_string_r()` does the same thing as
- `icalcomponent_as_ical_string()`, except you now have control of the
- string buffer it returns.
+6. If the routine returns a string and its name *does* end in `_r`, the
+ caller gets control of the memory and is responsible for freeing it.
+ For example, `icalcomponent_as_ical_string_r()` does the same thing as
+ `icalcomponent_as_ical_string()`, except you now have control of the
+ string buffer it returns.
### 5.6 Error Handling
@@ -1271,36 +1277,34 @@ of enum `icalerrorenum`.
Most routines will set the global error value `icalerrno` on errors.
This variable is an enumeration; permissible values can be found in
`libical/icalerror.h`. If the routine returns an enum icalerrorenum,
-then the return value will be the same as icalerrno. You can use
-`icalerror_strerror()` to get a string that describes the error.
+then the return value will be the same as icalerrno. You can use
+`icalerror_strerror()` to get a string that describes the error.
The enumerations are:
-- `ICAL_BADARG_ERROR`: One of the argument to a routine was bad.
- Typically for a null pointer.
+- `ICAL_BADARG_ERROR`: One of the arguments to a routine was bad.
+ Typically for a null pointer.
-- `ICAL_NEWFAILED_ERROR`: A `new()` or `malloc()` failed.
+- `ICAL_NEWFAILED_ERROR`: A `new()` or `malloc()` failed.
-- `ICAL_MALFORMEDDATA_ERROR`: An input string was not in the correct
- format
+- `ICAL_MALFORMEDDATA_ERROR`: An input string was not in the correct format
-- `ICAL_PARSE_ERROR`: The parser failed to parse an incoming component
+- `ICAL_PARSE_ERROR`: The parser failed to parse an incoming component
-- `ICAL_INTERNAL_ERROR`: Largely equivalent to an assert
+- `ICAL_INTERNAL_ERROR`: Largely equivalent to an assert
-- `ICAL_FILE_ERROR`: A file operation failed. Check errno for more
- detail.
+- `ICAL_FILE_ERROR`: A file operation failed. Check errno for more detail.
-- `ICAL_ALLOCATION_ERROR`: ?
+- `ICAL_ALLOCATION_ERROR`: ?
-- `ICAL_USAGE_ERROR`: ?
+- `ICAL_USAGE_ERROR`: ?
-- `ICAL_NO_ERROR`: No error
+- `ICAL_NO_ERROR`: No error
-- `ICAL_MULTIPLEINCLUSION_ERROR`: ?
+- `ICAL_MULTIPLEINCLUSION_ERROR`: ?
-- `ICAL_TIMEDOUT_ERROR`: For CSTP and acquiring locks
+- `ICAL_TIMEDOUT_ERROR`: For CSTP and acquiring locks
-- `ICAL_UNKNOWN_ERROR`: ?
+- `ICAL_UNKNOWN_ERROR`: ?
#### 5.6.3 `X-LIC-ERROR` and `X-LIC-INVALID-COMPONENT`
@@ -1325,41 +1329,22 @@ RFC5545.
There are a few routines to manipulate error properties:
-[ The following data is supposed to be in a table. It looks OK in LyX,
-but does not format properly in output. ]
-
-+-------------------------------------+---------------------------------------------------------+
-| Routine | Purpose |
-+-------------------------------------+---------------------------------------------------------+
-| void icalrestriction_check() | Check a component against RFC5546 and insert |
-+-------------------------------------+---------------------------------------------------------+
-| | error properties to indicate non compliance |
-+-------------------------------------+---------------------------------------------------------+
-| int icalcomponent_count_errors() | Return the number of error properties |
-+-------------------------------------+---------------------------------------------------------+
-| | in a component |
-+-------------------------------------+---------------------------------------------------------+
-| void icalcomponent_strip_errors() | Remove all error properties in as |
-+-------------------------------------+---------------------------------------------------------+
-| | component |
-+-------------------------------------+---------------------------------------------------------+
-| void icalcomponent_convert_errors() | Convert some error properties into |
-+-------------------------------------+---------------------------------------------------------+
-| | REQUESTS-STATUS proprties to indicate the inability to |
-+-------------------------------------+---------------------------------------------------------+
-| | process the component as an iTIP request. |
-+-------------------------------------+---------------------------------------------------------+
-
+| Routine | Purpose |
+|:--------------------------------------|:-----------------------------------------------------|
+| `void icalrestriction_check()` | Check a component against RFC5546 and insert error properties to indicate non compliance |
+| `int icalcomponent_count_errors()` | Return the number of error properties in a component |
+| `void icalcomponent_strip_errors()` | Remove all error properties in a component |
+| `void icalcomponent_convert_errors()` | Convert some error properties into REQUESTS-STATUS properties to indicate the inability to process the component as an iTIP request |
The types of errors are listed in icalerror.h. They are:
-- `ICAL_XLICERRORTYPE_COMPONENTPARSEERROR`
-- `ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR`
-- `ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR`
-- `ICAL_XLICERRORTYPE_PROPERTYPARSEERROR`
-- `ICAL_XLICERRORTYPE_VALUEPARSEERROR`
-- `ICAL_XLICERRORTYPE_UNKVCALPROP`
-- `ICAL_XLICERRORTYPE_INVALIDITIP`
+- `ICAL_XLICERRORTYPE_COMPONENTPARSEERROR`
+- `ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR`
+- `ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR`
+- `ICAL_XLICERRORTYPE_PROPERTYPARSEERROR`
+- `ICAL_XLICERRORTYPE_VALUEPARSEERROR`
+- `ICAL_XLICERRORTYPE_UNKVCALPROP`
+- `ICAL_XLICERRORTYPE_INVALIDITIP`
The libical parser will generate the error that end in `PARSEERROR` when
it encounters garbage in the input steam. `ICAL_XLICERRORTYPE_INVALIDITIP`
@@ -1407,10 +1392,10 @@ Enums that identify a component, property, value or parameter end with
`_COMPONENT`, `_PROPERTY`, `_VALUE`, or `_PARAMETER`"
Enums that identify a parameter value have the name of the parameter
-as the second word. For instance: `ICAL_ROLE_REQPARTICIPANT` or
+as the second word. For instance: `ICAL_ROLE_REQPARTICIPANT` or
`ICAL_PARTSTAT_ACCEPTED`.
-The enums for the parts of a recurarance rule and request statuses
+The enums for the parts of a recurrence rule and request statuses
are irregular.
## 6 Hacks and Bugs
diff --git a/doc/UsingLibical.txt b/doc/UsingLibical.txt
deleted file mode 100644
index 6e34e15c..00000000
--- a/doc/UsingLibical.txt
+++ /dev/null
@@ -1,1371 +0,0 @@
-
-
-Using Libical
-
-Eric Busboom (eric@civicknowledge.com)
-
-January 2001
-
-
-
-1 Introduction
-
-Libical is an Open Source implementation of the iCalendar protocols
-and protocol data units. The iCalendar specification describes how
-calendar clients can communicate with calendar servers so users can
-store their calendar data and arrange meetings with other users.
-
-Libical implements RFC5545, RFC5546, RFC7529; the iCalendar extensions
-in RFC6638; and some of RFC6047.
-
-This documentation assumes that you are familiar with the iCalendar
-standards RFC5545 and RFC5546. These specifications are available
-at the IETF tools website:
-
-https://tools.ietf.org/html/rfc5545
-https://tools.ietf.org/html/rfc5546
-
-1.1 The libical project
-
-This code is under active development. If you would like to contribute
-to the project, visit https://libical.github.io/libical/
-
-1.2 License
-
-The code and datafiles in this distribution are licensed under the
-Mozilla Public License version 2.0. See https://www.mozilla.org/MPL
-for a copy of the license. Alternately, you may use libical under
-the terms of the GNU Lesser General Public License, version 2.1.
-See https://www.gnu.org/licenses/lgpl-2.1.html for a copy of the LGPL.
-
-This dual license ensures that the library can be incorporated into
-both proprietary code and GPL'd programs, and will benefit from improvements
-made by programmers in both realms. I will only accept changes into
-my version of the library if they are similarly dual-licensed.
-
-1.3 Example Code
-
-A lot of the documentation for this library is in the form of example
-code. These examples are in the "examples" directory of the distribution.
-Also look in "src/test" for additional annotated examples.
-
-2 Building the Library
-
-Libical uses autoconf to generate makefiles. It should build with no
-adjustments on Linux, FreeBSD and Solaris under gcc. Some version
-have been successfully built on MacOS, Solaris, UnixWare, and
-Tru64 UNIX without gcc, but you may run into problems with a particular
-later version.
-
-For a more complete guide to building the library, see the README file
-in the distribution.
-
-3 Structure
-
-The iCalendar data model is based on four types of objects: components,
-properties, values and parameters.
-
-Properties are the fundamental unit of information in iCalendar, and they
-work a bit like a hash entry, with a constant key and a variable value.
-Properties may also have modifiers, called parameters. In the iCal
-content line
-
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-
-The property name is "ORGANIZER", the value of the property is "mrbig@host.com"
-and the "ROLE" parameter specifies that Mr Big is the chair of the
-meetings associated with this property.
-
-Components are groups of properties that represent the core objects
-of a calendar system, such as events or timezones. Components are
-delimited by "BEGIN" and "END" tags.
-
-When a component is sent across a network, if it is un-encrypted, it
-will look something like:
-
-BEGIN:VCALENDAR
-
-METHOD:REQUEST
-
-PRODID: -//hacksw/handcal//NONSGML v1.0//EN
-
-BEGIN:VEVENT
-
-DTSTAMP:19980309T231000Z
-
-UID:guid-1.host1.com
-
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
-
- MAILTO:employee-A@host.com
-
-DESCRIPTION:Project XYZ Review Meeting
-
-CATEGORIES:MEETING
-
-CLASS:PUBLIC
-
-CREATED:19980309T130000Z
-
-SUMMARY:XYZ Project Review
-
-DTSTART;TZID=US-Eastern:19980312T083000
-
-DTEND;TZID=US-Eastern:19980312T093000
-
-LOCATION:1CP Conference Room 4350
-
-END:VEVENT
-
-END:VCALENDAR
-
-Note that components can be nested; this example has both a VCALENDAR
-and a VEVENT component, one nested inside the other.
-
-3.1 Core iCal classes
-
-Libical is an object-based, data-oriented library. Nearly all of the
-routines in the library are associated with an opaque data types and
-perform some operation on that data type. Although the library does
-not actually have classes, we will use those terms since the behavior
-of these associations of data and routines is very similar to a class.
-
-3.1.1 Properties
-
-Properties are represented with the icalproperty class and its many
-"derived" classes with on "derived" class per property type in RFC5545.
-Again, there is no actual inheritance relations, but there are clusters
-of routines that make this term useful. A property is a container
-for a single value and a set of parameters.
-
-3.1.2 Components
-
-In libical, components are represented with the icalcomponent class.
-Icalcomponent is a container for a set of other components and properties.
-
-3.1.3 Values
-
-Values are represented in a similar way to properties; a base class
-and many "derived" classes. A value is essentially a abstract handle
-on a single fundamental type, a structure or a union.
-
-3.1.4 Parameters
-
-Parameters are represented in a similar way to properties, except that
-they contain only one value.
-
-3.2 Other elements of libical
-
-In addition to the core iCal classes, libical has many other types,
-structures, classes that aid in creating and using iCal components.
-
-3.2.1 Enumerations and types
-
-Libical is strongly typed, so every component, property, parameter,
-and value type has an enumeration, and some have an associated structure
-or union.
-
-3.2.2 The parser
-
-The libical parser offers a variety of ways to convert RFC5545 text
-into a libical internal component structure. the parser can parse
-blocks of text as a string, or it can parse line-by-line.
-
-3.2.3 Error objects
-
-Libical has a substantial error reporting system for both programming
-errors and component usage errors.
-
-3.2.4 Memory Management
-
-Since many of libical's interfaces return strings, the library has its
-own memory management system to eliminate the need to free every string
-returned from the library.
-
-3.2.5 Storage classes
-
-The library also offers several classes to store components to flies,
-memory or databases.
-
-4 Differences From RFCs
-
-Libical has been designed to follow the standards as closely as possible,
-so that the key objects in the standards are also key objects in the
-library. However, there are a few areas where the specifications are
-(arguably) irregular, and following them exactly would result in an
-unfriendly interface. These deviations make libical easier to use
-by maintaining a self-similar interface.
-
-4.1 Pseudo Components
-
-Libical defines components for groups of properties that look and act
-like components, but are not defined as components in the specification.
-XDAYLIGHT and XSTANDARD are notable examples. These pseudo components
-group properties within the VTIMEZONE components. For instanace, the
-timezone properties associated with daylight savings time starts with
-"BEGIN:DAYLIGHT" and ends with "END:DAYLIGHT, just like other components,
-but is not defined as a component in RFC5545 (see RFC5545, section 3.6.5)
-In Libical,this grouping is represented by the XDAYLIGHT component.
-Standard iCAL components all start with the letter "V," while pseudo
-components start with "X."
-
-There are also pseudo components that are conceptually derived classes
-of VALARM. RFC5546 defines what properties may be included in each
-component, and for VALARM, the set of properties it may have depends
-on the value of the ACTION property.
-
-For instance, if a VALARM component has an ACTION property with the
-value of "AUDIO," the component must also have an "ATTACH" property.
-However, if the ACTION value is "DISPLAY," the component must have
-a DESCRIPTION property.
-
-To handle these various, complex restrictions, libical has pseudo components
-for each type of alarm: XAUDIOALARM, XDISPLAYALARM, XEMAILALARM and
-XPROCEDUREALARM.
-
-4.2 Combined Values
-
-Many values can take more than one type. TRIGGER, for instance, can
-have a value type of with DURATION or of DATE-TIME. These multiple
-types make it difficult to create routines to return the value associated
-with a property.
-
-It is natural to have interfaces that would return the value of a property,
-but it is cumbersome for a single routine to return multiple types.
-So, in libical, properties that can have multiple types are given
-a single type that is the union of their RFC5545 types. For instance,
-in libical, the value of the TRIGGER property resolves to struct icaltriggertype.
-This type is a union of a DURATION and a DATE-TIME.
-
-4.3 Multi-Valued Properties
-
-Some properties, such as CATEGORIES have only one value type, but each
-CATEGORIES property can have multiple value instances. This also results
-in a cumbersome interface -- CATEGORIES accessors would have to return
-a list while all other accessors returned a single value. In libical,
-all properties have a single value, and multi-valued properties are
-broken down into multiple single valued properties during parsing.
-That is, an input line like,
-
-CATEGORIES: work, home
-
-becomes in libical's internal representation
-
-CATEGORIES: work
-
-CATEGORIES: home
-
-Oddly, RFC5545 allows some multi-valued properties (like FREEBUSY)
-to exist as both a multi-values property and as multiple single
-value properties, while others (like CATEGORIES) can only exist
-as single multi-valued properties. This makes the internal representation
-for CATEGORIES illegal. However when you convert a component to a
-string, the library will collect all of the CATEGORIES properties
-into one.
-
-5 Using libical
-
-5.1 Creating Components
-
-There are three ways to create components in Libical: creating individual
-objects and assembling them, building entire objects in massive vaargs
-calls, and parsing a text file containing iCalendar data.
-
-5.1.1 Constructor Interfaces
-
-Using constructor interfaces, you create each of the objects separately
-and then assemble them in to components:
-
-icalcomponent *event;
-
-icalproperty *prop;
-
-icalparameter *param;
-
-struct icaltimetype atime;
-
-event = icalcomponent_new(ICAL_VEVENT_COMPONENT);
-
-prop = icalproperty_new_dtstamp(atime);
-
-icalcomponent_add_property(event, prop);
-
-prop = icalproperty_new_uid(''guid-1.host1.com'');
-
-icalcomponent_add_property(event,prop);
-
-prop=icalproperty_new_organizer(''mrbig@host.com'');
-
-param = icalparameter_new_role(ICAL_ROLE_CHAIR)
-
-icalproperty_add_parameter(prop, param);
-
-icalcomponent_add_property(event,prop);
-
-Notice that libical uses a semi-object-oriented style of interface.
-Most things you work with are objects, that are instantiated with
-a constructor that has "new" in the name. Also note that, other than
-the object reference, most structure data is passed in to libical
-routines by value. Libical has some complex but very regular memory
-handling rules. These are detailed in section [sec:memory].
-
-If any of the constructors fail, they will return 0. If you try to
-insert 0 into a property or component, or use a zero-valued object
-reference, libical will either silently ignore the error or will abort
-with an error message. This behavior is controlled by a compile time
-flag (ICAL_ERRORS_ARE_FATAL), and will abort by default.
-
-5.1.2 varargs Constructors
-
-There is another way to create complex components, which is arguably
-more elegant, if you are not horrified by varargs. The varargs constructor
-interface allows you to create intricate components in a single block
-of code. Here is the previous examples in the vaargs style.
-
- calendar =
-
- icalcomponent_vanew(
-
- ICAL_VCALENDAR_COMPONENT,
-
- icalproperty_new_version(''2.0''),
-
- icalproperty_new_prodid(
-
- ''-//RDU Software//NONSGML HandCal//EN''),
-
- icalcomponent_vanew(
-
- ICAL_VEVENT_COMPONENT,
-
- icalproperty_new_dtstamp(atime),
-
- icalproperty_new_uid(''guid-1.host1.com''),
-
- icalproperty_vanew_organizer(
-
- ''mrbig@host.com''),
-
- icalparameter_new_role(ICAL_ROLE_CHAIR),
-
- 0
-
- ),
-
- icalproperty_vanew_attendee(
-
- ''employee-A@host.com'',
-
- icalparameter_new_role(
-
- ICAL_ROLE_REQPARTICIPANT),
-
- icalparameter_new_rsvp(1),
-
- icalparameter_new_cutype(ICAL_CUTYPE_GROUP),
-
- 0
-
- ),
-
- icalproperty_new_location(
-
- "1CP Conference Room 4350"),
-
- 0
-
- ),
-
- 0
-
- );
-
-This form is similar to the constructor form, except that the constructors
-have "vanew" instead of "new" in the name. The arguments are similar
-too, except that the component constructor can have a list of properties,
-and the property constructor can have a list of parameters. Be sure
-to terminate every list with a '0', or your code will crash, if you
-are lucky.
-
-5.1.3 Parsing Text Files
-
-The final way to create components will probably be the most common;
-you can create components from RFC5545 compliant text. If you have
-the string in memory, use
-
-icalcomponent* icalparser_parse_string(char* str);
-
-If the string contains only one component, the parser will return the
-component in libical form. If the string contains multiple components,
-the multiple components will be returned as the children of an ICAL_XROOT_COMPONENT
-component.
-
-Parsing a whole string may seem wasteful if you want to pull a large
-component off of the network or from a file; you may prefer to parse
-the component line by line. This is possible too by using:
-
-icalparser* icalparser_new();
-
-void icalparser_free(icalparser* parser);
-
-icalparser_get_line(parser,read_stream);
-
-icalparser_add_line(parser,line);
-
-icalparser_set_gen_data(parser,stream)
-
-These routines will construct a parser object to which you can add
-lines of input and retrieve any components that the parser creates
-from the input. These routines work by specifying an adaptor routine
-to get string data from a source. For an example:
-
-char* read_stream(char *s, size_t size, void *d)
-
-{
-
- char *c = fgets(s,size, (FILE*)d);
-
- return c;
-
-}
-
-main() {
-
- char* line;
-
- icalcomponent *c;
-
- icalparser *parser = icalparser_new();
-
- FILE* stream = fopen(argv[1],"r");
-
- icalparser_set_gen_data(parser,stream);
-
- do {
-
- line = icalparser_get_line(parser,read_stream);
-
- c = icalparser_add_line(parser,line);
-
- if (c != 0){
-
- printf("%s",icalcomponent_as_ical_string(c));
-
- icalparser_claim(parser);
-
- printf("\n---------------\n");
-
- icalcomponent_free(c);
-
- }
-
- } while (line != 0);
-
-}
-
-The parser object parameterizes the routine used to get input lines
-with icalparser_set_gen_data() and icalparser_get_line(). In this
-example, the routine read_stream() will fetch the next line from a
-stream, with the stream passed in as the void* parameter d. The parser
-calls read_stream() from icalparser_get_line(), but it also needs
-to know what stream to use. This is set by the call to icalparser_set_gen_data().
-By using a different routine for read_stream or passing in different
-data with icalparser_set_gen_data, you can connect to any data source.
-
-Using the same mechanism, other implementations could read from memory
-buffers, sockets or other interfaces.
-
-Since the example code is a very common way to use the parser, there
-is a convenience routine;
-
-icalcomponent* icalparser_parse(icalparser *parser,
-
- char* (*line_gen_func)(char *s, size_t size, void* d))
-
-To use this routine, you still must construct the parser object and
-pass in a reference to a line reading routine. If the parser can create
-a single component from the input, it will return a pointer to the
-newly constructed component. If the parser can construct multiple
-components from the input, it will return a reference to an XROOT
-component ( of type ICAL_XROOT_COMPONENT.) This XROOT component will
-hold all of the components constructed from the input as children.
-
-5.2 Accessing Components
-
-Given a reference to a component, you probably will want to access
-the properties, parameters and values inside. Libical interfaces let
-you find sub-component, add and remove sub-components, and do the
-same three operations on properties.
-
-5.2.1 Finding Components
-
-To find a sub-component of a component, use:
-
-icalcomponent* icalcomponent_get_first_component(
-
- icalcomponent* component,
-
- icalcomponent_kind kind);
-
-This routine will return a reference to the first component of the
-type 'kind.' The key kind values, listed in icalenums.h are:
-
-ICAL_ANY_COMPONENT
-
-ICAL_VEVENT_COMPONENT
-
-ICAL_VTODO_COMPONENT
-
-ICAL_VJOURNAL_COMPONENT
-
-ICAL_VCALENDAR_COMPONENT
-
-ICAL_VFREEBUSY_COMPONENT
-
-ICAL_VALARM_COMPONENT
-
-These are only the most common components; there are many more listed
-in icalenums.h.
-
-As you might guess, if there is more than one subcomponent of the type
-you have chosen, this routine will return only the first. to get at
-the others, you need to iterate through the component.
-
-5.2.2 Iterating Through Components
-
-Iteration requires a second routine to get the next subcomponent after
-the first:
-
-icalcomponent* icalcomponent_get_next_component(
-
- icalcomponent* component,
-
- icalcomponent_kind kind);
-
-With the 'first' and 'next' routines, you can create a for loop to
-iterate through all of a components subcomponents
-
- for(c = icalcomponent_get_first_component(comp,ICAL_ANY_COMPONENT);
-
- c != 0;
-
- c = icalcomponent_get_next_component(comp,ICAL_ANY_COMPONENT))
-
-{
-
- do_something(c);
-
-}
-
-This code bit will iterate through all of the subcomponents in 'comp'
-but you can select a specific type of component by changing ICAL_ANY_COMPONENT
-to another component type.
-
-5.2.3 Using Component Iterators
-
-The iteration model in the previous section requires the component
-to keep the state of the iteration. So, you could not use this model
-to perform a sorting operations, since you'd need two iterators and
-there is only space for one. If you ever call icalcomponent_get_first_component()
-when an iteration is in progress, the pointer will be reset to the
-beginning.
-
-To solve this problem, there are also external iterators for components.
-The routines associated with these external iterators are:
-
-icalcompiter icalcomponent_begin_component(icalcomponent* component,
-icalcomponent_kind kind);
-
-icalcompiter icalcomponent_end_component(icalcomponent* component,
-icalcomponent_kind kind);
-
-icalcomponent* icalcompiter_next(icalcompiter* i);
-
-icalcomponent* icalcompiter_prior(icalcompiter* i);
-
-icalcomponent* icalcompiter_deref(icalcompiter* i);
-
-The _begin_() and _end_() routines return a new iterator that points
-to the beginning and ending of the list of subcomponent for the given
-component, and the kind argument works like the kind argument for
-internal iterators.
-
-After creating an iterators, use _next_() and _prior_() to step forward
-and backward through the list and get the component that the iterator
-points to, and use _deref() to return the component that the iterator
-points to without moving the iterator. All routines will return 0
-when they move to point off the end of the list.
-
-Here is an example of a loop using these routines:
-
-for(
-
- i = icalcomponent_begin_component(impl->cluster,ICAL_ANY_COMPONENT);
-
- icalcompiter_deref(&i)!= 0;
-
- icalcompiter_next(&i)
-
-) {
-
- icalcomponent *this = icalcompiter_deref(&i);
-
-}
-
-5.2.4 Removing Components
-
-Removing an element from a list while iterating through the list with
-the internal iterators can cause problems, since you will probably
-be removing the element that the internal iterator points to. The
-_remove() routine will keep the iterator valid by moving it to the
-next component, but in a normal loop, this will result in two advances
-per iteration, and you will remove only every other component. To
-avoid the problem, you will need to step the iterator ahead of the
-element you are going to remove, like this:
-
-for(c = icalcomponent_get_first_component(parent_comp,ICAL_ANY_COMPONENT);
-
- c != 0;
-
- c = next
-
-{
-
- next = icalcomponent_get_next_component(parent_comp,ICAL_ANY_COMPONENT);
-
- icalcomponent_remove_component(parent_comp,c);
-
-}
-
-Another way to remove components is to rely on the side effect of icalcomponent_remove_component:
-if component iterator in the parent component is pointing to the child
-that will be removed, it will move the iterator to the component after
-the child. The following code will exploit this behavior:
-
-icalcomponent_get_first_component(parent_comp,ICAL_VEVENT_COMPONENT);
-
-while((c=icalcomponent_get_current_component(c)) != 0 ){
-
- if(icalcomponent_isa(c) == ICAL_VEVENT_COMPONENT){
-
- icalcomponent_remove_component(parent_comp,inner);
-
- } else {
-
- icalcomponent_get_next_component(parent_comp,ICAL_VEVENT_COMPONENT);
-
- }
-
-}
-
-5.2.5 Working with properties and parameters
-
-Finding, iterating and removing properties works the same as it does
-for components, using the property-specific or parameter-specific
-interfaces:
-
-icalproperty* icalcomponent_get_first_property(
-
- icalcomponent* component,
-
- icalproperty_kind kind);
-
-icalproperty* icalcomponent_get_next_property(
-
- icalcomponent* component,
-
- icalproperty_kind kind);
-
-void icalcomponent_add_property(
-
- icalcomponent* component,
-
- icalproperty* property);
-
-void icalcomponent_remove_property(
-
- icalcomponent* component,
-
- icalproperty* property);
-
-For parameters:
-
-icalparameter* icalproperty_get_first_parameter(
-
- icalproperty* prop,
-
- icalparameter_kind kind);
-
-icalparameter* icalproperty_get_next_parameter(
-
- icalproperty* prop,
-
- icalparameter_kind kind);
-
-void icalproperty_add_parameter(
-
- icalproperty* prop,
-
- icalparameter* parameter);
-
-void icalproperty_remove_parameter_by_kind(
-
- icalproperty* prop,
-
- icalparameter_kind kind);
-
-Note that since there should be only one parameter of each type in
-a property, you will rarely need to use icalparameter_get_next_parameter.
-
-5.2.6 Working with values
-
-Values are typically part of a property, although they can exist on
-their own. You can manipulate them either as part of the property
-or independently.
-
-The most common way to work with values to is to manipulate them from
-they properties that contain them. This involves fewer routine calls
-and intermediate variables than working with them independently, and
-it is type-safe.
-
-For each property, there are a _get_ and a _set_ routine that accesses
-the internal value. For instanace, for the UID property, the routines
-are:
-
-void icalproperty_set_uid(icalproperty* prop, const char* v)
-
-const char* icalproperty_get_uid(icalproperty* prop)
-
-For multi-valued properties, like ATTACH, the value type is usually
-a struct or union that holds both possible types.
-
-If you want to work with the underlying value object, you can get and
-set it with:
-
-icalvalue* icalproperty_get_value (icalproperty* prop)
-
-void icalproperty_set_value(icalproperty* prop, icalvalue* value);
-
-icalproperty_get_value() will return a reference that you can manipulate
-with other icalvalue routines. Most of the time, you will have to
-know what the type of the value is. For instance, if you know that
-the value is a DATETIME type, you can manipulate it with:
-
-struct icaltimetype icalvalue_get_datetime(icalvalue* value);
-
-void icalvalue_set_datetime(icalvalue* value, struct icaltimetype v);
-
-When working with an extension property or value (and X-PROPERTY or
-a property that has the parameter VALUE=x-name ) the value type is
-always a string. To get and set the value, use:
-
-void icalproperty_set_x(icalproperty* prop, char* v);
-
-char* icalproperty_get_x(icalproperty* prop);
-
-All X properties have the type of ICAL_X_PROPERTY, so you will need
-these routines to get and set the name of the property:
-
-char* icalproperty_get_x_name(icalproperty* prop)
-
-void icalproperty_set_x_name(icalproperty* prop, char* name);
-
-5.2.7 Checking Component Validity
-
-RFC 5546 defines rules for what properties must exist in a component
-to be used for transferring scheduling data. Most of these rules relate
-to the existence of properties relative to the METHOD property, which
-declares what operation a remote receiver should use to process a
-component. For instance, if the METHOD is REQUEST and the component
-is a VEVENT, the sender is probably asking the receiver to join in
-a meeting. In this case, RFC5546 says that the component must specify
-a start time (DTSTART) and list the receiver as an attendee (ATTENDEE).
-
-Libical can check these restrictions with the routine:
-
-int icalrestriction_check(icalcomponent* comp);
-
-This routine returns 0 if the component does not pass RFC5546 restrictions,
-or if the component is malformed. The component you pass in must be
-a VCALENDAR, with one or more children, like the examples in RFC5546.
-
-When this routine runs, it will insert new properties into the component
-to indicate any errors it finds. See section 6.5.3, X-LIC-ERROR for
-more information about these error properties.
-
-5.2.8 Converting Components to Text
-
-To create an RFC5545 compliant text representation of an object, use
-one of the *_as_ical_string() routines:
-
-char* icalcomponent_as_ical_string (icalcomponent* component)
-
-char* icalproperty_as_ical_string (icalproperty* property)
-
-char* icalparameter_as_ical_string (icalparameter* parameter)
-
-char* icalvalue_as_ical_string (icalvalue* value)
-
-In most cases, you will only use icalcomponent_as_ical_string (), since
-it will cascade and convert all of the parameters, properties and
-values that are attached to the root component.
-
-Remember that the string returned by these routines is owned by the
-library, and will eventually be re-written. You should copy it if
-you want to preserve it.
-
-5.3 Time
-
-5.3.1 Time structure
-
-Libical defines its own time structure for storing all dates and times.
-It would have been nice to re-use the C library's struct tm, but that
-structure does not differentiate between dates and times, and between
-local time and UTC. The libical structure is:
-
-struct icaltimetype {
-
- int year;
-
- int month;
-
- int day;
-
- int hour;
-
- int minute;
-
- int second;
-
- int is_date; /* 1 -> interpret this as date. */ };
-
-The year, month, day, hour, minute and second fields hold the broken-out
-time values. The is_date field indicates if the time should
-be interpreted only as a date. If it is a date, the hour, minute and
-second fields are assumed to be zero, regardless of their actual values.
-
-5.3.2 Creating time structures
-
-There are several ways to create a new icaltimetype structure:
-
-struct icaltimetype icaltime_from_string(const char* str);
-
-struct icaltimetype icaltime_from_timet_with_zone(time_t v,
- int is_date,
- icaltimezone* zone);
-
-icaltime_from_string takes any RFC5545 compliant time string:
-
-struct icaltimetype tt = icaltime_from_string("19970101T103000");
-
-icaltime_from_timet_with_zone takes a time_t value, representing seconds past
-the POSIX epoch, a flag to indicate if the time is a date, and a time zone.
-Dates have an identical structure to a time, but the time portion (hours,
-minutes and seconds) is always 00:00:00. Dates act differently in
-sorting and comparison, and they have a different string representation
-in RFC5545.
-
-5.3.3 Time manipulating routines
-
-The null time value is used to indicate that the data in the structure
-is not a valid time.
-
-struct icaltimetype icaltime_null_time(void);
-
-int icaltime_is_null_time(struct icaltimetype t);
-
-It is sensible for the broken-out time fields to contain values that
-are not permitted in an ISO compliant time string. For instance, the
-seconds field can hold values greater than 59, and the hours field
-can hold values larger than 24. The excessive values will be rolled
-over into the next larger field when the structure is normalized.
-
-struct icaltimetype icaltime_normalize(struct icaltimetype t);
-
-Normalizing allows you to do arithmetic operations on time values.
-
-struct icaltimetype tt = icaltime_from_string("19970101T103000");
-
-tt.days +=3
-
-tt.second += 70;
-
-tt = icaltime_normalize(tt);
-
-There are several routines to get the day of the week or month, etc,
-from a time structure.
-
-short icaltime_day_of_year(struct icaltimetype t);
-
-struct icaltimetype icaltime_from_day_of_year(short doy, short year);
-
-short icaltime_day_of_week(struct icaltimetype t);
-
-short icaltime_start_doy_week(struct icaltimetype t, int fdow);
-
-short icaltime_week_number(short day_of_month, short month, short year);
-
-short icaltime_days_in_month(short month,short year);
-
-Two routines convert time structures to and from the number of seconds
-since the POSIX epoch. The is_date field indicates whether or not
-the hour, minute and second fields should be used in the conversion.
-
-struct icaltimetype icaltime_from_timet_with_zone(time_t v,
- int is_date,
- icaltimezone* zone);
-
-time_t icaltime_as_timet(struct icaltimetype);
-
-The compare routine works exactly like strcmp, but on time structures.
-
-int icaltime_compare(struct icaltimetype a,struct icaltimetype b);
-
-The following routines convert between UTC and a named timezone. The
-tzid field must be a timezone name from the Olsen database, such as
-"America/Los_Angeles."
-
-The utc_offset routine returns the offset of the named time zone from
-UTC, in seconds.
-
-The tt parameter in the following routines indicates the date on which
-the conversion should be made. The tt parameter is necessary because
-timezones have many different rules for when daylight savings time
-is used, and these rules can change over time. So, for a single timezone
-one year may have daylight savings time on March 15, but for other
-years March 15 may be standard time, and some years may have standard
-time all year.
-
-int icaltime_utc_offset(struct icaltimetype tt, char* tzid);
-
-int icaltime_local_utc_offset();
-
-struct icaltimetype icaltime_as_utc(struct icaltimetype tt,char* tzid);
-
-struct icaltimetype icaltime_as_zone(struct icaltimetype tt,char* tzid);
-
-struct icaltimetype icaltime_as_local(struct icaltimetype tt);
-
-5.4 Storing Objects
-
-The libical distribution includes a separate library, libicalss, that
-allows you to store iCal component data to disk in a variety of ways.
-
-The file storage routines are organized in an inheritance hierarchy
-that is rooted in icalset, with the derived class icalfileset and
-icaldirset. Icalfileset stores components to a file, while icaldirset
-stores components to multiple files, one per month based on DTSTAMP.
-Other storages classes, for storage to a heap or a mysql database
-for example, could be added in the future.
-
-All of the icalset derived classes have the same interface:
-
-icaldirset* icaldirset_new(const char* path);
-
-void icaldirset_free(icaldirset* store);
-
-const char* icaldirset_path(icaldirset* store);
-
-void icaldirset_mark(icaldirset* store);
-
-icalerrorenum icaldirset_commit(icaldirset* store);
-
-icalerrorenum icaldirset_add_component(icaldirset* store, icalcomponent*
-comp);
-
-icalerrorenum icaldirset_remove_component(icaldirset* store, icalcomponent*
-comp);
-
-int icaldirset_count_components(icaldirset* store, icalcomponent_kind
-kind);
-
-icalerrorenum icaldirset_select(icaldirset* store, icalcomponent* gauge);
-
-void icaldirset_clear(icaldirset* store);
-
-icalcomponent* icaldirset_fetch(icaldirset* store, const char* uid);
-
-int icaldirset_has_uid(icaldirset* store, const char* uid);
-
-icalcomponent* icaldirset_fetch_match(icaldirset* set, icalcomponent
-*c);
-
-icalerrorenum icaldirset_modify(icaldirset* store, icalcomponent *oldc,
-icalcomponent *newc);
-
-icalcomponent* icaldirset_get_current_component(icaldirset* store);
-
-icalcomponent* icaldirset_get_first_component(icaldirset* store);
-
-icalcomponent* icaldirset_get_next_component(icaldirset* store);
-
-5.4.1 Creating a new set
-
-You can create a new set from either the base class or the direved
-class. From the base class use one of:
-
-icalset* icalset_new_file(const char* path);
-
-icalset* icalset_new_dir(const char* path);
-
-icalset* icalset_new_heap(void);
-
-icalset* icalset_new_mysql(const char* path);
-
-You can also create a new set based on the derived class, For instance,
-with icalfileset:
-
-icalfileset* icalfileset_new(const char* path);
-
-icalfileset* icalfileset_new_open(const char* path, int flags, int mode);
-
-icalset_new_file is identical to icalfileset_new. Both routines will
-open an existing file for readinga and writing, or create a new file
-if it does not exist. Icalfileset_new_open takes the same arguments
-as the open() system routine and behaves in the same way.
-
-The icalset and icalfileset objects are somewhat interchangeable -- you
-can use an icalfileset* as an argument to any of the icalset routines.
-
-The following examples will all use icalfileset routines; using the
-other icalset derived classes will be similar.
-
-5.4.2 Adding, Finding and Removing Components
-
-To add components to a set, use:
-
-icalerrorenum icalfileset_add_component(icalfileset* cluster, icalcomponent*
-child);
-
-The fileset keeps an in-memory copy of the components, and this set
-must be written back to the file occasionally. There are two routines
-to manage this:
-
-void icalfileset_mark(icalfileset* cluster);
-
-icalerrorenum icalfileset_commit(icalfileset* cluster);
-
-icalfileset_mark indicates that the in-memory components have changed.
-Calling the _add_component routine will call _mark automatically,
-but you may need to call it yourself if you have made a change to
-an existing component. The _commit routine writes the data base to
-disk, but only if it is marked. The _commit routine is called automatically
-when the icalfileset is freed.
-
-To iterate through the components in a set, use:
-
-icalcomponent* icalfileset_get_first_component(icalfileset* cluster);
-
-icalcomponent* icalfileset_get_next_component(icalfileset* cluster);
-
-icalcomponent* icalfileset_get_current_component (icalfileset* cluster);
-
-These routines work like the corresponding routines from icalcomponent,
-except that their output is filtered through a gauge. A gauge is a
-test for the properties within a components; only components that
-pass the test are returned. A gauge can be constructed from a MINSQL
-string with:
-
-icalgauge* icalgauge_new_from_sql(const char* sql);
-
-Then, you can add the gauge to the set with :
-
-icalerrorenum icalfileset_select(icalfileset* store, icalgauge* gauge);
-
-Here is an example that puts all of these routines together:
-
-void test_fileset()
-
-{
-
- icalfileset *fs;
-
- icalcomponent *c;
-
- int i;
-
- char *path = "test_fileset.ics";
-
- icalgauge *g = icalgauge_new_from_sql(
-
- "SELECT * FROM VEVENT WHERE DTSTART > '20000103T120000Z' AND
-DTSTART <= '20000106T120000Z'");
-
-
-
- fs = icalfileset_new(path);
-
-
-
- for (i = 0; i!= 10; i++){
-
- c = make_component(i); /* Make a new component where DTSTART
-has month of i */
-
- icalfileset_add_component(fs,c);
-
- }
-
- icalfileset_commit(fs); /* Write to disk */
-
- icalfileset_select(fs,g); /* Set the gauge to filter components
-*/
-
-
-
- for (c = icalfileset_get_first_component(fs);
-
- c != 0;
-
- c = icalfileset_get_next_component(fs)){
-
- struct icaltimetype t = icalcomponent_get_dtstart(c);
-
-
-
- printf("%s\n",icaltime_as_ctime(t));
-
- }
-
- icalfileset_free(fs);
-
-}
-
-5.4.3 Other routines
-
-There are several other routines in the icalset interface, but they
-not fully implemented yet.
-
-5.5 Memory Management
-
-Libical relies heavily on dynamic allocation for both the core objects
-and for the strings used to hold values. Some of this memory the library
-caller owns and must free, and some of the memory is managed by the
-library. Here is a summary of the memory rules.
-
-1) If the function name has "new" in it (such as icalcomponent_new(),
- or icalproperty_new_from_string()), the caller gets control of the
- memory. The caller also gets control over an object that is cloned via
- a function that ends with "_clone" (like icalcomponent_clone())
-
-2) If you got the memory from a routine with "clone" or "new" in it, you
- must call the corresponding *_free() routine to free the memory, for
- example use icalcomponent_free() to free objects created with
- icalcomponent_new() or icalcomponent_clone().
-
-3) If the function name has "add" in it, the caller is transferring
- control of the memory to the routine. ( icalproperty_add_parameter() )
-
-4) If the function name has "remove" in it, the caller passes in
- a pointer to an object and after the call returns, the caller owns
- the object. So, before you call icalcomponent_remove_property(comp,foo),
- you do not own "foo" and after the call returns, you do.
-
-5) If the routine returns a string and its name does NOT end in "_r",
- libical owns the memory and will put it on a ring buffer to reclaim
- later. For example, icalcomponent_as_ical_string(). You'd better
- strdup() it if you want to keep it, and you don't have to delete it.
-
-6) If the routine returns a string and its name *does* end in "_r", the
- caller gets control of the memory and is responsible for freeing it.
- For example, icalcomponent_as_ical_string_r() does the same thing as
- icalcomponent_as_ical_string(), except you now have control of the
- string buffer it returns.
-
-5.6 Error Handling
-
-Libical has several error handling mechanisms for the various types
-of programming, semantic and syntactic errors you may encounter.
-
-5.6.1 Return values
-
-Many library routines signal errors through their return values. All
-routines that return a pointer, such as icalcomponent_new(), will
-return 0 ( zero ) on a fatal error. Some routines will return a value
-of enum icalerrorenum.
-
-5.6.2 icalerrno
-
-Most routines will set the global error value icalerrno on errors.
-This variable is an enumeration; permissible values can be found in
-libical/icalerror.h. If the routine returns an enum icalerrorenum,
-then the return value will be the same as icalerrno. You can use icalerror_strerror()
-to get a string that describes the error. The enumerations are:
-
-* ICAL_BADARG_ERROR -- One of the argument to a routine was bad. Typically
- for a null pointer.
-
-* ICAL_NEWFAILED_ERROR -- A new() or malloc() failed
-
-* ICAL_MALFORMEDDATA_ERROR -- An input string was not in the correct
- format
-
-* ICAL_PARSE_ERROR -- The parser failed to parse an incoming component
-
-* ICAL_INTERNAL_ERROR -- Largely equivalent to an assert
-
-* ICAL_FILE_ERROR -- A file operation failed. Check errno for more
- detail.
-
-* ICAL_ALLOCATION_ERROR -- ?
-
-* ICAL_USAGE_ERROR -- ?
-
-* ICAL_NO_ERROR -- No error
-
-* ICAL_MULTIPLEINCLUSION_ERROR -- ?
-
-* ICAL_TIMEDOUT_ERROR -- For CSTP and acquiring locks
-
-* ICAL_UNKNOWN_ERROR -- ?
-
-5.6.3 X-LIC-ERROR and X-LIC-INVALID-COMPONENT
-
-The library handles semantic and syntactic errors in components by
-inserting errors properties into the components. If the parser cannot
-parse incoming text ( a syntactic error ) or if the icalrestriction_check()
-routine indicates that the component does not meet the requirements
-of RFC5546 ( a semantic error) the library will insert properties
-of the type X-LIC-ERROR to describe the error. Here is an example
-of the error property:
-
-X-LIC-ERROR;X-LIC-ERRORTYPE=INVALID_ITIP :Failed iTIP restrictions
-for property DTSTART.
-
-Expected 1 instances of the property and got 0
-
-This error resulted from a call to icalrestriction_check(), which discovered
-that the component does not have a DTSTART property, as required by
-RFC5545.
-
-There are a few routines to manipulate error properties:
-
-[ The following data is supposed to be in a table. It looks OK in LyX,
-but does not format properly in output. ]
-
-+-------------------------------------+---------------------------------------------------------+
-| Routine | Purpose |
-+-------------------------------------+---------------------------------------------------------+
-| void icalrestriction_check() | Check a component against RFC5546 and insert |
-+-------------------------------------+---------------------------------------------------------+
-| | error properties to indicate non compliance |
-+-------------------------------------+---------------------------------------------------------+
-| int icalcomponent_count_errors() | Return the number of error properties |
-+-------------------------------------+---------------------------------------------------------+
-| | in a component |
-+-------------------------------------+---------------------------------------------------------+
-| void icalcomponent_strip_errors() | Remove all error properties in as |
-+-------------------------------------+---------------------------------------------------------+
-| | component |
-+-------------------------------------+---------------------------------------------------------+
-| void icalcomponent_convert_errors() | Convert some error properties into |
-+-------------------------------------+---------------------------------------------------------+
-| | REQUESTS-STATUS proprties to indicate the inability to |
-+-------------------------------------+---------------------------------------------------------+
-| | process the component as an iTIP request. |
-+-------------------------------------+---------------------------------------------------------+
-
-
-The types of errors are listed in icalerror.h. They are:
-
-ICAL_XLICERRORTYPE_COMPONENTPARSEERROR
-
-ICAL_XLICERRORTYPE_PARAMETERVALUEPARSEERROR
-
-ICAL_XLICERRORTYPE_PARAMETERNAMEPARSEERROR
-
-ICAL_XLICERRORTYPE_PROPERTYPARSEERROR
-
-ICAL_XLICERRORTYPE_VALUEPARSEERROR
-
-ICAL_XLICERRORTYPE_UNKVCALPROP
-
-ICAL_XLICERRORTYPE_INVALIDITIP
-
-The libical parser will generate the error that end in PARSEERROR when
-it encounters garbage in the input steam. ICAL_XLICERRORTYPE_INVALIDITIP
-is inserted by icalrestriction_check(), and ICAL_XLICERRORTYPE_UNKVCALPROP
-is generated by icalvcal_convert() when it encounters a vCal property
-that it cannot convert or does not know about.
-
-Icalcomponent_convert_errors() converts some of the error properties
-in a component into REQUEST-STATUS properties that indicate a failure.
-As of libical version0.18, this routine only convert *PARSEERROR errors
-and it always generates a 3.x ( failure ) code. This makes it more
-of a good idea than a really useful bit of code.
-
-5.6.4 ICAL_ERRORS_ARE_FATAL and icalerror_errors_are_fatal
-
-If icalerror_get_errors_are_fatal() returns 1, then any error
-condition will cause the program to abort. The abort occurs
-in icalerror_set_errno(), and is done with an assert(0) if NDEBUG
-is undefined, and with icalerror_crash_here if NDEBUG is defined.
-Initially, icalerror_get_errors_are_fatal() is 1 when ICAL_ERRORS_ARE_FATAL
-is defined, and 0 otherwise. Since ICAL_ERRORS_ARE_FATAL is defined
-by default, icalerror_get_errors_are_fatal() is also set to 1 by default.
-
-You can change the compiled-in ICAL_ERRORS_ARE_FATAL behavior at runtime
-by calling icalerror_set_errors_are_fatal(0) (i.e, errors are not fatal)
-or icalerror_set_errors_are_fatal(1) (i.e, errors are fatal).
-
-
-5.7 Naming Standard
-
-Structures that you access with the "struct" keyword, such as "struct
-icaltimetype" are things that you are allowed to see inside and poke
-at.
-
-Structures that you access though a typedef, such as "icalcomponent"
-are things where all of the data is hidden.
-
-Component names that start with "V" are part of RFC 5545 or another
-iCal standard. Component names that start with "X" are also part of
-the spec, but they are not actually components in the spec. However,
-they look and act like components, so they are components in libical.
-Names that start with "XLIC" or "X-LIC" are not part of any iCal spec.
-They are used internally by libical.
-
-Enums that identify a component, property, value or parameter end with
-"_COMPONENT," "_PROPERTY," "_VALUE," or "_PARAMETER"
-
-Enums that identify a parameter value have the name of the parameter
-as the second word. For instance: ICAL_ROLE_REQPARTICIPANT or ICAL_PARTSTAT_ACCEPTED.
-
-The enums for the parts of a recurarance rule and request statuses
-are irregular.
-
-6 Hacks and Bugs
-
-There are a lot of hacks in the library -- bits of code that I am not
-proud of and should probably be changed. These are marked with the
-comment string "HACK."
-
-7 Library Reference
-
-7.1 Manipulating struct icaltimetype
-
-7.1.1 Struct icaltimetype
-
-struct icaltimetype
-
-{
-
- int year;
-
- int month;
-
- int day;
-
- int hour;
-
- int minute;
-
- int second;
-
- int is_date;
-
- const char* zone;
-
-};
diff --git a/doc/reference/CMakeLists.txt b/doc/reference/CMakeLists.txt
index 50a1997e..630ddf9b 100644
--- a/doc/reference/CMakeLists.txt
+++ b/doc/reference/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
if(ICAL_GLIB)
add_subdirectory(libical-glib)
endif()
diff --git a/doc/reference/libical-glib/CMakeLists.txt b/doc/reference/libical-glib/CMakeLists.txt
index ca58244c..df4be031 100644
--- a/doc/reference/libical-glib/CMakeLists.txt
+++ b/doc/reference/libical-glib/CMakeLists.txt
@@ -1,4 +1,20 @@
-include(GtkDoc)
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
+option(ENABLE_GTK_DOC "Use gtk-doc to build documentation" True)
+
+if(NOT ENABLE_GTK_DOC)
+ return()
+endif()
+
+if(STATIC_ONLY)
+ message(FATAL_ERROR
+ "You are attempting to build the Gtk docs, "
+ "however that option is not supported when building static libraries only. "
+ "Please disable the static only option (-DSTATIC_ONLY=False) "
+ "if you really want to build the Gtk docs. Alternatively, you can "
+ "disable building Gtk docs (by passing -DENABLE_GTK_DOC=False to cmake).")
+endif()
# To regenerate libical-glib-docs.xml.in from current sources use these steps:
# a) delete ${CMAKE_CURRENT_BINARY_DIR}/libical-glib-docs.xml
@@ -15,6 +31,7 @@ include(GtkDoc)
# like the replacement of the "[Insert title here]" and the <bookinfo/> content
if(ENABLE_GTK_DOC)
+ include(GtkDoc)
set(SOURCEDIRS
${CMAKE_BINARY_DIR}/src/libical-glib
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 0c241f4d..c5a8441c 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/src
@@ -28,7 +31,9 @@ else()
icalss-static
icalvcal-static
)
- target_link_libraries(doesnothing ${CMAKE_THREAD_LIBS_INIT})
+ if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(doesnothing ${CMAKE_THREAD_LIBS_INIT})
+ endif()
if(ICU_FOUND)
target_link_libraries(doesnothing ${ICU_LIBRARIES})
endif()
diff --git a/examples/access_components.c b/examples/access_components.c
index c0e3985f..88731fd6 100644
--- a/examples/access_components.c
+++ b/examples/access_components.c
@@ -1,4 +1,8 @@
-/* Access_component.c */
+/* Access_component.c
+
+ SPDX-FileCopyrightText: <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
#include <libical/ical.h>
@@ -20,13 +24,10 @@ void do_something(icalcomponent *c);
constructors, resulting in a compact, neatly formatted way to create
components. This style is shown in create_new_component_with_va_args()
-
-
*/
icalcomponent* create_new_component()
{
-
/* variable definitions */
icalcomponent* calendar;
icalcomponent* event;
@@ -57,7 +58,6 @@ icalcomponent* create_new_component()
icalproperty_new_version("2.0")
);
-
/* Here is the short version of the memory rules:
If the routine name has "new" in it:
@@ -132,7 +132,6 @@ icalcomponent* create_new_component()
icalcomponent_add_property(event,property);
-
/* more properties */
icalcomponent_add_property(
@@ -169,7 +168,6 @@ icalcomponent* create_new_component()
icalcomponent_add_property(event,property);
-
property = icalproperty_new_dtend(atime);
icalproperty_add_parameter(
@@ -189,13 +187,11 @@ icalcomponent* create_new_component()
return calendar;
}
-
/* Now, create the same component as in the previous routine, but use
the constructor style. */
icalcomponent* create_new_component_with_va_args()
{
-
/* This is a similar set up to the last routine */
icalcomponent* calendar;
struct icaltimetype atime = icaltime_from_timet_with_zone(time(0), 0, icaltimezone_get_utc_timezone());
@@ -254,7 +250,6 @@ icalcomponent* create_new_component_with_va_args()
0
);
-
/* Note that properties with no parameters can use the regular
'new' constructor, while those with parameters use the 'vanew'
constructor. And, be sure that the last argument in the 'vanew'
@@ -263,7 +258,6 @@ icalcomponent* create_new_component_with_va_args()
return calendar;
}
-
void find_sub_components(icalcomponent* comp)
{
icalcomponent *c;
@@ -286,7 +280,6 @@ void find_sub_components(icalcomponent* comp)
do_something(c);
}
-
}
/* Ical components only have one internal iterator, so removing the
@@ -307,5 +300,4 @@ void remove_vevent_sub_components(icalcomponent* comp){
do_something(c);
}
-
}
diff --git a/examples/access_properties_and_parameters.c b/examples/access_properties_and_parameters.c
index e4c13f40..cbaf3cd8 100644
--- a/examples/access_properties_and_parameters.c
+++ b/examples/access_properties_and_parameters.c
@@ -1,4 +1,8 @@
-/* access_properties_and_parameters.c */
+/* access_properties_and_parameters.c
+
+ SPDX-FileCopyrightText: <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
#include <libical/ical.h>
#include <stdlib.h>
@@ -47,7 +51,6 @@ void get_required_attendees(icalcomponent* event)
printf("%s",attendee);
}
}
-
}
/* Here is a similar example. If an attendee has a PARTSTAT of
@@ -93,7 +96,6 @@ void update_attendees(icalcomponent* event)
icalparameter_new_partstat(ICAL_PARTSTAT_TENTATIVE)
);
}
-
}
}
@@ -146,5 +148,4 @@ void test_properties()
/* Frees the original and the clone */
icalproperty_free(clone);
icalproperty_free(prop);
-
}
diff --git a/examples/changenames.pl b/examples/changenames.pl
deleted file mode 100644
index 4adf84b9..00000000
--- a/examples/changenames.pl
+++ /dev/null
@@ -1,4 +0,0 @@
-s/icalcluster/icalfileset/g;
-s/ICALCLUSTER/ICALFILESET/g;
-s/icalstore/icaldirset/g;
-s/ICALSTORE/ICALDIRSET/g;
diff --git a/examples/errors.c b/examples/errors.c
index f50c4c9d..315d3702 100644
--- a/examples/errors.c
+++ b/examples/errors.c
@@ -1,4 +1,8 @@
-/* errors.c */
+/* errors.c
+
+ SPDX-FileCopyrightText: <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
#include <libical/ical.h>
@@ -15,9 +19,7 @@ void program_errors()
fprintf(stderr,"Horrible libical error: %s\n",
icalerror_strerror(icalerrno));
-
}
-
}
void component_errors(icalcomponent *comp)
@@ -39,17 +41,13 @@ void component_errors(icalcomponent *comp)
p != 0;
p = icalcomponent_get_next_property(comp,ICAL_XLICERROR_PROPERTY))
{
-
printf("-- The error is %s:\n",icalproperty_get_xlicerror(p));
}
-
-
/* Check the component for iTIP compilance, and add more
X-LIC-ERROR properties if it is non-compilant. */
icalrestriction_check(comp);
-
/* Count the new errors. */
if(errors != icalcomponent_count_errors(comp)){
printf(" -- The component also has iTIP restriction errors \n");
@@ -61,7 +59,5 @@ void component_errors(icalcomponent *comp)
properties in the reply. This following routine makes this
conversion */
-
icalcomponent_convert_errors(comp);
-
}
diff --git a/examples/main.c b/examples/main.c
index 587dbd21..f2165dcf 100644
--- a/examples/main.c
+++ b/examples/main.c
@@ -1,4 +1,9 @@
-/* This is just to make the code in the example directory link properly. */
+/* This is just to make the code in the example directory link properly.
+
+ SPDX-FileCopyrightText: <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
#include <libical/ical.h>
int main()
@@ -6,7 +11,6 @@ int main()
return 1;
}
-
void do_something(icalcomponent* comp)
{
(void)comp;/*unused*/
diff --git a/examples/parse_text.c b/examples/parse_text.c
index 67a2345f..d97ef4c6 100644
--- a/examples/parse_text.c
+++ b/examples/parse_text.c
@@ -1,6 +1,9 @@
/* parse_text.c
- */
+ SPDX-FileCopyrightText: <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
#include <libical/ical.h>
#include <stdlib.h>
@@ -43,7 +46,6 @@ void parse_text(char* argv[])
completes a component, c will be non-zero */
c = icalparser_add_line(parser,line);
-
if (c != 0){
char *temp = icalcomponent_as_ical_string_r(c);
printf("%s", temp);
@@ -56,6 +58,5 @@ void parse_text(char* argv[])
} while ( line != 0);
-
icalparser_free(parser);
}
diff --git a/libical.pc.in b/libical.pc.in
index c07eb52a..8366cb2f 100644
--- a/libical.pc.in
+++ b/libical.pc.in
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright Contributors to the libical project
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt
index 0b7b3433..b650e8dc 100644
--- a/scripts/CMakeLists.txt
+++ b/scripts/CMakeLists.txt
@@ -1,3 +1,4 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
########### install files ###############
-
diff --git a/scripts/buildtests.sh b/scripts/buildtests.sh
index e61cfb9d..73a358bf 100755
--- a/scripts/buildtests.sh
+++ b/scripts/buildtests.sh
@@ -1,4 +1,7 @@
-#!/bin/sh
+#!/bin/bash
+
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#Exit if any undefined variable is used.
set -u
@@ -40,6 +43,7 @@ HELP() {
echo " -a, --no-asan-build Don't run any ASAN-build (sanitize-address) tests"
echo " -d, --no-tsan-build Don't run any TSAN-build (sanitize-threads) tests"
echo " -u, --no-ubsan-build Don't run any UBSAN-build (sanitize-undefined) tests"
+ echo " -x, --no-memc-build Don't run any MEMCONSIST-build (memory consistency) tests"
echo
}
@@ -228,8 +232,24 @@ CLANG_BUILD() {
echo "===== END CLANG BUILD: $1 ======"
}
+#function MEMCONSIST_BUILD:
+# runs a gcc memory consistency build test
+# $1 = the name of the test (which will have "-mem" appended to it)
+# $2 = CMake options
+MEMCONSIST_BUILD() {
+ name="$1-mem"
+ if ( test $runmemcbuild -ne 1 )
+ then
+ echo "===== MEMCONSIST BUILD TEST $1 DISABLED DUE TO COMMAND LINE OPTION ====="
+ return
+ fi
+ echo "===== START MEMCONSIST BUILD: $1 ======"
+ BUILD "$name" "-DLIBICAL_DEVMODE_MEMORY_CONSISTENCY=True $2"
+ echo "===== END MEMCONSIST BUILD: $1 ======"
+}
+
#function ASAN_BUILD:
-# runs an clang ASAN build test
+# runs a clang ASAN build test
# $1 = the name of the test (which will have "-asan" appended to it)
# $2 = CMake options
ASAN_BUILD() {
@@ -241,12 +261,12 @@ ASAN_BUILD() {
fi
echo "===== START ASAN BUILD: $1 ======"
SET_CLANG
- BUILD "$name" "-DADDRESS_SANITIZER=True $2"
+ BUILD "$name" "-DLIBICAL_DEVMODE_ADDRESS_SANITIZER=True $2"
echo "===== END ASAN BUILD: $1 ======"
}
#function TSAN_BUILD:
-# runs an clang TSAN build test
+# runs a clang TSAN build test
# $1 = the name of the test (which will have "-tsan" appended to it)
# $2 = CMake options
TSAN_BUILD() {
@@ -258,12 +278,12 @@ TSAN_BUILD() {
fi
echo "===== START TSAN BUILD: $1 ======"
SET_CLANG
- BUILD "$name" "-DTHREAD_SANITIZER=True $2"
+ BUILD "$name" "-DLIBICAL_DEVMODE_THREAD_SANITIZER=True $2"
echo "===== END TSAN BUILD: $1 ======"
}
#function UBSAN_BUILD:
-# runs an clang UBSAN build test
+# runs a clang UBSAN build test
# $1 = the name of the test (which will have "-ubsan" appended to it)
# $2 = CMake options
UBSAN_BUILD() {
@@ -275,9 +295,10 @@ UBSAN_BUILD() {
fi
echo "===== START UBSAN BUILD: $1 ======"
SET_CLANG
- BUILD "$name" "-DUNDEFINED_SANITIZER=True $2"
+ BUILD "$name" "-DLIBICAL_DEVMODE_UNDEFINED_SANITIZER=True $2"
echo "===== END UBSAN BUILD: $1 ======"
}
+
#function CPPCHECK
# runs a cppcheck test, which means: configure, compile, link and run cppcheck
# $1 = the name of the test (which will have "-cppcheck" appended to it)
@@ -310,8 +331,12 @@ CPPCHECK() {
-D size_t="unsigned long" \
-D bswap32="" \
-D PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP=0 \
+ -D MIN="" \
-D _unused="(void)" \
-D _deprecated="(void)" \
+ -D ICALMEMORY_DEFAULT_FREE="free" \
+ -D ICALMEMORY_DEFAULT_MALLOC="malloc" \
+ -D ICALMEMORY_DEFAULT_REALLOC="realloc" \
-D F_OK=0 \
-D R_OK=0 \
-U YYSTYPE \
@@ -366,6 +391,8 @@ SPLINT() {
files="$files $BDIR/src/libical/*.c $BDIR/src/libical/*.h"
splint $files \
+ -badflag \
+ -preproc \
-weak -warnposix \
-modobserver -initallelements -redef \
-linelen 1000 \
@@ -489,8 +516,8 @@ KRAZY() {
##### END FUNCTIONS #####
-#TEMP=`getopt -o hmkctbsnlgadu --long help,no-cmake-compat,no-krazy,no-cppcheck,no-tidy,no-scan,no-splint,no-ninja,no-clang-build,no-gcc-build,no-asan-build,no-tsan-build,no-ubsan-build -- "$@"`
-TEMP=`getopt hmkctbsnlgadu $*`
+#TEMP=`getopt -o hmkctbsnlgadu --long help,no-cmake-compat,no-krazy,no-cppcheck,no-tidy,no-scan,no-splint,no-ninja,no-clang-build,no-gcc-build,no-asan-build,no-tsan-build,no-ubsan-build,no-memc-build -- "$@"`
+TEMP=`getopt hmkctbsnlgadux $*`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
@@ -506,6 +533,7 @@ rungccbuild=1
runasanbuild=1
runtsanbuild=1
runubsanbuild=1
+runmemcbuild=1
runsplint=1
while true; do
case "$1" in
@@ -522,6 +550,7 @@ while true; do
-a|--no-asan-build) runasanbuild=0; shift;;
-d|--no-tsan-build) runtsanbuild=0; shift;;
-u|--no-ubsan-build) runubsanbuild=0; shift;;
+ -x|--no-memc-build) runmemcbuild=0; shift;;
--) shift; break;;
*) echo "Internal error!"; exit 1;;
esac
@@ -588,7 +617,10 @@ CLANGTIDY test2builtin "$TZCMAKEOPTS"
GCC_BUILD testgcc1 ""
GCC_BUILD testgcc2 "$CMAKEOPTS"
GCC_BUILD testgcc3 "$UUCCMAKEOPTS"
-GCC_BUILD testgcc4lto "$LTOCMAKEOPTS"
+if (test "`uname -s`" = "Linux")
+then
+ GCC_BUILD testgcc4lto "$LTOCMAKEOPTS"
+fi
GCC_BUILD testgcc4glib "$GLIBOPTS"
GCC_BUILD testgccnocxx "$CMAKEOPTS -DWITH_CXX_BINDINGS=off"
if (test "`uname -s`" = "Linux")
@@ -602,14 +634,19 @@ GCC_BUILD testgcc2builtin "$TZCMAKEOPTS"
#Ninja build tests
NINJA_GCC_BUILD testninjagcc1 ""
-NINJA_GCC_BUILD testninjagcc2 "-DSHARED_ONLY=True"
-NINJA_GCC_BUILD testninjagcc3 "-DSTATIC_ONLY=True -DICAL_GLIB=False"
+NINJA_GCC_BUILD testninjagcc2 "-DICAL_GLIB=True"
+NINJA_GCC_BUILD testninjagcc3 "-DICAL_GLIB=True -DICAL_GLIB_VAPI=ON -DGOBJECT_INTROSPECTION=True"
+NINJA_GCC_BUILD testninjagcc4 "-DSHARED_ONLY=True -DICAL_GLIB=False"
+NINJA_GCC_BUILD testninjagcc5 "-DSHARED_ONLY=True -DICAL_GLIB=True"
+NINJA_GCC_BUILD testninjagcc6 "-DSTATIC_ONLY=True -DICAL_GLIB=False"
+NINJA_GCC_BUILD testninjagcc7 "-DSTATIC_ONLY=True -DICAL_GLIB=True -DENABLE_GTK_DOC=False"
+NINJA_GCC_BUILD testninjagcc9 "-DSHARED_ONLY=True -DICAL_GLIB=True -DGOBJECT_INTROSPECTION=True -DICAL_GLIB_VAPI=ON"
CLANG_BUILD testclang1 ""
CLANG_BUILD testclang2 "$CMAKEOPTS"
CLANG_BUILD testclang3 "$UUCCMAKEOPTS"
-#broken with clang7 on Fedora29 CLANG_BUILD testclang4lto "$LTOCMAKEOPTS"
-#broken with clang7 on Fedora29 CLANG_BUILD testclang4glib "$GLIBOPTS"
+#not supported with clang yet CLANG_BUILD testclang4lto "$LTOCMAKEOPTS"
+CLANG_BUILD testclang4glib "$GLIBOPTS"
if (test "`uname -s`" = "Linux")
then
echo "Temporarily disable cross-compile tests"
@@ -617,6 +654,14 @@ then
# CLANG_BUILD testclang2cross "-DCMAKE_TOOLCHAIN_FILE=$TOP/cmake/Toolchain-Linux-GCC-i686.cmake $CMAKEOPTS"
fi
+#Memory consistency check
+MEMCONSIST_BUILD test1memc ""
+MEMCONSIST_BUILD test2memc "$CMAKEOPTS"
+MEMCONSIST_BUILD test3memc "$TZCMAKEOPTS"
+MEMCONSIST_BUILD test4memc "$UUCCMAKEOPTS"
+#FIXME: the python test scripts needs for introspection need some love
+#MEMCONSIST_BUILD test5memc "$GLIBOPTS"
+
#Address sanitizer
ASAN_BUILD test1asan ""
ASAN_BUILD test2asan "$CMAKEOPTS"
diff --git a/scripts/mkderivedcomponents.pl b/scripts/mkderivedcomponents.pl
index fcd98f24..2d51f4d4 100755..100644
--- a/scripts/mkderivedcomponents.pl
+++ b/scripts/mkderivedcomponents.pl
@@ -1,17 +1,8 @@
#!/usr/bin/env perl
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
-#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
-#
-# Or:
-#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
################################################################################
use Getopt::Std;
@@ -69,19 +60,9 @@ if ($opt_c or $opt_h and !$opt_i) {
\044Id:\044
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
-
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- https://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
-
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
/*
diff --git a/scripts/mkderivedparameters.pl b/scripts/mkderivedparameters.pl
index 05aea1c2..26091ca5 100755..100644
--- a/scripts/mkderivedparameters.pl
+++ b/scripts/mkderivedparameters.pl
@@ -1,17 +1,11 @@
#!/usr/bin/env perl
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
################################################################################
require "readvaluesfile.pl";
diff --git a/scripts/mkderivedproperties.pl b/scripts/mkderivedproperties.pl
index b772e1b6..7e1d9065 100755..100644
--- a/scripts/mkderivedproperties.pl
+++ b/scripts/mkderivedproperties.pl
@@ -1,17 +1,11 @@
#!/usr/bin/env perl
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
################################################################################
require "readvaluesfile.pl";
diff --git a/scripts/mkderivedvalues.pl b/scripts/mkderivedvalues.pl
index a5b5a194..c2125df7 100755..100644
--- a/scripts/mkderivedvalues.pl
+++ b/scripts/mkderivedvalues.pl
@@ -1,17 +1,11 @@
#!/usr/bin/perl
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
################################################################################
use lib '.';
@@ -226,7 +220,7 @@ $pointer_check_rv\
if ($union_data eq 'string') {
print
-" if (impl->data.v_${union_data} != 0) {\n free((void *)impl->data.v_${union_data});\n }\n";
+" if (impl->data.v_${union_data} != 0) {\n icalmemory_free_buffer((void *)impl->data.v_${union_data});\n }\n";
}
print "\
diff --git a/scripts/mkrestrictiontable.pl b/scripts/mkrestrictiontable.pl
index 21bc499a..541bb4b0 100755..100644
--- a/scripts/mkrestrictiontable.pl
+++ b/scripts/mkrestrictiontable.pl
@@ -1,17 +1,11 @@
#!/usr/bin/env perl
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
################################################################################
use Getopt::Std;
@@ -47,8 +41,9 @@ if ($opt_i) {
sub insert_code
{
- # First build the property restriction table
- print "static const icalrestriction_property_record icalrestriction_property_records[] = {\n";
+ # First parse the restrictions file and make a hash of the restrictions
+ my @prop_restr = ();
+ my @comp_restr = ();
while (<F>) {
@@ -67,17 +62,36 @@ sub insert_code
}
$restr =~ s/\s+$//;
- if ($prop ne "NONE") {
- print(
-" \{ICAL_METHOD_${method}, ICAL_${targetcomp}_COMPONENT, ICAL_${prop}_PROPERTY, ICAL_RESTRICTION_${restr}, $sub},\n"
- );
+ if ($prop eq "NONE") {
+ $prop = "NO";
+ }
+ if ($subcomp eq "NONE") {
+ $subcomp = "NO";
}
+ my @value = ($restr, $sub);
+ $prop_restr{$method}{$targetcomp}{$prop}{$subcomp} = \@value;
}
+ # Build the restriction table
+ print "static const icalrestriction_record icalrestriction_records[] = {\n";
+
+ for $method ( sort keys %prop_restr ) {
+ for $targetcomp ( sort keys %{ $prop_restr{$method} } ) {
+ for $prop ( sort keys %{ $prop_restr{$method}{$targetcomp} } ) {
+ for $subcomp ( sort keys %{ $prop_restr{$method}{$targetcomp}{$prop} } ) {
+ my ($restr, $sub) = @{$prop_restr{$method}{$targetcomp}{$prop}{$subcomp}};
+ print(
+" \{ICAL_METHOD_${method}, ICAL_${targetcomp}_COMPONENT, ICAL_${prop}_PROPERTY, ICAL_${subcomp}_COMPONENT, ICAL_RESTRICTION_${restr}, $sub},\n"
+ );
+ }
+ }
+ }
+}
+
# Print the terminating line
print
- " {ICAL_METHOD_NONE, ICAL_NO_COMPONENT, ICAL_NO_PROPERTY, ICAL_RESTRICTION_NONE, NULL}\n";
+ " {ICAL_METHOD_NONE, ICAL_NO_COMPONENT, ICAL_NO_PROPERTY, ICAL_NO_COMPONENT, ICAL_RESTRICTION_NONE, NULL}\n";
print "};\n";
diff --git a/scripts/readvaluesfile.pl b/scripts/readvaluesfile.pl
index 460cf7e7..3e1cb8d7 100644
--- a/scripts/readvaluesfile.pl
+++ b/scripts/readvaluesfile.pl
@@ -1,16 +1,10 @@
################################################################################
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
################################################################################
sub read_values_file
@@ -18,10 +12,13 @@ sub read_values_file
my $path = shift;
my %h;
+ my @SEEN_ENUMS;
open(F, $path) || die "Can't open values file $path";
+ my $line = 0;
while (<F>) {
+ $line++;
chop;
@@ -34,8 +31,16 @@ sub read_values_file
@column = split(/,/, $_);
my $value_name = $column[0];
- my $enumConst = $column[1];
-
+ if (exists($h{$value_name})) {
+ die "Previously defined value=$value_name line $line in $path";
+ }
+ my $enumConst = $column[1];
+ if ($enumConst !~ /FIXME/) {
+ if (grep(/^$enumConst$/, @SEEN)) {
+ die "Reusing kindEnum=$enumConst line $line in $path";
+ }
+ push(@SEEN, $enumConst);
+ }
my $c_type_str = $column[2];
my $c_autogen = ($c_type_str =~ /\(a\)/);
@@ -79,11 +84,13 @@ sub read_properties_file
my $path = shift;
my %h;
+ my @SEEN;
open(F, $path) || die "Can't open properties file $path";
+ my $line = 0;
while (<F>) {
-
+ $line++;
chop;
s/#.*$//g;
@@ -95,8 +102,16 @@ sub read_properties_file
@column = split(/,/, $_);
my $property_name = $column[0];
-
- my $enumConst = $column[1];
+ if ($property_name && exists($h{$property_name})) {
+ die "Previously defined property=$property_name line $line in $path";
+ }
+ my $enumConst = $column[1];
+ if ($enumConst !~ /FIXME/) {
+ if (grep(/^$enumConst$/, @SEEN)) {
+ die "Reusing kindEnum=$enumConst line $line in $path";
+ }
+ push(@SEEN, $enumConst);
+ }
my $lic_value = $column[2];
my $default_value = $column[3];
my $flags = $column[4];
@@ -124,10 +139,13 @@ sub read_parameters_file
my $path = shift;
my %h;
+ my @SEEN;
open(F, $path) || die "Can't open parameters file $path";
+ my $line = 0;
while (<F>) {
+ $line++;
chop;
@@ -140,8 +158,16 @@ sub read_parameters_file
@column = split(/\,/, $_);
my $parameter_name = $column[0];
-
- my $enumConst = $column[1];
+ if (exists($h{$parameter_name})) {
+ die "Previously defined parameter=$parameter_name line $line in $path";
+ }
+ my $enumConst = $column[1];
+ if ($enumConst !~ /FIXME/) {
+ if (grep(/^$enumConst$/, @SEEN)) {
+ die "Reusing kindEnum=$enumConst line $line in $path";
+ }
+ push(@SEEN, $enumConst);
+ }
my $data_type = $column[2];
my $enum_string = $column[3];
diff --git a/scripts/set_compiler_env.bat b/scripts/set_compiler_env.bat
index 6bbe2a89..215fb41d 100644
--- a/scripts/set_compiler_env.bat
+++ b/scripts/set_compiler_env.bat
@@ -1,37 +1,40 @@
@echo off
+rem SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+rem SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
:: Now we declare a scope
Setlocal EnableDelayedExpansion EnableExtensions
-if not defined Configuration set Configuration=2015
+if not defined APPVEYOR_BUILD_WORKER_IMAGE set APPVEYOR_BUILD_WORKER_IMAGE="Visual Studio 2019"
-if "%Configuration%"=="MinGW" ( goto :mingw )
+if "%USE_MINGW%"=="MinGW" ( goto :mingw )
set arch=x86
if "%platform%" EQU "x64" ( set arch=x86_amd64 )
-if "%Configuration%"=="2019" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2019" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat"
)
-if "%Configuration%"=="2015" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"
)
-if "%Configuration%"=="2013" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2013" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
)
-if "%Configuration%"=="2012" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2012" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"
)
-if "%Configuration%"=="2010" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2010" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
)
-if "%Configuration%"=="2008" (
+if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2008" (
set SET_VS_ENV="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
)
diff --git a/scripts/setup-travis.sh b/scripts/setup-travis.sh
index 315ee3b2..c6a93c78 100755
--- a/scripts/setup-travis.sh
+++ b/scripts/setup-travis.sh
@@ -1,5 +1,8 @@
#!/bin/bash
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
# things to do for travis-ci in the before_install section
if [[ $TRAVIS_OS_NAME == 'osx' ]]; then
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 9337d091..4959b3ea 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_subdirectory(libical)
add_subdirectory(libicalss)
add_subdirectory(libicalvcal)
diff --git a/src/Net-ICal-Libical/Makefile.PL b/src/Net-ICal-Libical/Makefile.PL
index 59d8d53d..60f3bc70 100644
--- a/src/Net-ICal-Libical/Makefile.PL
+++ b/src/Net-ICal-Libical/Makefile.PL
@@ -1,4 +1,8 @@
#!/usr/bin/perl
+#
+# SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+#
use ExtUtils::MakeMaker;
WriteMakefile(
diff --git a/src/Net-ICal-Libical/README b/src/Net-ICal-Libical/README.txt
index f6be345e..f6be345e 100644
--- a/src/Net-ICal-Libical/README
+++ b/src/Net-ICal-Libical/README.txt
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical.pm
index 070d58be..f4779ca4 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical.pm
@@ -3,18 +3,12 @@
# FILE: Libical.pm
# CREATOR: eric
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
# This part of this file was automatically generated by SWIG
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Component.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Component.pm
index 54d9e0ba..46838f02 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Component.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Component.pm
@@ -3,18 +3,12 @@
# FILE: Component.pm
# CREATOR: eric 1 Mar 01
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
package Net::ICal::Libical::Component;
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Duration.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Duration.pm
index 93b1852c..6c3903fe 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Duration.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Duration.pm
@@ -2,18 +2,12 @@
# FILE: Duration.pm
# CREATOR: eric
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#=============================================================================
=head1 NAME
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Period.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Period.pm
index 49a83e66..696d577e 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Period.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Period.pm
@@ -3,18 +3,12 @@
# FILE: Component.pm
# CREATOR: eric
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
=pod
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Property.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Property.pm
index 16c987a6..c2cab511 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Property.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Property.pm
@@ -3,18 +3,12 @@
# FILE: Property.pm
# CREATOR: eric 1 Mar 01
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
use Net::ICal::Libical::Property;
diff --git a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Time.pm b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Time.pm
index 1afc8c40..5e744b2c 100644
--- a/src/Net-ICal-Libical/lib/Net/ICal/Libical/Time.pm
+++ b/src/Net-ICal-Libical/lib/Net/ICal/Libical/Time.pm
@@ -3,18 +3,12 @@
# FILE: Time.pm
# CREATOR: eric
#
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
=pod
diff --git a/src/Net-ICal-Libical/netical.i b/src/Net-ICal-Libical/netical.i
index 286de3c7..b97e25bc 100644
--- a/src/Net-ICal-Libical/netical.i
+++ b/src/Net-ICal-Libical/netical.i
@@ -1,18 +1,9 @@
/*======================================================================
FILE: ical.i
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This program is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
diff --git a/src/Net-ICal-Libical/test/component.pl b/src/Net-ICal-Libical/test/component.pl
index f3e9c915..a55a4a73 100644
--- a/src/Net-ICal-Libical/test/component.pl
+++ b/src/Net-ICal-Libical/test/component.pl
@@ -1,17 +1,11 @@
#!/usr/bin/perl
#======================================================================
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
use lib "../blib/lib";
diff --git a/src/Net-ICal-Libical/test/libical.pl b/src/Net-ICal-Libical/test/libical.pl
index 74586c48..4624943e 100755..100644
--- a/src/Net-ICal-Libical/test/libical.pl
+++ b/src/Net-ICal-Libical/test/libical.pl
@@ -1,17 +1,11 @@
#!/usr/bin/perl
#======================================================================
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
use lib "../blib/lib";
diff --git a/src/Net-ICal-Libical/test/swig.pl b/src/Net-ICal-Libical/test/swig.pl
index de6c1792..df3dc316 100755..100644
--- a/src/Net-ICal-Libical/test/swig.pl
+++ b/src/Net-ICal-Libical/test/swig.pl
@@ -1,17 +1,11 @@
#!/usr/bin/perl
#======================================================================
-# (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
use lib "../blib/lib";
diff --git a/src/java/CMakeLists.txt b/src/java/CMakeLists.txt
index 0b9c08a4..d1dd43d9 100644
--- a/src/java/CMakeLists.txt
+++ b/src/java/CMakeLists.txt
@@ -1,3 +1,5 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
########### next target ###############
diff --git a/src/java/ICalDurationType.java b/src/java/ICalDurationType.java
index 2dcc2344..045589d9 100644
--- a/src/java/ICalDurationType.java
+++ b/src/java/ICalDurationType.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalDurationType.java
CREATOR: structConverter 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
diff --git a/src/java/ICalParameter.java b/src/java/ICalParameter.java
index af764e27..078c05f8 100644
--- a/src/java/ICalParameter.java
+++ b/src/java/ICalParameter.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalParameter.java
CREATOR: gnorman 01/09/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
diff --git a/src/java/ICalPeriodType.java b/src/java/ICalPeriodType.java
index 204ff2a1..765ca0c1 100644
--- a/src/java/ICalPeriodType.java
+++ b/src/java/ICalPeriodType.java
@@ -1,6 +1,8 @@
/*======================================================================
FILE: ICalPeriodType.java
CREATOR: structConverter 01/11/02
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -68,4 +70,3 @@ public class ICalPeriodType
private ICalTimeType end = new ICalTimeType();
private ICalDurationType duration = new ICalDurationType();
}
-
diff --git a/src/java/ICalProperty.java b/src/java/ICalProperty.java
index 87e99f6e..a93b4e0a 100644
--- a/src/java/ICalProperty.java
+++ b/src/java/ICalProperty.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalProperty.java
CREATOR: gnorman 01/09/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
diff --git a/src/java/ICalRecurrenceType.java b/src/java/ICalRecurrenceType.java
index cfe27911..e53bf93d 100644
--- a/src/java/ICalRecurrenceType.java
+++ b/src/java/ICalRecurrenceType.java
@@ -1,6 +1,8 @@
/*======================================================================
FILE: ICalRecurrenceType.java
CREATOR: structConverter 01/11/02
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -281,4 +283,3 @@ public class ICalRecurrenceType
public static final int ICAL_BY_MONTH_SIZE = 13;
public static final int ICAL_BY_SETPOS_SIZE = 367;
}
-
diff --git a/src/java/ICalTimeType.java b/src/java/ICalTimeType.java
index 15cf8715..ad0946c9 100644
--- a/src/java/ICalTimeType.java
+++ b/src/java/ICalTimeType.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalTimeType.java
CREATOR: structConverter 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -132,4 +133,3 @@ public class ICalTimeType
private int is_date;
private String zone = new String(); // Converted from char*
}
-
diff --git a/src/java/ICalTriggerType.java b/src/java/ICalTriggerType.java
index e2ef7a72..d23f3ba4 100644
--- a/src/java/ICalTriggerType.java
+++ b/src/java/ICalTriggerType.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalTriggerType.java
CREATOR: structConverter 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -90,4 +91,3 @@ public class ICalTriggerType
private ICalTimeType time = new ICalTimeType();
private ICalDurationType duration = new ICalDurationType();
}
-
diff --git a/src/java/ICalValue.java b/src/java/ICalValue.java
index f7160ff6..94c7de99 100644
--- a/src/java/ICalValue.java
+++ b/src/java/ICalValue.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: ICalValue.java
CREATOR: gnorman 01/10/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
diff --git a/src/java/VAgenda.java b/src/java/VAgenda.java
index 8b85fe11..d487c0eb 100644
--- a/src/java/VAgenda.java
+++ b/src/java/VAgenda.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VAgenda.java
CREATOR: fnguyen 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -10,7 +11,7 @@ public class VAgenda extends VComponent {
public VAgenda()
{
super(ICalComponentKind.ICAL_VAGENDA_COMPONENT);
- }
+ }
public VAgenda(long obj)
{
diff --git a/src/java/VAlarm.java b/src/java/VAlarm.java
index d7693f76..2de52e89 100644
--- a/src/java/VAlarm.java
+++ b/src/java/VAlarm.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VAlarm.java
CREATOR: fnguyen 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -11,7 +12,7 @@ public class VAlarm extends VComponent {
{
super(ICalComponentKind.ICAL_VALARM_COMPONENT);
}
-
+
public VAlarm(long obj)
{
super(obj);
diff --git a/src/java/VCalendar.java b/src/java/VCalendar.java
index 4cfcad27..a3f0958f 100644
--- a/src/java/VCalendar.java
+++ b/src/java/VCalendar.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VCalendar.java
CREATOR: echoi 01/28/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -10,7 +11,7 @@ public class VCalendar extends VComponent {
public VCalendar()
{
super(ICalComponentKind.ICAL_VCALENDAR_COMPONENT);
- }
+ }
public VCalendar(long obj)
{
diff --git a/src/java/VComponent.java b/src/java/VComponent.java
index d77c5bb9..b828b32c 100644
--- a/src/java/VComponent.java
+++ b/src/java/VComponent.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VComponent.java
CREATOR: gnorman 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
diff --git a/src/java/VEvent.java b/src/java/VEvent.java
index 2017aa58..33019b81 100644
--- a/src/java/VEvent.java
+++ b/src/java/VEvent.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VEvent.java
CREATOR: fnguyen 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -10,7 +11,7 @@ public class VEvent extends VComponent {
public VEvent()
{
super(ICalComponentKind.ICAL_VEVENT_COMPONENT);
- }
+ }
public VEvent(long obj)
{
diff --git a/src/java/VFreeBusy.java b/src/java/VFreeBusy.java
index a781edc5..c8dbf144 100644
--- a/src/java/VFreeBusy.java
+++ b/src/java/VFreeBusy.java
@@ -1,10 +1,17 @@
+/*======================================================================
+ FILE: VFreeBusy.java
+ CREATOR:
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+======================================================================*/
+
package net.cp.jlibical;
public class VFreeBusy extends VComponent {
public VFreeBusy()
{
super(ICalComponentKind.ICAL_VFREEBUSY_COMPONENT);
- }
+ }
public VFreeBusy(long obj)
{
diff --git a/src/java/VQuery.java b/src/java/VQuery.java
index e94a0732..d827534a 100644
--- a/src/java/VQuery.java
+++ b/src/java/VQuery.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VQuery.java
CREATOR: fnguyen 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -10,7 +11,7 @@ public class VQuery extends VComponent {
public VQuery()
{
super(ICalComponentKind.ICAL_VQUERY_COMPONENT);
- }
+ }
public VQuery(long obj)
{
diff --git a/src/java/VToDo.java b/src/java/VToDo.java
index 9e4a06e1..af1e2bcf 100644
--- a/src/java/VToDo.java
+++ b/src/java/VToDo.java
@@ -1,7 +1,8 @@
/*======================================================================
FILE: VToDo.java
CREATOR: fnguyen 01/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
package net.cp.jlibical;
@@ -10,7 +11,7 @@ public class VToDo extends VComponent {
public VToDo()
{
super(ICalComponentKind.ICAL_VTODO_COMPONENT);
- }
+ }
public VToDo(long obj)
{
diff --git a/src/java/jlibical_consts_cxx.h b/src/java/jlibical_consts_cxx.h
index b4c72da4..d970b660 100644
--- a/src/java/jlibical_consts_cxx.h
+++ b/src/java/jlibical_consts_cxx.h
@@ -2,18 +2,10 @@
FILE: jlibical_consts_cxx/h
CREATOR: Srinivasa Boppana/George Norman
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef JLIBICAL_CONSTS_CXX_H
#define JLIBICAL_CONSTS_CXX_H
diff --git a/src/java/jlibical_utils_cxx.cpp b/src/java/jlibical_utils_cxx.cpp
index d89ee862..e52e33f4 100644
--- a/src/java/jlibical_utils_cxx.cpp
+++ b/src/java/jlibical_utils_cxx.cpp
@@ -2,18 +2,10 @@
FILE: jlibical_utils_cxx.cpp
CREATOR: Srinivasa Boppana/George Norman
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef JLIBICAL_UTILS_CXX_H
@@ -415,7 +407,6 @@ jobject doCreateNewSurrogate(JNIEnv *env, jclass surrogateClass, jlong subject)
return(result);
}
-
//-------------------------------------------------------
// For the given cpErr, create a new Exception and send it to env.
// Note: Throw does not throw anything. It only sets the state.
diff --git a/src/java/jlibical_utils_cxx.h b/src/java/jlibical_utils_cxx.h
index d812202c..2a61b54e 100644
--- a/src/java/jlibical_utils_cxx.h
+++ b/src/java/jlibical_utils_cxx.h
@@ -2,18 +2,10 @@
FILE: jlibical_utils_cxx.h
CREATOR: Srinivasa Boppana/George Norman
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef TEST_CXX_H
@@ -66,5 +58,4 @@ jobject createNewICalPeriodType(JNIEnv *env, icalperiodtype* source);
jobject doCreateNewSurrogate(JNIEnv *env, jclass surrogateClass, jlong subject);
-
#endif /*TEST_CXX_H*/
diff --git a/src/java/jniICalDurationType_cxx.cpp b/src/java/jniICalDurationType_cxx.cpp
index d7bb9d97..de77ce94 100644
--- a/src/java/jniICalDurationType_cxx.cpp
+++ b/src/java/jniICalDurationType_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: jniICalDurationType_cxx.cpp
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#include <jni.h>
@@ -26,7 +18,6 @@ static jfieldID ICalDurationType_Hours_FID;
static jfieldID ICalDurationType_Minutes_FID;
static jfieldID ICalDurationType_Seconds_FID;
-
void initICalDurationTypeFieldIDs(JNIEnv* env, jclass clazz)
{
ICalDurationType_Is_neg_FID = env->GetFieldID(clazz, "is_neg", "I");
diff --git a/src/java/jniICalDurationType_cxx.h b/src/java/jniICalDurationType_cxx.h
index a7408e3c..44b28db7 100644
--- a/src/java/jniICalDurationType_cxx.h
+++ b/src/java/jniICalDurationType_cxx.h
@@ -2,18 +2,10 @@
FILE: jniICalDurationType_cxx.h
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _jni_ICalDurationType_H
#define _jni_ICalDurationType_H
@@ -22,7 +14,6 @@
// I forgot how to do this using a typedef in c++!!!!
#define ICalDurationType icaldurationtype
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -49,7 +40,6 @@ void jni_GetAll_from_ICalDurationType(struct ICalDurationType* __ICalDurationTyp
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalDurationType_initFIDs(JNIEnv *env, jclass clazz);
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalDurationType_init__J(JNIEnv *env, jobject thisICalDurationType, jlong data);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/java/jniICalPeriodType_cxx.cpp b/src/java/jniICalPeriodType_cxx.cpp
index 84d3ed61..d1df8cdb 100644
--- a/src/java/jniICalPeriodType_cxx.cpp
+++ b/src/java/jniICalPeriodType_cxx.cpp
@@ -2,19 +2,11 @@
FILE: jniICalPeriodType_cxx.cpp
CREATOR: structConverter
- (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
- (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+ SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#include <jni.h>
@@ -26,7 +18,6 @@ static jfieldID ICalPeriodType_Start_FID;
static jfieldID ICalPeriodType_End_FID;
static jfieldID ICalPeriodType_Duration_FID;
-
void initICalPeriodTypeFieldIDs(JNIEnv* env, jclass clazz)
{
ICalPeriodType_Start_FID = env->GetFieldID(clazz, "start", "Lnet/cp/jlibical/ICalTimeType;");
diff --git a/src/java/jniICalPeriodType_cxx.h b/src/java/jniICalPeriodType_cxx.h
index 5928219c..62d8a2e9 100644
--- a/src/java/jniICalPeriodType_cxx.h
+++ b/src/java/jniICalPeriodType_cxx.h
@@ -2,18 +2,10 @@
FILE: jniICalPeriodType_cxx.h
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _jni_ICalPeriodType_H
#define _jni_ICalPeriodType_H
@@ -22,7 +14,6 @@
// I forgot how to do this using a typedef in c++!!!!
#define ICalPeriodType icalperiodtype
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,7 +35,6 @@ void jni_GetAll_from_ICalPeriodType(struct ICalPeriodType* __ICalPeriodType_, JN
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalPeriodType_init__J(JNIEnv* env, jobject thisICalPeriodType, jlong data);
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalPeriodType_initFIDs(JNIEnv *env, jclass clazz);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/java/jniICalRecurrenceType_cxx.cpp b/src/java/jniICalRecurrenceType_cxx.cpp
index 34048eaa..83325894 100644
--- a/src/java/jniICalRecurrenceType_cxx.cpp
+++ b/src/java/jniICalRecurrenceType_cxx.cpp
@@ -1,17 +1,8 @@
/*======================================================================
FILE: jniICalRecurrenceType_cxx.cpp
CREATOR: structConverter
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
#include <jni.h>
@@ -35,7 +26,6 @@ static jfieldID ICalRecurrenceType_By_week_no_FID;
static jfieldID ICalRecurrenceType_By_month_FID;
static jfieldID ICalRecurrenceType_By_set_pos_FID;
-
void initICalRecurrenceTypeFieldIDs(JNIEnv* env, jclass clazz)
{
ICalRecurrenceType_Until_FID = env->GetFieldID(clazz, "until", "Lnet/cp/jlibical/ICalTimeType;");
@@ -343,7 +333,6 @@ void jni_GetAll_from_ICalRecurrenceType(struct ICalRecurrenceType* __ICalRecurre
jni_GetBy_week_no_from_ICalRecurrenceType(__ICalRecurrenceType_, env, thisICalRecurrenceType);
jni_GetBy_month_from_ICalRecurrenceType(__ICalRecurrenceType_, env, thisICalRecurrenceType);
jni_GetBy_set_pos_from_ICalRecurrenceType(__ICalRecurrenceType_, env, thisICalRecurrenceType);
-
}
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalRecurrenceType_init__J(JNIEnv* env, jobject thisICalRecurrenceType, jlong data) {
diff --git a/src/java/jniICalRecurrenceType_cxx.h b/src/java/jniICalRecurrenceType_cxx.h
index 683cc017..47d90d1b 100644
--- a/src/java/jniICalRecurrenceType_cxx.h
+++ b/src/java/jniICalRecurrenceType_cxx.h
@@ -2,18 +2,10 @@
FILE: jniICalRecurrenceType_cxx.h
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _jni_ICalRecurrenceType_H_
#define _jni_ICalRecurrenceType_H_
@@ -63,7 +55,6 @@ void jni_GetAll_from_ICalRecurrenceType(struct ICalRecurrenceType* __ICalRecurre
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalRecurrenceType_init__J(JNIEnv* env, jobject thisICalRecurrenceType, jlong data);
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalRecurrenceType_initFIDs(JNIEnv *env, jclass clazz);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/java/jniICalTimeType_cxx.cpp b/src/java/jniICalTimeType_cxx.cpp
index 9609b3b8..f956a7f3 100644
--- a/src/java/jniICalTimeType_cxx.cpp
+++ b/src/java/jniICalTimeType_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: jniICalTimeType_cxx.cpp
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#include <jni.h>
@@ -30,7 +22,6 @@ static jfieldID ICalTimeType_Second_FID;
static jfieldID ICalTimeType_Is_date_FID;
static jfieldID ICalTimeType_Zone_FID;
-
void initICalTimeTypeFieldIDs(JNIEnv* env, jclass clazz)
{
ICalTimeType_Year_FID = env->GetFieldID(clazz, "year", "I");
diff --git a/src/java/jniICalTimeType_cxx.h b/src/java/jniICalTimeType_cxx.h
index ac28303d..e0f6fb9e 100644
--- a/src/java/jniICalTimeType_cxx.h
+++ b/src/java/jniICalTimeType_cxx.h
@@ -2,18 +2,10 @@
FILE: jniICalTimeType_cxx.h
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _jni_ICalTimeType_H
#define _jni_ICalTimeType_H
@@ -52,7 +44,6 @@ void jni_GetAll_from_ICalTimeType(struct ICalTimeType* __ICalTimeType_, JNIEnv*
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalTimeType_initFIDs(JNIEnv *env, jclass clazz);
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalTimeType_init__J(JNIEnv* env, jobject thisICalTimeType, jlong data);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/java/jniICalTriggerType_cxx.cpp b/src/java/jniICalTriggerType_cxx.cpp
index 42cea1aa..fd1a93a4 100644
--- a/src/java/jniICalTriggerType_cxx.cpp
+++ b/src/java/jniICalTriggerType_cxx.cpp
@@ -2,18 +2,10 @@
FILE: jniICalTriggerType_cxx.cpp
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#include <jni.h>
@@ -24,7 +16,6 @@
static jfieldID ICalTriggerType_Time_FID;
static jfieldID ICalTriggerType_Duration_FID;
-
void initICalTriggerTypeFieldIDs(JNIEnv* env, jclass clazz)
{
ICalTriggerType_Time_FID = env->GetFieldID(clazz, "time", "Lnet/cp/jlibical/ICalTimeType;");
diff --git a/src/java/jniICalTriggerType_cxx.h b/src/java/jniICalTriggerType_cxx.h
index 3835caf5..e71f8f25 100644
--- a/src/java/jniICalTriggerType_cxx.h
+++ b/src/java/jniICalTriggerType_cxx.h
@@ -2,18 +2,10 @@
FILE: jniICalTriggerType_cxx.h
CREATOR: structConverter
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _jni_ICalTriggerType_H
@@ -23,7 +15,6 @@
// I forgot how to do this using a typedef in c++!!!!
#define ICalTriggerType icaltriggertype
-
#ifdef __cplusplus
extern "C" {
#endif
@@ -42,7 +33,6 @@ void jni_GetAll_from_ICalTriggerType(struct ICalTriggerType* __ICalTriggerType_,
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalTriggerType_init__J(JNIEnv* env, jobject thisICalTriggerType, jlong data);
JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalTriggerType_initFIDs(JNIEnv *env, jclass clazz);
-
#ifdef __cplusplus
}
#endif
diff --git a/src/java/net_cp_jlibical_ICalParameter_cxx.cpp b/src/java/net_cp_jlibical_ICalParameter_cxx.cpp
index d3d52da6..b55807a8 100644
--- a/src/java/net_cp_jlibical_ICalParameter_cxx.cpp
+++ b/src/java/net_cp_jlibical_ICalParameter_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: net_cp_jlibical_ICalParameter_cxx.cpp
CREATOR: gnorman 1/10/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef NET_CP_JLIBICAL_ICALPARAMETER_CXX_H
diff --git a/src/java/net_cp_jlibical_ICalParameter_cxx.h b/src/java/net_cp_jlibical_ICalParameter_cxx.h
index 1949a0f2..88ba98a6 100644
--- a/src/java/net_cp_jlibical_ICalParameter_cxx.h
+++ b/src/java/net_cp_jlibical_ICalParameter_cxx.h
@@ -2,18 +2,10 @@
FILE: net_cp_jlibical_ICalParameter_cxx.h
CREATOR: javah 1/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _Included_net_cp_jlibical_ICalParameter
#define _Included_net_cp_jlibical_ICalParameter
diff --git a/src/java/net_cp_jlibical_ICalProperty_cxx.cpp b/src/java/net_cp_jlibical_ICalProperty_cxx.cpp
index 415b696b..24846f15 100644
--- a/src/java/net_cp_jlibical_ICalProperty_cxx.cpp
+++ b/src/java/net_cp_jlibical_ICalProperty_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: net_cp_jlibical_ICalProperty_cxx.cpp
CREATOR: gnorman 1/10/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef NET_CP_JLIBICAL_ICALPROPERTY_CXX_H
@@ -1388,7 +1380,6 @@ JNIEXPORT void JNICALL Java_net_cp_jlibical_ICalProperty_init__I
setCObjectPtr(env,jobj,new ICalProperty((icalproperty_kind)kind));
}
-
/*
* Class: net_cp_jlibical_ICalProperty
* Method: set_status
diff --git a/src/java/net_cp_jlibical_ICalProperty_cxx.h b/src/java/net_cp_jlibical_ICalProperty_cxx.h
index b1c71c32..bc8af40f 100644
--- a/src/java/net_cp_jlibical_ICalProperty_cxx.h
+++ b/src/java/net_cp_jlibical_ICalProperty_cxx.h
@@ -2,18 +2,10 @@
FILE: net_cp_jlibical_ICalProperty_cxx.h
CREATOR: javah 1/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _Included_net_cp_jlibical_ICalProperty
#define _Included_net_cp_jlibical_ICalProperty
diff --git a/src/java/net_cp_jlibical_ICalValue_cxx.cpp b/src/java/net_cp_jlibical_ICalValue_cxx.cpp
index f01a9338..3068ce47 100644
--- a/src/java/net_cp_jlibical_ICalValue_cxx.cpp
+++ b/src/java/net_cp_jlibical_ICalValue_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: net_cp_jlibical_ICalValue_cxx.cpp
CREATOR: gnorman 1/10/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef NET_CP_JLIBICAL_ICALVALUE_CXX_H
diff --git a/src/java/net_cp_jlibical_ICalValue_cxx.h b/src/java/net_cp_jlibical_ICalValue_cxx.h
index f7ffde37..7de5cadc 100644
--- a/src/java/net_cp_jlibical_ICalValue_cxx.h
+++ b/src/java/net_cp_jlibical_ICalValue_cxx.h
@@ -2,18 +2,10 @@
FILE: net_cp_jlibical_ICalValue_cxx.h
CREATOR: javah 1/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _Included_net_cp_jlibical_ICalValue
#define _Included_net_cp_jlibical_ICalValue
diff --git a/src/java/net_cp_jlibical_VComponent_cxx.cpp b/src/java/net_cp_jlibical_VComponent_cxx.cpp
index 1b5bb852..d7054618 100644
--- a/src/java/net_cp_jlibical_VComponent_cxx.cpp
+++ b/src/java/net_cp_jlibical_VComponent_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: net_cp_jlibical_VComponent_cxx.cpp
CREATOR: gnorman 1/10/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef NET_CP_JLIBICAL_VCOMPONENT_CXX_H
@@ -470,7 +462,6 @@ JNIEXPORT jobject JNICALL Java_net_cp_jlibical_VComponent_get_1dtend
// create a new surrogate, using aTime as the subject.
result = createNewICalTimeType(env,&aTime);
-
}
return(result);
diff --git a/src/java/net_cp_jlibical_VComponent_cxx.h b/src/java/net_cp_jlibical_VComponent_cxx.h
index 3bf9d09e..8aa703af 100644
--- a/src/java/net_cp_jlibical_VComponent_cxx.h
+++ b/src/java/net_cp_jlibical_VComponent_cxx.h
@@ -2,18 +2,10 @@
FILE: net_cp_jlibical_VComponent_cxx.h
CREATOR: javah 1/11/02
- (C) COPYRIGHT 2002, Critical Path
+ SPDX-FileCopyrightText: 2002, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef _Included_net_cp_jlibical_VComponent
#define _Included_net_cp_jlibical_VComponent
diff --git a/src/java/testjni.java b/src/java/testjni.java
index bb6a6aee..89ff875b 100644
--- a/src/java/testjni.java
+++ b/src/java/testjni.java
@@ -1,3 +1,10 @@
+/*======================================================================
+ FILE: testjni.java
+ CREATOR:
+ SPDX-FileCopyrightText: 2002, Critical Path
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+======================================================================*/
+
package net.cp.jlibical;
import java.lang.String;
diff --git a/src/libical-glib/CMakeLists.txt b/src/libical-glib/CMakeLists.txt
index 096f9bb4..967b4b98 100644
--- a/src/libical-glib/CMakeLists.txt
+++ b/src/libical-glib/CMakeLists.txt
@@ -1,5 +1,12 @@
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_definitions(-Dlibical_ical_EXPORTS)
+# a C11 compliant compiler is required to build this library
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+
# build ical-glib-src-generator
add_executable(ical-glib-src-generator
tools/generator.c
@@ -85,9 +92,14 @@ else()
endif()
add_custom_command (
- OUTPUT ${LIBICAL_GLIB_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/libical-glib-private.h ${CMAKE_CURRENT_BINARY_DIR}/i-cal-forward-declarations.h
- COMMAND ${ical-glib-src-generator_EXE} "${CMAKE_CURRENT_SOURCE_DIR}/tools" "${CMAKE_CURRENT_SOURCE_DIR}/api"
+ OUTPUT
+ ${LIBICAL_GLIB_SOURCES}
+ ${CMAKE_CURRENT_BINARY_DIR}/libical-glib-private.h
+ ${CMAKE_CURRENT_BINARY_DIR}/i-cal-forward-declarations.h
+ COMMAND
+ ${ical-glib-src-generator_EXE} "${CMAKE_CURRENT_SOURCE_DIR}/tools" "${CMAKE_CURRENT_SOURCE_DIR}/api"
DEPENDS ${ical-glib-src-generator_EXE} ${xml_files}
+ COMMENT "Generate libical-glib headers"
)
configure_file(
@@ -121,10 +133,14 @@ add_dependencies(ical-glib ical-header)
target_compile_options(ical-glib PRIVATE ${GLIB_CFLAGS})
target_compile_definitions(ical-glib PRIVATE -DG_LOG_DOMAIN="libical-glib" -DLIBICAL_GLIB_COMPILATION)
target_link_libraries(ical-glib PRIVATE ical ${GLIB_LIBRARIES})
-if(NOT SHARED_ONLY)
+if(NOT SHARED_ONLY AND NOT STATIC_ONLY)
add_library(ical-glib-static STATIC ${LIBICAL_GLIB_SOURCES})
add_dependencies(ical-glib-static ical-header)
- target_compile_options(ical-glib-static PUBLIC ${GLIB_CFLAGS} -DG_LOG_DOMAIN="libical-glib" -DLIBICAL_GLIB_COMPILATION)
+ target_compile_options(ical-glib-static
+ PUBLIC ${GLIB_CFLAGS}
+ -DG_LOG_DOMAIN="libical-glib"
+ -DLIBICAL_GLIB_COMPILATION
+ )
target_link_libraries(ical-glib-static ${GLIB_LIBRARIES})
endif()
@@ -172,7 +188,14 @@ if(HAVE_INTROSPECTION)
set(ICalGLib_${LIB_VERSION}_gir_VERSION ${LIBICAL_GLIB_GIR_VERSION_STRING})
set(ICalGLib_${LIB_VERSION}_gir_LIBRARY "ICalGLib")
set(ICalGLib_${LIB_VERSION}_gir_INCLUDES GObject-2.0 GLib-2.0)
- set(ICalGLib_${LIB_VERSION}_gir_CFLAGS ${_includes} ${GLIB_CFLAGS} -DLIBICAL_GLIB_COMPILATION -I${CMAKE_CURRENT_BINARY_DIR} -I${CMAKE_CURRENT_SOURCE_DIR} -I${CMAKE_BINARY_DIR}/src/libical -I${CMAKE_SOURCE_DIR}/src/libical -I${CMAKE_BINARY_DIR}/src/libical-glib)
+ set(ICalGLib_${LIB_VERSION}_gir_CFLAGS ${GLIB_CFLAGS}
+ -DLIBICAL_GLIB_COMPILATION
+ -I${CMAKE_CURRENT_BINARY_DIR}
+ -I${CMAKE_CURRENT_SOURCE_DIR}
+ -I${CMAKE_BINARY_DIR}/src/libical
+ -I${CMAKE_SOURCE_DIR}/src/libical
+ -I${CMAKE_BINARY_DIR}/src/libical-glib
+ )
set(ICalGLib_${LIB_VERSION}_gir_LIBS ical-glib)
set(ICalGLib_${LIB_VERSION}_gir_FILES ${LIBICAL_GLIB_GIR_SOURCES})
@@ -182,7 +205,7 @@ if(HAVE_INTROSPECTION)
endif()
if(ICAL_GLIB_VAPI)
- add_custom_target(vala ALL)
+ add_custom_target(vala ALL COMMENT "Target to run vala")
set(gir_fullname ${CMAKE_BINARY_DIR}/src/libical-glib/ICalGLib-${LIBICAL_GLIB_GIR_VERSION_STRING}.gir)
set(metadata_fullname ${CMAKE_CURRENT_BINARY_DIR}/ICalGLib-${LIBICAL_GLIB_GIR_VERSION_STRING}.metadata)
set(vapi_file ${CMAKE_CURRENT_BINARY_DIR}/libical-glib.vapi)
@@ -206,9 +229,10 @@ if(ICAL_GLIB_VAPI)
DEPENDS
${gir_fullname}
${metadata_fullname}
+ COMMENT "Run the tool to generate the Vala API"
)
- add_custom_target(valafile DEPENDS ${vapi_file})
+ add_custom_target(valafile DEPENDS ${vapi_file} COMMENT "Target to run valafile")
add_dependencies(vala valafile)
@@ -217,11 +241,11 @@ endif()
if(MSVC)
set_target_properties(ical-glib PROPERTIES PREFIX "lib")
- if(NOT SHARED_ONLY)
+ if(NOT SHARED_ONLY AND NOT STATIC_ONLY)
set_target_properties(ical-glib-static PROPERTIES PREFIX "lib")
endif()
else()
- if(NOT SHARED_ONLY)
+ if(NOT SHARED_ONLY AND NOT STATIC_ONLY)
set_target_properties(ical-glib-static PROPERTIES OUTPUT_NAME "ical-glib")
endif()
endif()
@@ -230,7 +254,7 @@ set_target_properties(ical-glib PROPERTIES
SOVERSION ${LIBICAL_LIB_MAJOR_VERSION}
)
set_target_properties(ical-glib PROPERTIES CLEAN_DIRECT_OUTPUT 1)
-if(NOT SHARED_ONLY)
+if(NOT SHARED_ONLY AND NOT STATIC_ONLY)
set_target_properties(ical-glib-static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
endif()
@@ -239,7 +263,7 @@ install(
EXPORT icalTargets
DESTINATION ${INSTALL_TARGETS_DEFAULT_ARGS}
)
-if(NOT SHARED_ONLY)
+if(NOT SHARED_ONLY AND NOT STATIC_ONLY)
install(
TARGETS ical-glib-static
EXPORT icalTargets
@@ -257,8 +281,16 @@ install(FILES ${LIBICAL_GLIB_HEADERS}
set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
-set(libdir "\${exec_prefix}/lib")
-set(includedir "\${prefix}/include")
+if(IS_ABSOLUTE ${LIB_INSTALL_DIR})
+ set(libdir "${LIB_INSTALL_DIR}")
+else()
+ set(libdir "\${exec_prefix}/${LIB_INSTALL_DIR}")
+endif()
+if(IS_ABSOLUTE ${INCLUDE_INSTALL_DIR})
+ set(includedir "${INCLUDE_INSTALL_DIR}")
+else()
+ set(includedir "\${prefix}/include")
+endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/libical-glib.pc.in
diff --git a/src/libical-glib/api/i-cal-array.xml b/src/libical-glib/api/i-cal-array.xml
index 48edff92..5e8f4ba6 100644
--- a/src/libical-glib/api/i-cal-array.xml
+++ b/src/libical-glib/api/i-cal-array.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Array" native="icalarray" is_possible_global="true" destroy_func="icalarray_free">
<method name="i_cal_array_size" corresponds="CUSTOM" kind="other" since="1.0">
@@ -54,7 +46,7 @@
<method name="i_cal_array_element_at" corresponds="icalarray_element_at" annotation="skip" kind="private" since="1.0">
<parameter type="ICalArray *" name="array" comment="The #ICalArray to be queried"/>
<parameter type="gint" name="position" comment="The position the target element is located"/>
- <returns type="GObject *" annotation="transfer none, allow-none" comment="The element located at the @position in the @array"/>
+ <returns type="GObject *" annotation="transfer none, nullable" comment="The element located at the @position in the @array"/>
<comment xml:space="preserve">Gets the element located in the @position in the @array. NULL if position if out of bound.</comment>
</method>
<method name="i_cal_array_sort" corresponds="CUSTOM" annotation="skip" kind="others" since="1.0">
diff --git a/src/libical-glib/api/i-cal-attach.xml b/src/libical-glib/api/i-cal-attach.xml
index 8d3582d8..970a02cb 100644
--- a/src/libical-glib/api/i-cal-attach.xml
+++ b/src/libical-glib/api/i-cal-attach.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Attach" native="icalattach" destroy_func="icalattach_unref" new_full_extra_code="if (owner) { icalattach_ref (native); owner = NULL; }">
<method name="i_cal_attach_new_from_url" corresponds="icalattach_new_from_url" kind="constructor" since="1.0">
@@ -21,8 +13,8 @@
</method>
<method name="i_cal_attach_new_from_data" corresponds="CUSTOM" kind="constructor" since="1.0">
<parameter type="const gchar *" name="data" comment="The data used to create the #ICalAttach"/>
- <parameter type="GFunc" name="free_fn" translator="(icalattach_free_fn_t)" annotation="scope call, allow-none" comment="The function used to free the data when the create #ICalAttach is destroyed"/>
- <parameter type="void *" name="free_fn_data" annotation="allow-none" comment="The userdata used for the free function @free_fn"/>
+ <parameter type="GFunc" name="free_fn" translator="(icalattach_free_fn_t)" annotation="scope call, nullable" comment="The function used to free the data when the create #ICalAttach is destroyed"/>
+ <parameter type="void *" name="free_fn_data" annotation="nullable" comment="The userdata used for the free function @free_fn"/>
<returns type="ICalAttach *" annotation="transfer full" comment="The newly created #ICalAttach" />
<comment xml:space="preserve">Creates a new #ICalAttach from the data.</comment>
<custom> g_return_val_if_fail (data != NULL, NULL);
@@ -62,7 +54,7 @@ static void unref_g_bytes(char *data, void *user_data)
</method>
<method name="i_cal_attach_get_url" corresponds="icalattach_get_url" kind="others" since="1.0">
<parameter type="ICalAttach *" name="attach" comment="The #ICalAttach to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The url component of the @attach. %NULL if it is built from data or there is an error." />
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The url component of the @attach. %NULL if it is built from data or there is an error." />
<comment xml:space="preserve">Gets the url, if the #ICalAttach is built from the url.</comment>
</method>
<method name="i_cal_attach_get_data" corresponds="CUSTOM" kind="others" since="1.0">
diff --git a/src/libical-glib/api/i-cal-comp-iter.xml b/src/libical-glib/api/i-cal-comp-iter.xml
index 549db8aa..9f690b66 100644
--- a/src/libical-glib/api/i-cal-comp-iter.xml
+++ b/src/libical-glib/api/i-cal-comp-iter.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="CompIter" native="struct icalcompiter" is_bare="true" default_native="i_cal_comp_iter_new_default ()">
<method name="i_cal_comp_iter_new_default" corresponds="CUSTOM" kind="private" since="1.0" annotation="skip">
diff --git a/src/libical-glib/api/i-cal-component.xml b/src/libical-glib/api/i-cal-component.xml
index 29d13e53..f466978a 100644
--- a/src/libical-glib/api/i-cal-component.xml
+++ b/src/libical-glib/api/i-cal-component.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Component" native="icalcomponent" destroy_func="icalcomponent_free" includes="libical-glib/i-cal-parameter.h">
<method name="i_cal_component_new" corresponds="icalcomponent_new" kind="constructor" since="1.0">
@@ -182,32 +174,89 @@
<returns type="ICalComponent *" annotation="transfer full, nullable" translator_argus="(GObject *)component" comment="The next #ICalComponent."/>
<comment xml:space="preserve">Gets the next #ICalComponent with specific kind in #ICalComponent.</comment>
</method>
- <method name="i_cal_component_begin_component" corresponds="icalcomponent_begin_component" since="1.0">
+ <method name="i_cal_component_begin_component" corresponds="CUSTOM" since="1.0">
<parameter type="ICalComponent *" name="component" comment="A #ICalComponent"/>
<parameter type="ICalComponentKind" name="kind" comment="A #ICalComponentKind"/>
<returns type="ICalCompIter *" annotation="transfer full" comment="A #ICalCompIter"/>
- <comment xml:space="preserve">Gets the #ICalCompIter pointing to the first child #ICalComponent. Use #ICalCompIter when you need remove the child component from the parent. For traversing, i_cal_object_set_owner needs to be called after this API. See component.py in tests for details.</comment>
+ <comment xml:space="preserve">Gets the #ICalCompIter pointing to the first child #ICalComponent.</comment>
+ <custom> ICalCompIter *iter;
+
+ g_return_val_if_fail (I_CAL_IS_COMPONENT (component), NULL);
+
+ iter = i_cal_comp_iter_new_full(icalcomponent_begin_component((icalcomponent *)i_cal_object_get_native(I_CAL_OBJECT (component)), (icalcomponent_kind) (kind)));
+ if (iter) {
+ i_cal_object_set_owner(I_CAL_OBJECT(iter), G_OBJECT(component));
+ i_cal_object_set_always_destroy(I_CAL_OBJECT(iter), TRUE);
+ }
+
+ return iter;</custom>
</method>
- <method name="i_cal_component_end_component" corresponds="icalcomponent_end_component" since="1.0">
+ <method name="i_cal_component_end_component" corresponds="CUSTOM" since="1.0">
<parameter type="ICalComponent *" name="component" comment="A #ICalComponent"/>
<parameter type="ICalComponentKind" name="kind" comment="A #ICalComponentKind"/>
<returns type="ICalCompIter *" annotation="transfer full" comment="A #ICalCompIter"/>
- <comment xml:space="preserve">Gets the #ICalCompIter pointing to the end child #ICalComponent. Use #ICalCompIter when you need remove the child component from the parent. For traversing, i_cal_object_set_owner needs to be called after this API. See component.py in tests for details.</comment>
+ <comment xml:space="preserve">Gets the #ICalCompIter pointing to the end child #ICalComponent.</comment>
+ <custom> ICalCompIter *iter;
+ g_return_val_if_fail (I_CAL_IS_COMPONENT (component), NULL);
+
+ iter = i_cal_comp_iter_new_full(icalcomponent_end_component((icalcomponent *)i_cal_object_get_native(I_CAL_OBJECT (component)), (icalcomponent_kind) (kind)));
+ if (iter) {
+ i_cal_object_set_owner(I_CAL_OBJECT(iter), G_OBJECT(component));
+ i_cal_object_set_always_destroy(I_CAL_OBJECT(iter), TRUE);
+ }
+
+ return iter;</custom>
</method>
- <method name="i_cal_comp_iter_next" corresponds="icalcompiter_next" since="1.0">
+ <method name="i_cal_comp_iter_next" corresponds="CUSTOM" since="1.0">
<parameter type="ICalCompIter *" name="i" native_op="POINTER" comment="A #ICalCompIter"/>
<returns type="ICalComponent *" annotation="transfer full" comment="A #ICalCompIter"/>
- <comment xml:space="preserve">Gets the next #ICalComponent pointed by #ICalCompIter. Use #ICalCompIter when you need remove the child component from the parent. For traversing, i_cal_object_set_owner needs to be called after this API. See component.py in tests for details.</comment>
+ <comment xml:space="preserve">Gets the next #ICalComponent pointed by #ICalCompIter.</comment>
+ <custom> ICalComponent *comp;
+
+ g_return_val_if_fail (I_CAL_IS_COMP_ITER (i), NULL);
+
+ comp = i_cal_component_new_full(icalcompiter_next((struct icalcompiter *)i_cal_object_get_native(I_CAL_OBJECT (i))), NULL);
+ if (comp) {
+ GObject *owner = i_cal_object_ref_owner(I_CAL_OBJECT(i));
+ i_cal_object_set_owner(I_CAL_OBJECT(comp), owner);
+ g_clear_object(&amp;owner);
+ }
+
+ return comp;</custom>
</method>
- <method name="i_cal_comp_iter_prior" corresponds="icalcompiter_prior" since="1.0">
+ <method name="i_cal_comp_iter_prior" corresponds="CUSTOM" since="1.0">
<parameter type="ICalCompIter *" name="i" native_op="POINTER" comment="A #ICalCompIter"/>
<returns type="ICalComponent *" annotation="transfer full" comment="A #ICalCompIter"/>
- <comment xml:space="preserve">Gets the prior #ICalComponent pointed by #ICalCompIter. Use #ICalCompIter when you need remove the child component from the parent. For traversing, i_cal_object_set_owner needs to be called after this API. See component.py in tests for details.</comment>
+ <comment xml:space="preserve">Gets the prior #ICalComponent pointed by #ICalCompIter.</comment>
+ <custom> ICalComponent *comp;
+
+ g_return_val_if_fail (I_CAL_IS_COMP_ITER (i), NULL);
+
+ comp = i_cal_component_new_full(icalcompiter_prior((struct icalcompiter *)i_cal_object_get_native(I_CAL_OBJECT (i))), NULL);
+ if (comp) {
+ GObject *owner = i_cal_object_ref_owner(I_CAL_OBJECT(i));
+ i_cal_object_set_owner(I_CAL_OBJECT(comp), owner);
+ g_clear_object(&amp;owner);
+ }
+
+ return comp;</custom>
</method>
- <method name="i_cal_comp_iter_deref" corresponds="icalcompiter_deref" since="1.0">
+ <method name="i_cal_comp_iter_deref" corresponds="CUSTOM" since="1.0">
<parameter type="ICalCompIter *" name="i" native_op="POINTER" comment="A #ICalCompIter"/>
<returns type="ICalComponent *" annotation="transfer full" comment="A #ICalComponent"/>
- <comment xml:space="preserve">Gets the current #ICalComponent pointed by #ICalCompIter. Use #ICalCompIter when you need remove the child component from the parent. For traversing, i_cal_object_set_owner needs to be called after this API. See component.py in tests for details.</comment>
+ <comment xml:space="preserve">Gets the current #ICalComponent pointed by #ICalCompIter.</comment>
+ <custom> ICalComponent *comp;
+
+ g_return_val_if_fail (I_CAL_IS_COMP_ITER (i), NULL);
+
+ comp = i_cal_component_new_full(icalcompiter_deref((struct icalcompiter *)i_cal_object_get_native(I_CAL_OBJECT (i))), NULL);
+ if (comp) {
+ GObject *owner = i_cal_object_ref_owner(I_CAL_OBJECT(i));
+ i_cal_object_set_owner(I_CAL_OBJECT(comp), owner);
+ g_clear_object(&amp;owner);
+ }
+
+ return comp;</custom>
</method>
<method name="i_cal_component_check_restrictions" corresponds="icalcomponent_check_restrictions" kind="other" since="1.0">
<parameter type="ICalComponent *" name="comp" comment="The #ICalComponent to be checked"/>
@@ -493,7 +542,7 @@ static void foreach_recurrence_cb(icalcomponent *in_comp, struct icaltime_span *
<method name="i_cal_component_get_timezone" corresponds="icalcomponent_get_timezone" kind="get" since="1.0">
<parameter type="ICalComponent *" name="comp" comment="A #ICalComponent"/>
<parameter type="const gchar *" name="tzid" comment="A string representing timezone"/>
- <returns type="ICalTimezone *" annotation="transfer full, allow-none" translator_argus="(GObject *)comp, FALSE" comment="A #ICalTimezone."/>
+ <returns type="ICalTimezone *" annotation="transfer full, nullable" translator_argus="(GObject *)comp, FALSE" comment="A #ICalTimezone."/>
<comment xml:space="preserve">Returns the icaltimezone in the component corresponding to the TZID, or NULL if it can't be found.</comment>
</method>
<method name="i_cal_property_recurrence_is_excluded" corresponds="icalproperty_recurrence_is_excluded" since="1.0">
diff --git a/src/libical-glib/api/i-cal-datetimeperiod.xml b/src/libical-glib/api/i-cal-datetimeperiod.xml
index bfeadab1..4a393740 100644
--- a/src/libical-glib/api/i-cal-datetimeperiod.xml
+++ b/src/libical-glib/api/i-cal-datetimeperiod.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Datetimeperiod" native="struct icaldatetimeperiodtype" is_bare="true" default_native="i_cal_datetimeperiod_new_default ()" includes="libical-glib/i-cal-time.h, libical-glib/i-cal-period.h">
<method name="i_cal_datetimeperiod_new_default" corresponds="CUSTOM" annotation="skip" kind="private" since="1.0">
diff --git a/src/libical-glib/api/i-cal-derived-parameter.xml b/src/libical-glib/api/i-cal-derived-parameter.xml
index 1a309e4a..4b85800d 100644
--- a/src/libical-glib/api/i-cal-derived-parameter.xml
+++ b/src/libical-glib/api/i-cal-derived-parameter.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="DerivedParameter">
<enum name="ICalParameterKind" native_name="icalparameter_kind" default_native="I_CAL_NO_PARAMETER">
@@ -24,13 +16,17 @@
<element name="ICAL_DELEGATEDFROM_PARAMETER"/>
<element name="ICAL_DELEGATEDTO_PARAMETER"/>
<element name="ICAL_DIR_PARAMETER"/>
+ <element name="ICAL_DISPLAY_PARAMETER"/>
+ <element name="ICAL_EMAIL_PARAMETER"/>
<element name="ICAL_ENABLE_PARAMETER"/>
<element name="ICAL_ENCODING_PARAMETER"/>
<element name="ICAL_FBTYPE_PARAMETER"/>
+ <element name="ICAL_FEATURE_PARAMETER"/>
<element name="ICAL_FILENAME_PARAMETER"/>
<element name="ICAL_FMTTYPE_PARAMETER"/>
<element name="ICAL_IANA_PARAMETER"/>
<element name="ICAL_ID_PARAMETER"/>
+ <element name="ICAL_LABEL_PARAMETER"/>
<element name="ICAL_LANGUAGE_PARAMETER"/>
<element name="ICAL_LATENCY_PARAMETER"/>
<element name="ICAL_LOCAL_PARAMETER"/>
@@ -40,6 +36,7 @@
<element name="ICAL_MODIFIED_PARAMETER"/>
<element name="ICAL_OPTIONS_PARAMETER"/>
<element name="ICAL_PARTSTAT_PARAMETER"/>
+ <element name="ICAL_PATCHACTION_PARAMETER"/>
<element name="ICAL_PUBLICCOMMENT_PARAMETER"/>
<element name="ICAL_RANGE_PARAMETER"/>
<element name="ICAL_REASON_PARAMETER"/>
@@ -78,6 +75,14 @@
<element name="ICAL_CUTYPE_UNKNOWN"/>
<element name="ICAL_CUTYPE_NONE"/>
</enum>
+ <enum name="ICalParameterDisplay" native_name="icalparameter_display" default_native="I_CAL_DISPLAY_NONE">
+ <element name="ICAL_DISPLAY_X"/>
+ <element name="ICAL_DISPLAY_BADGE"/>
+ <element name="ICAL_DISPLAY_GRAPHIC"/>
+ <element name="ICAL_DISPLAY_FULLSIZE"/>
+ <element name="ICAL_DISPLAY_THUMBNAIL"/>
+ <element name="ICAL_DISPLAY_NONE"/>
+ </enum>
<enum name="ICalParameterEnable" native_name="icalparameter_enable" default_native="I_CAL_ENABLE_NONE">
<element name="ICAL_ENABLE_X"/>
<element name="ICAL_ENABLE_TRUE"/>
@@ -98,6 +103,17 @@
<element name="ICAL_FBTYPE_BUSYTENTATIVE"/>
<element name="ICAL_FBTYPE_NONE"/>
</enum>
+ <enum name="ICalParameterFeature" native_name="icalparameter_feature" default_native="I_CAL_FEATURE_NONE">
+ <element name="ICAL_FEATURE_X"/>
+ <element name="ICAL_FEATURE_AUDIO"/>
+ <element name="ICAL_FEATURE_CHAT"/>
+ <element name="ICAL_FEATURE_FEED"/>
+ <element name="ICAL_FEATURE_MODERATOR"/>
+ <element name="ICAL_FEATURE_PHONE"/>
+ <element name="ICAL_FEATURE_SCREEN"/>
+ <element name="ICAL_FEATURE_VIDEO"/>
+ <element name="ICAL_FEATURE_NONE"/>
+ </enum>
<enum name="ICalParameterLocal" native_name="icalparameter_local" default_native="I_CAL_LOCAL_NONE">
<element name="ICAL_LOCAL_X"/>
<element name="ICAL_LOCAL_TRUE"/>
@@ -116,6 +132,14 @@
<element name="ICAL_PARTSTAT_FAILED"/>
<element name="ICAL_PARTSTAT_NONE"/>
</enum>
+ <enum name="ICalParameterPatchaction" native_name="icalparameter_patchaction" default_native="I_CAL_PATCHACTION_NONE">
+ <element name="ICAL_PATCHACTION_X"/>
+ <element name="ICAL_PATCHACTION_CREATE"/>
+ <element name="ICAL_PATCHACTION_BYNAME"/>
+ <element name="ICAL_PATCHACTION_BYVALUE"/>
+ <element name="ICAL_PATCHACTION_BYPARAM"/>
+ <element name="ICAL_PATCHACTION_NONE"/>
+ </enum>
<enum name="ICalParameterRange" native_name="icalparameter_range" default_native="I_CAL_RANGE_NONE">
<element name="ICAL_RANGE_X"/>
<element name="ICAL_RANGE_THISANDPRIOR"/>
@@ -247,7 +271,7 @@
</method>
<method name="i_cal_parameter_get_altrep" corresponds="icalparameter_get_altrep" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_altrep" corresponds="icalparameter_set_altrep" kind="set" since="1.0">
@@ -262,7 +286,7 @@
</method>
<method name="i_cal_parameter_get_charset" corresponds="icalparameter_get_charset" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_charset" corresponds="icalparameter_set_charset" kind="set" since="1.0">
@@ -277,7 +301,7 @@
</method>
<method name="i_cal_parameter_get_cn" corresponds="icalparameter_get_cn" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_cn" corresponds="icalparameter_set_cn" kind="set" since="1.0">
@@ -292,7 +316,7 @@
</method>
<method name="i_cal_parameter_get_cutype" corresponds="icalparameter_get_cutype" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="ICalParameterCutype" annotation="allow-none" comment="The property of the @value" />
+ <returns type="ICalParameterCutype" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_cutype" corresponds="icalparameter_set_cutype" kind="set" since="1.0">
@@ -307,7 +331,7 @@
</method>
<method name="i_cal_parameter_get_delegatedfrom" corresponds="icalparameter_get_delegatedfrom" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_delegatedfrom" corresponds="icalparameter_set_delegatedfrom" kind="set" since="1.0">
@@ -322,7 +346,7 @@
</method>
<method name="i_cal_parameter_get_delegatedto" corresponds="icalparameter_get_delegatedto" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_delegatedto" corresponds="icalparameter_set_delegatedto" kind="set" since="1.0">
@@ -337,7 +361,7 @@
</method>
<method name="i_cal_parameter_get_dir" corresponds="icalparameter_get_dir" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_dir" corresponds="icalparameter_set_dir" kind="set" since="1.0">
@@ -345,6 +369,36 @@
<parameter type="const gchar *" name="v" comment="The string used to set into the @value"/>
<comment xml:space="preserve"></comment>
</method>
+ <method name="i_cal_parameter_new_display" corresponds="icalparameter_new_display" kind="constructor" since="3.0.15">
+ <parameter type="ICalParameterDisplay" name="value" comment="The #ICalParameterDisplay value of the new #ICalParameter"/>
+ <returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter" />
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_get_display" corresponds="icalparameter_get_display" kind="get" since="3.0.15">
+ <parameter type="const ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
+ <returns type="ICalParameterDisplay" comment="The #ICalParameterDisplay value of the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_set_display" corresponds="icalparameter_set_display" kind="set" since="3.0.15">
+ <parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be set"/>
+ <parameter type="ICalParameterDisplay" name="value" comment="The #ICalParameterDisplay to set into the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_new_email" corresponds="icalparameter_new_email" kind="constructor" since="3.0.15">
+ <parameter type="const gchar *" name="value" comment="The string value of the new #ICalParameter"/>
+ <returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter" />
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_get_email" corresponds="icalparameter_get_email" kind="get" since="3.0.15">
+ <parameter type="const ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
+ <returns type="const gchar *" annotation="nullable" comment="The string value of the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_set_email" corresponds="icalparameter_set_email" kind="set" since="3.0.15">
+ <parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be set"/>
+ <parameter type="const gchar *" name="value" comment="The string value to set into the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
<method name="i_cal_parameter_new_enable" corresponds="icalparameter_new_enable" kind="constructor" since="1.0">
<parameter type="ICalParameterEnable" name="v" comment="The type of #ICalParameter to be created"/>
<returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter." />
@@ -390,6 +444,21 @@
<parameter type="ICalParameterFbtype" name="v" comment="The type of #ICalParameter to be set in the @value"/>
<comment xml:space="preserve"></comment>
</method>
+ <method name="i_cal_parameter_new_feature" corresponds="icalparameter_new_feature" kind="constructor" since="3.0.15">
+ <parameter type="ICalParameterFeature" name="value" comment="The #ICalParameterFeature value of the new #ICalParameter"/>
+ <returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter" />
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_get_feature" corresponds="icalparameter_get_feature" kind="get" since="3.0.15">
+ <parameter type="const ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
+ <returns type="ICalParameterFeature" comment="The #ICalParameterFeature value of the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_set_feature" corresponds="icalparameter_set_feature" kind="set" since="3.0.15">
+ <parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be set"/>
+ <parameter type="ICalParameterFeature" name="value" comment="The #ICalParameterFeature to set into the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
<method name="i_cal_parameter_new_filename" corresponds="icalparameter_new_filename" kind="constructor" since="2.0">
<parameter type="const gchar *" name="v" comment="The string used to create the new #ICalParameter"/>
<returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter." />
@@ -397,7 +466,7 @@
</method>
<method name="i_cal_parameter_get_filename" corresponds="icalparameter_get_filename" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_filename" corresponds="icalparameter_set_filename" kind="set" since="2.0">
@@ -412,7 +481,7 @@
</method>
<method name="i_cal_parameter_get_fmttype" corresponds="icalparameter_get_fmttype" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_fmttype" corresponds="icalparameter_set_fmttype" kind="set" since="1.0">
@@ -427,7 +496,7 @@
</method>
<method name="i_cal_parameter_get_iana" corresponds="icalparameter_get_iana" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_iana" corresponds="icalparameter_set_iana" kind="set" since="1.0">
@@ -442,7 +511,7 @@
</method>
<method name="i_cal_parameter_get_id" corresponds="icalparameter_get_id" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_id" corresponds="icalparameter_set_id" kind="set" since="1.0">
@@ -450,6 +519,21 @@
<parameter type="const gchar *" name="v" comment="The string used to set into the @value"/>
<comment xml:space="preserve"></comment>
</method>
+ <method name="i_cal_parameter_new_label" corresponds="icalparameter_new_label" kind="constructor" since="3.0.15">
+ <parameter type="const gchar *" name="value" comment="The string value of the new #ICalParameter"/>
+ <returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter" />
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_get_label" corresponds="icalparameter_get_label" kind="get" since="3.0.15">
+ <parameter type="const ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
+ <returns type="const gchar *" annotation="nullable" comment="The string value of the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_set_label" corresponds="icalparameter_set_label" kind="set" since="3.0.15">
+ <parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be set"/>
+ <parameter type="const gchar *" name="value" comment="The string value to set into the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
<method name="i_cal_parameter_new_language" corresponds="icalparameter_new_language" kind="constructor" since="1.0">
<parameter type="const gchar *" name="v" comment="The string used to create the new #ICalParameter"/>
<returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter." />
@@ -457,7 +541,7 @@
</method>
<method name="i_cal_parameter_get_language" corresponds="icalparameter_get_language" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_language" corresponds="icalparameter_set_language" kind="set" since="1.0">
@@ -472,7 +556,7 @@
</method>
<method name="i_cal_parameter_get_latency" corresponds="icalparameter_get_latency" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_latency" corresponds="icalparameter_set_latency" kind="set" since="1.0">
@@ -502,7 +586,7 @@
</method>
<method name="i_cal_parameter_get_localize" corresponds="icalparameter_get_localize" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_localize" corresponds="icalparameter_set_localize" kind="set" since="1.0">
@@ -517,7 +601,7 @@
</method>
<method name="i_cal_parameter_get_managedid" corresponds="icalparameter_get_managedid" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_managedid" corresponds="icalparameter_set_managedid" kind="set" since="2.0">
@@ -532,7 +616,7 @@
</method>
<method name="i_cal_parameter_get_member" corresponds="icalparameter_get_member" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_member" corresponds="icalparameter_set_member" kind="set" since="1.0">
@@ -547,7 +631,7 @@
</method>
<method name="i_cal_parameter_get_modified" corresponds="icalparameter_get_modified" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_modified" corresponds="icalparameter_set_modified" kind="set" since="2.0">
@@ -562,7 +646,7 @@
</method>
<method name="i_cal_parameter_get_options" corresponds="icalparameter_get_options" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_options" corresponds="icalparameter_set_options" kind="set" since="1.0">
@@ -585,6 +669,21 @@
<parameter type="ICalParameterPartstat" name="v" comment="The type of #ICalParameter to be set in the @value"/>
<comment xml:space="preserve"></comment>
</method>
+ <method name="i_cal_parameter_new_patchaction" corresponds="icalparameter_new_patchaction" kind="constructor" since="3.0.15">
+ <parameter type="ICalParameterPatchaction" name="value" comment="The #ICalParameterPatchaction value of the new #ICalParameter"/>
+ <returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter" />
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_get_patchaction" corresponds="icalparameter_get_patchaction" kind="get" since="3.0.15">
+ <parameter type="const ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
+ <returns type="ICalParameterPatchaction" comment="The #ICalParameterPatchaction value of the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
+ <method name="i_cal_parameter_set_patchaction" corresponds="icalparameter_set_patchaction" kind="set" since="3.0.15">
+ <parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be set"/>
+ <parameter type="ICalParameterPatchaction" name="value" comment="The #ICalParameterPatchaction to set into the @param"/>
+ <comment xml:space="preserve"></comment>
+ </method>
<method name="i_cal_parameter_new_publiccomment" corresponds="icalparameter_new_publiccomment" kind="constructor" since="2.0">
<parameter type="const gchar *" name="v" comment="The string used to create the new #ICalParameter"/>
<returns type="ICalParameter *" annotation="transfer full" comment="The newly created #ICalParameter." />
@@ -592,7 +691,7 @@
</method>
<method name="i_cal_parameter_get_publiccomment" corresponds="icalparameter_get_publiccomment" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_publiccomment" corresponds="icalparameter_set_publiccomment" kind="set" since="2.0">
@@ -622,7 +721,7 @@
</method>
<method name="i_cal_parameter_get_reason" corresponds="icalparameter_get_reason" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_reason" corresponds="icalparameter_set_reason" kind="set" since="2.0">
@@ -757,7 +856,7 @@
</method>
<method name="i_cal_parameter_get_schedulestatus" corresponds="icalparameter_get_schedulestatus" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_schedulestatus" corresponds="icalparameter_set_schedulestatus" kind="set" since="1.0">
@@ -772,7 +871,7 @@
</method>
<method name="i_cal_parameter_get_sentby" corresponds="icalparameter_get_sentby" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_sentby" corresponds="icalparameter_set_sentby" kind="set" since="1.0">
@@ -787,7 +886,7 @@
</method>
<method name="i_cal_parameter_get_size" corresponds="icalparameter_get_size" kind="get" since="2.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_size" corresponds="icalparameter_set_size" kind="set" since="2.0">
@@ -832,7 +931,7 @@
</method>
<method name="i_cal_parameter_get_tzid" corresponds="icalparameter_get_tzid" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_tzid" corresponds="icalparameter_set_tzid" kind="set" since="1.0">
@@ -862,7 +961,7 @@
</method>
<method name="i_cal_parameter_get_x" corresponds="icalparameter_get_x" kind="get" since="1.0">
<parameter type="const ICalParameter *" name="value" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve"></comment>
</method>
<method name="i_cal_parameter_set_x" corresponds="icalparameter_set_x" kind="set" since="1.0">
diff --git a/src/libical-glib/api/i-cal-derived-property.xml b/src/libical-glib/api/i-cal-derived-property.xml
index 24e31ef5..3ca15403 100644
--- a/src/libical-glib/api/i-cal-derived-property.xml
+++ b/src/libical-glib/api/i-cal-derived-property.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="DerivedProperty">
<enum name="ICalPropertyKind" native_name="icalproperty_kind" default_native="I_CAL_NO_PROPERTY">
diff --git a/src/libical-glib/api/i-cal-derived-value.xml b/src/libical-glib/api/i-cal-derived-value.xml
index aa58a233..92d94b8a 100644
--- a/src/libical-glib/api/i-cal-derived-value.xml
+++ b/src/libical-glib/api/i-cal-derived-value.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="DerivedValue">
<enum name="ICalValueKind" native_name="icalvalue_kind" default_native="I_CAL_NO_VALUE">
@@ -210,7 +202,7 @@
</method>
<method name="i_cal_value_get_x" corresponds="icalvalue_get_x" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The x within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The x within #ICalValue"/>
<comment>Gets the x of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_recur" corresponds="icalvalue_set_recur" kind="set" since="1.0">
@@ -225,7 +217,7 @@
</method>
<method name="i_cal_value_get_recur" corresponds="icalvalue_get_recur" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalRecurrence *" annotation="allow-none, transfer full" comment="The recur within #ICalValue"/>
+ <returns type="ICalRecurrence *" annotation="nullable, transfer full" comment="The recur within #ICalValue"/>
<comment>Gets the recur of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_trigger" corresponds="icalvalue_set_trigger" kind="set" since="1.0">
@@ -240,7 +232,7 @@
</method>
<method name="i_cal_value_get_trigger" corresponds="icalvalue_get_trigger" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalTrigger *" annotation="allow-none, transfer full" comment="The trigger within #ICalValue"/>
+ <returns type="ICalTrigger *" annotation="nullable, transfer full" comment="The trigger within #ICalValue"/>
<comment>Gets the trigger of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_datetime" corresponds="icalvalue_set_datetime" kind="set" since="1.0">
@@ -255,7 +247,7 @@
</method>
<method name="i_cal_value_get_datetime" corresponds="icalvalue_get_datetime" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalTime *" annotation="allow-none, transfer full" comment="The datetime within #ICalValue"/>
+ <returns type="ICalTime *" annotation="nullable, transfer full" comment="The datetime within #ICalValue"/>
<comment>Gets the datetime of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_datetimedate" corresponds="icalvalue_set_datetimedate" kind="set" since="3.0">
@@ -270,7 +262,7 @@
</method>
<method name="i_cal_value_get_datetimedate" corresponds="icalvalue_get_datetimedate" kind="get" since="3.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalTime *" annotation="allow-none, transfer full" comment="The datetimedate within #ICalValue"/>
+ <returns type="ICalTime *" annotation="nullable, transfer full" comment="The datetimedate within #ICalValue"/>
<comment>Gets the datetimedate (DATE-TIME or DATE) of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_datetimeperiod" corresponds="icalvalue_set_datetimeperiod" kind="set" since="1.0">
@@ -285,7 +277,7 @@
</method>
<method name="i_cal_value_get_datetimeperiod" corresponds="icalvalue_get_datetimeperiod" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalDatetimeperiod *" annotation="allow-none, transfer full" comment="The datetimeperiod within #ICalValue"/>
+ <returns type="ICalDatetimeperiod *" annotation="nullable, transfer full" comment="The datetimeperiod within #ICalValue"/>
<comment>Gets the datetimeperiod of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_geo" corresponds="icalvalue_set_geo" kind="set" since="1.0">
@@ -300,7 +292,7 @@
</method>
<method name="i_cal_value_get_geo" corresponds="icalvalue_get_geo" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalGeo *" annotation="allow-none, transfer full" comment="The geo within #ICalValue"/>
+ <returns type="ICalGeo *" annotation="nullable, transfer full" comment="The geo within #ICalValue"/>
<comment>Gets the geo of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_attach" corresponds="icalvalue_set_attach" kind="set" since="1.0">
@@ -315,7 +307,7 @@
</method>
<method name="i_cal_value_get_attach" corresponds="icalvalue_get_attach" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalAttach *" annotation="allow-none, transfer none" translator_argus="(GObject *)value" comment="The attach within #ICalValue"/>
+ <returns type="ICalAttach *" annotation="nullable, transfer none" translator_argus="(GObject *)value" comment="The attach within #ICalValue"/>
<comment>Gets the attach of #ICalValue.</comment>
</method>
<method name="i_cal_value_reset_kind" corresponds="icalvalue_reset_kind" kind="other" since="1.0">
@@ -454,7 +446,7 @@
</method>
<method name="i_cal_value_get_caladdress" corresponds="icalvalue_get_caladdress" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The caladdress within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The caladdress within #ICalValue"/>
<comment>Gets the caladdress of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_period" corresponds="icalvalue_set_period" kind="set" since="1.0">
@@ -469,7 +461,7 @@
</method>
<method name="i_cal_value_get_period" corresponds="icalvalue_get_period" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalPeriod *" annotation="allow-none, transfer full" comment="The period within #ICalValue"/>
+ <returns type="ICalPeriod *" annotation="nullable, transfer full" comment="The period within #ICalValue"/>
<comment>Gets the period of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_status" corresponds="icalvalue_set_status" kind="set" since="1.0">
@@ -499,7 +491,7 @@
</method>
<method name="i_cal_value_get_binary" corresponds="icalvalue_get_binary" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The binary within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The binary within #ICalValue"/>
<comment>Gets the binary of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_text" corresponds="icalvalue_set_text" kind="set" since="1.0">
@@ -514,7 +506,7 @@
</method>
<method name="i_cal_value_get_text" corresponds="icalvalue_get_text" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The text within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The text within #ICalValue"/>
<comment>Gets the text of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_duration" corresponds="icalvalue_set_duration" kind="set" since="1.0">
@@ -529,7 +521,7 @@
</method>
<method name="i_cal_value_get_duration" corresponds="icalvalue_get_duration" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalDuration *" annotation="allow-none, transfer full" comment="The duration within #ICalValue"/>
+ <returns type="ICalDuration *" annotation="nullable, transfer full" comment="The duration within #ICalValue"/>
<comment>Gets the duration of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_integer" corresponds="icalvalue_set_integer" kind="set" since="1.0">
@@ -559,7 +551,7 @@
</method>
<method name="i_cal_value_get_uri" corresponds="icalvalue_get_uri" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The uri within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The uri within #ICalValue"/>
<comment>Gets the uri of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_class" corresponds="icalvalue_set_class" kind="set" since="1.0">
@@ -604,7 +596,7 @@
</method>
<method name="i_cal_value_get_query" corresponds="icalvalue_get_query" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The query within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The query within #ICalValue"/>
<comment>Gets the query of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_string" corresponds="icalvalue_set_string" kind="set" since="1.0">
@@ -619,7 +611,7 @@
</method>
<method name="i_cal_value_get_string" corresponds="icalvalue_get_string" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The string within #ICalValue"/>
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The string within #ICalValue"/>
<comment>Gets the string of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_transp" corresponds="icalvalue_set_transp" kind="set" since="1.0">
@@ -649,7 +641,7 @@
</method>
<method name="i_cal_value_get_requeststatus" corresponds="icalvalue_get_requeststatus" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalReqstat *" annotation="allow-none, transfer full" comment="The requeststatus within #ICalValue"/>
+ <returns type="ICalReqstat *" annotation="nullable, transfer full" comment="The requeststatus within #ICalValue"/>
<comment>Gets the requeststatus of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_date" corresponds="icalvalue_set_date" kind="set" since="1.0">
@@ -664,7 +656,7 @@
</method>
<method name="i_cal_value_get_date" corresponds="icalvalue_get_date" kind="get" since="1.0">
<parameter type="ICalValue *" name="value" comment="The #ICalValue to be queried"/>
- <returns type="ICalTime *" annotation="allow-none, transfer full" comment="The date within #ICalValue"/>
+ <returns type="ICalTime *" annotation="nullable, transfer full" comment="The date within #ICalValue"/>
<comment>Gets the date of #ICalValue.</comment>
</method>
<method name="i_cal_value_set_action" corresponds="icalvalue_set_action" kind="set" since="1.0">
diff --git a/src/libical-glib/api/i-cal-duration.xml b/src/libical-glib/api/i-cal-duration.xml
index ec80208d..053cbee5 100644
--- a/src/libical-glib/api/i-cal-duration.xml
+++ b/src/libical-glib/api/i-cal-duration.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Duration" native="struct icaldurationtype" is_bare="true" default_native="icaldurationtype_null_duration()">
<method name="i_cal_duration_is_neg" corresponds="CUSTOM" kind="get" since="1.0">
diff --git a/src/libical-glib/api/i-cal-enums.xml b/src/libical-glib/api/i-cal-enums.xml
index 61e12a79..ac8a747a 100644
--- a/src/libical-glib/api/i-cal-enums.xml
+++ b/src/libical-glib/api/i-cal-enums.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Enums">
<enum name="ICalComponentKind" native_name="icalcomponent_kind" default_native="I_CAL_NO_COMPONENT">
diff --git a/src/libical-glib/api/i-cal-error.xml b/src/libical-glib/api/i-cal-error.xml
index e2692f71..9589ddd5 100644
--- a/src/libical-glib/api/i-cal-error.xml
+++ b/src/libical-glib/api/i-cal-error.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Error">
<enum name="ICalErrorEnum" native_name="icalerrorenum" default_native="I_CAL_UNKNOWN_ERROR">
diff --git a/src/libical-glib/api/i-cal-geo.xml b/src/libical-glib/api/i-cal-geo.xml
index 4d531387..b7645184 100644
--- a/src/libical-glib/api/i-cal-geo.xml
+++ b/src/libical-glib/api/i-cal-geo.xml
@@ -1,25 +1,17 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Geo" native="struct icalgeotype" is_bare="true" default_native="i_cal_geo_new_default ()">
<method name="i_cal_geo_new_default" corresponds="CUSTOM" annotation="skip" kind="private" since="1.0">
<returns type="struct icalgeotype" annotation="transfer full" comment="The newly created #ICalGeo" />
<comment xml:space="preserve">Creates a new default #ICalGeo.</comment>
<custom> struct icalgeotype geotype;
- geotype.lat = 0;
- geotype.lon = 0;
+ memset(geotype.lat, 0, ICAL_GEO_LEN);
+ memset(geotype.lon, 0, ICAL_GEO_LEN);
return geotype;</custom>
</method>
<method name="i_cal_geo_new" corresponds="CUSTOM" kind="constructor" since="1.0">
@@ -28,10 +20,14 @@
<returns type="ICalGeo *" annotation="transfer full" comment="The newly created #ICalGeo." />
<comment xml:space="preserve">Creates a new #ICalGeo.</comment>
<custom> struct icalgeotype geo;
-
+ char dval[ICAL_GEO_LEN];
geo = i_cal_geo_new_default();
- geo.lat = lat;
- geo.lon = lon;
+ memset(dval, 0, ICAL_GEO_LEN);
+ snprintf(dval, ICAL_GEO_LEN, "%lf", lat);
+ strncpy(geo.lat, dval, ICAL_GEO_LEN-1);
+ memset(dval, 0, ICAL_GEO_LEN);
+ snprintf(dval, ICAL_GEO_LEN, "%lf", lon);
+ strncpy(geo.lon, dval, ICAL_GEO_LEN-1);
return i_cal_geo_new_full(geo);</custom>
</method>
@@ -53,27 +49,33 @@
<returns type="gdouble" comment="The latitude." />
<comment xml:space="preserve">Gets the latitude of #ICalGeo.</comment>
<custom> g_return_val_if_fail (geo != NULL, 0);
- return ((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lat;</custom>
+ return atof(((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lat);</custom>
</method>
<method name="i_cal_geo_set_lat" corresponds="CUSTOM" kind="set" since="1.0">
<parameter type="ICalGeo *" name="geo" comment="The #ICalGeo to be set"/>
<parameter type="gdouble" name="lat" comment="The latitude"/>
<comment>Sets the latitude of #ICalGeo.</comment>
- <custom> g_return_if_fail (geo != NULL &amp;&amp; I_CAL_IS_GEO (geo));
- ((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lat = lat;</custom>
+ <custom> char dval[ICAL_GEO_LEN];
+ g_return_if_fail (geo != NULL &amp;&amp; I_CAL_IS_GEO (geo));
+ memset(dval, 0, ICAL_GEO_LEN);
+ snprintf(dval, ICAL_GEO_LEN, "%lf", lat);
+ strncpy(((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lat, dval, ICAL_GEO_LEN-1);</custom>
</method>
<method name="i_cal_geo_get_lon" corresponds="CUSTOM" kind="get" since="1.0">
<parameter type="ICalGeo *" name="geo" comment="The #ICalGeo to be queried"/>
<returns type="gdouble" comment="The longitude." />
<comment xml:space="preserve">Gets the longitude of #ICalGeo.</comment>
<custom> g_return_val_if_fail (geo != NULL, 0);
- return ((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lon;</custom>
+ return atof(((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lon);</custom>
</method>
<method name="i_cal_geo_set_lon" corresponds="CUSTOM" kind="set" since="1.0">
<parameter type="ICalGeo *" name="geo" comment="The #ICalGeo to be set"/>
<parameter type="gdouble" name="lon" comment="The longitude"/>
<comment>Sets the longitude of #ICalGeo.</comment>
- <custom> g_return_if_fail (geo != NULL &amp;&amp; I_CAL_IS_GEO (geo));
- ((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lon = lon;</custom>
+ <custom> char dval[ICAL_GEO_LEN];
+ g_return_if_fail (geo != NULL &amp;&amp; I_CAL_IS_GEO (geo));
+ memset(dval, 0, ICAL_GEO_LEN);
+ snprintf(dval, ICAL_GEO_LEN, "%lf", lon);
+ strncpy(((struct icalgeotype *)i_cal_object_get_native ((ICalObject *)geo))->lon, dval, ICAL_GEO_LEN-1);</custom>
</method>
</structure>
diff --git a/src/libical-glib/api/i-cal-memory.xml b/src/libical-glib/api/i-cal-memory.xml
index 49980a60..ffb2cac0 100644
--- a/src/libical-glib/api/i-cal-memory.xml
+++ b/src/libical-glib/api/i-cal-memory.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Memory">
<method name="i_cal_memory_tmp_buffer" corresponds="icalmemory_tmp_buffer" since="1.0">
diff --git a/src/libical-glib/api/i-cal-mime.xml b/src/libical-glib/api/i-cal-mime.xml
index 2fa40f9f..f2b1ff3c 100644
--- a/src/libical-glib/api/i-cal-mime.xml
+++ b/src/libical-glib/api/i-cal-mime.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Mime">
<declaration position="header">/**
diff --git a/src/libical-glib/api/i-cal-parameter.xml b/src/libical-glib/api/i-cal-parameter.xml
index c8bddb91..a3a6f919 100644
--- a/src/libical-glib/api/i-cal-parameter.xml
+++ b/src/libical-glib/api/i-cal-parameter.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Parameter" native="icalparameter" destroy_func="icalparameter_free">
<method name="i_cal_parameter_new" corresponds="icalparameter_new" kind="constructor" since="1.0">
@@ -61,7 +53,7 @@
</method>
<method name="i_cal_parameter_get_xname" corresponds="icalparameter_get_xname" kind="get" since="1.0">
<parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve">Gets the xname property of the native part of the #ICalParameter.</comment>
</method>
<method name="i_cal_parameter_set_xvalue" corresponds="icalparameter_set_xvalue" kind="set" since="1.0">
@@ -71,7 +63,7 @@
</method>
<method name="i_cal_parameter_get_xvalue" corresponds="icalparameter_get_xvalue" kind="get" since="1.0">
<parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve">Gets the xvalue property of the native part of the #ICalParameter.</comment>
</method>
<method name="i_cal_parameter_set_iana_name" corresponds="icalparameter_set_iana_name" kind="set" since="1.0">
@@ -81,7 +73,7 @@
</method>
<method name="i_cal_parameter_get_iana_name" corresponds="icalparameter_get_iana_name" kind="get" since="1.0">
<parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve">Gets the iana_name property of the native part of the #ICalParameter.</comment>
</method>
<method name="i_cal_parameter_set_iana_value" corresponds="icalparameter_set_iana_value" kind="set" since="1.0">
@@ -91,7 +83,7 @@
</method>
<method name="i_cal_parameter_get_iana_value" corresponds="icalparameter_get_iana_value" kind="get" since="1.0">
<parameter type="ICalParameter *" name="param" comment="The #ICalParameter to be queried"/>
- <returns type="const gchar *" annotation="allow-none" comment="The property of the @value" />
+ <returns type="const gchar *" annotation="nullable" comment="The property of the @value" />
<comment xml:space="preserve">Gets the iana_value property of the native part of the #ICalParameter.</comment>
</method>
<method name="i_cal_parameter_has_same_name" corresponds="icalparameter_has_same_name" kind="others" since="1.0">
diff --git a/src/libical-glib/api/i-cal-parser.xml b/src/libical-glib/api/i-cal-parser.xml
index 7e901de2..7bca47fa 100644
--- a/src/libical-glib/api/i-cal-parser.xml
+++ b/src/libical-glib/api/i-cal-parser.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Parser" native="icalparser" destroy_func="icalparser_free">
<enum name="ICalParserState" native_name="icalparserstate" default_native="I_CAL_PARSER_ERROR">
@@ -36,13 +28,13 @@ typedef gchar *(*ICalParserLineGenFunc)(gchar *bytes, size_t size, gpointer user
</method>
<method name="i_cal_parser_add_line" corresponds="icalparser_add_line" since="1.0">
<parameter type="ICalParser *" name="parser" annotation="in, transfer full" comment="The #ICalParser used to parse the string into the #ICalComponent"/>
- <parameter type="gchar *" name="str" annotation="allow-none, transfer none" comment="A line of string representation of the #ICalComponent"/>
- <returns type="ICalComponent *" annotation="allow-none, transfer full" translator_argus="(gpointer) parser" comment="The complete #ICalComponent."/>
+ <parameter type="gchar *" name="str" annotation="nullable, transfer none" comment="A line of string representation of the #ICalComponent"/>
+ <returns type="ICalComponent *" annotation="nullable, transfer full" translator_argus="(gpointer) parser" comment="The complete #ICalComponent."/>
<comment xml:space="preserve">Add a line at one time into the #ICalParser until the parsing is complete and #ICalComponent will be returned.</comment>
</method>
<method name="i_cal_parser_clean" corresponds="icalparser_clean" since="1.0">
<parameter type="ICalParser *" name="parser" comment="The parser to be cleaned and queried"/>
- <returns type="ICalComponent *" annotation="allow-none, transfer full" translator_argus="(gpointer) parser" comment="The root #ICalComponent in @parser."/>
+ <returns type="ICalComponent *" annotation="nullable, transfer full" translator_argus="(gpointer) parser" comment="The root #ICalComponent in @parser."/>
<comment xml:space="preserve">We won't get a clean exit if some components did not have an "END" tag. Clear off any component that may be left in the list.</comment>
</method>
<method name="i_cal_parser_get_state" corresponds="icalparser_get_state" kind="get" since="1.0">
diff --git a/src/libical-glib/api/i-cal-period.xml b/src/libical-glib/api/i-cal-period.xml
index 1b02bbc6..8e3fc2ca 100644
--- a/src/libical-glib/api/i-cal-period.xml
+++ b/src/libical-glib/api/i-cal-period.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Period" native="struct icalperiodtype" is_bare="true" default_native="icalperiodtype_null_period ()">
<method name="i_cal_period_get_start" corresponds="CUSTOM" kind="get" since="1.0">
diff --git a/src/libical-glib/api/i-cal-property.xml b/src/libical-glib/api/i-cal-property.xml
index 4d4151a7..5e874b66 100644
--- a/src/libical-glib/api/i-cal-property.xml
+++ b/src/libical-glib/api/i-cal-property.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Property" native="icalproperty" destroy_func="icalproperty_free">
<method name="i_cal_property_new" corresponds="icalproperty_new" kind="constructor" since="1.0">
diff --git a/src/libical-glib/api/i-cal-recur-iterator.xml b/src/libical-glib/api/i-cal-recur-iterator.xml
index 032c4257..7e0ad916 100644
--- a/src/libical-glib/api/i-cal-recur-iterator.xml
+++ b/src/libical-glib/api/i-cal-recur-iterator.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="RecurIterator" native="icalrecur_iterator" destroy_func="icalrecur_iterator_free">
<method name="i_cal_recur_iterator_new" corresponds="icalrecur_iterator_new" kind="constructor" since="1.0">
diff --git a/src/libical-glib/api/i-cal-recur.xml b/src/libical-glib/api/i-cal-recur.xml
index 870ea61b..e1d689b4 100644
--- a/src/libical-glib/api/i-cal-recur.xml
+++ b/src/libical-glib/api/i-cal-recur.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Recur">
<method name="i_cal_recur_expand_recurrence" corresponds="CUSTOM" since="1.0">
diff --git a/src/libical-glib/api/i-cal-recurrence.xml b/src/libical-glib/api/i-cal-recurrence.xml
index 0ebb4545..ce019dd4 100644
--- a/src/libical-glib/api/i-cal-recurrence.xml
+++ b/src/libical-glib/api/i-cal-recurrence.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Recurrence" native="struct icalrecurrencetype" is_bare="true" default_native="i_cal_recurrence_new_default ()">
<enum name="ICalRecurrenceFrequency" native_name="icalrecurrencetype_frequency" default_native="I_CAL_NO_RECURRENCE">
diff --git a/src/libical-glib/api/i-cal-reqstat.xml b/src/libical-glib/api/i-cal-reqstat.xml
index 738c8a32..dbbdd061 100644
--- a/src/libical-glib/api/i-cal-reqstat.xml
+++ b/src/libical-glib/api/i-cal-reqstat.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Reqstat" native="struct icalreqstattype" is_bare="true" default_native="i_cal_reqstat_new_default ()">
<method name="i_cal_reqstat_new_from_string" corresponds="icalreqstattype_from_string" kind="constructor" since="1.0">
diff --git a/src/libical-glib/api/i-cal-restriction.xml b/src/libical-glib/api/i-cal-restriction.xml
index 5bc4fe40..77fb117f 100644
--- a/src/libical-glib/api/i-cal-restriction.xml
+++ b/src/libical-glib/api/i-cal-restriction.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Restriction">
<enum name="ICalRestrictionKind" native_name="icalrestriction_kind" default_native="I_CAL_RESTRICTION_UNKNOWN">
diff --git a/src/libical-glib/api/i-cal-time-span.xml b/src/libical-glib/api/i-cal-time-span.xml
index 4c2aae18..ca8cfe9e 100644
--- a/src/libical-glib/api/i-cal-time-span.xml
+++ b/src/libical-glib/api/i-cal-time-span.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="TimeSpan" native="struct icaltime_span" is_bare="true" default_native="icaltime_span_new(icaltime_null_time(), icaltime_null_time(), 0)" includes="libical-glib/i-cal-time.h">
<method name="i_cal_time_span_new_timet" corresponds="CUSTOM" kind="constructor" since="3.0.5">
diff --git a/src/libical-glib/api/i-cal-time.xml b/src/libical-glib/api/i-cal-time.xml
index be6e2685..678be801 100644
--- a/src/libical-glib/api/i-cal-time.xml
+++ b/src/libical-glib/api/i-cal-time.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Time" native="struct icaltimetype" is_bare="true" default_native="icaltime_null_time()">
<method name="i_cal_time_new" corresponds="CUSTOM" kind="constructor" since="1.0">
@@ -86,7 +78,7 @@
<method name="i_cal_time_get_timezone" corresponds="(void *)icaltime_get_timezone" kind="get" since="1.0">
<parameter type="const ICalTime *" name="tt" annotation="in, transfer none" comment="The #ICalTime to be queried"/>
<returns type="ICalTimezone *" annotation="transfer none" translator_argus="(GObject *)tt, TRUE" comment="The timezone information" />
- <comment xml:space="preserve">Returns the timezone.</comment>
+ <comment xml:space="preserve">Returns the timezone, the #ICalTimezone object is cached and can be either unreferenced once the last instance is used or can be kept until i_cal_object_free_global_objects() is called (usually at the very end of the program).</comment>
</method>
<method name="i_cal_time_set_timezone" corresponds="icaltime_set_timezone" kind="set" since="1.0">
<parameter type="ICalTime *" name="tt" native_op="POINTER" comment="The #ICalTime"/>
@@ -95,7 +87,7 @@
</method>
<method name="i_cal_time_get_tzid" corresponds="icaltime_get_tzid" kind="get" since="1.0">
<parameter type="const ICalTime *" name="tt" annotation="in, transfer none" comment="The #ICalTime to be queried"/>
- <returns type="const gchar *" annotation="allow-none, transfer none" comment="The tzid of #ICalTime, or NULL if floating type" />
+ <returns type="const gchar *" annotation="nullable, transfer none" comment="The tzid of #ICalTime, or NULL if floating type" />
<comment xml:space="preserve">Returns the tzid, or NULL for a floating time.</comment>
</method>
<method name="i_cal_time_day_of_year" corresponds="icaltime_day_of_year" since="1.0">
@@ -143,7 +135,7 @@
<parameter type="const ICalTime *" name="a" annotation="in, transfer none" comment="The #ICalTime to be compared"/>
<parameter type="const ICalTime *" name="b" annotation="in, transfer none" comment="The #ICalTime to be compared"/>
<returns type="gint" comment="-1, 0, or 1 to indicate that a less than b, a==b or a larger than b." />
- <comment xml:space="preserve">Returns -1, 0, or 1 to indicate that a less than b, a==b or a larger than b.</comment>
+ <comment xml:space="preserve">i_cal_time_compare returns an integer indicating the result of the comparison, as follow:</comment>
</method>
<method name="i_cal_time_compare_date_only" corresponds="icaltime_compare_date_only" since="1.0">
<parameter type="const ICalTime *" name="a" annotation="in, transfer none" comment="The #ICalTime to be compared"/>
diff --git a/src/libical-glib/api/i-cal-timezone.xml b/src/libical-glib/api/i-cal-timezone.xml
index dfa4140d..0de66874 100644
--- a/src/libical-glib/api/i-cal-timezone.xml
+++ b/src/libical-glib/api/i-cal-timezone.xml
@@ -1,21 +1,13 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Timezone" native="icaltimezone" is_possible_global="true" destroy_func="i_cal_timezone_destroy">
<method name="i_cal_timezone_new" corresponds="icaltimezone_new" kind="constructor" since="1.0">
- <returns type="ICalTimezone *" annotation="transfer full, allow-none" translator="i_cal_timezone_new_full" translator_argus="NULL, FALSE" comment="The newly created object of the type #ICalTimezone." />
+ <returns type="ICalTimezone *" annotation="transfer full, nullable" translator="i_cal_timezone_new_full" translator_argus="NULL, FALSE" comment="The newly created object of the type #ICalTimezone." />
<comment xml:space="preserve">The constructor of the type #ICalTimezone.</comment>
</method>
<method name="i_cal_timezone_destroy" corresponds="CUSTOM" annotation="skip" kind="private" since="1.0">
diff --git a/src/libical-glib/api/i-cal-trigger.xml b/src/libical-glib/api/i-cal-trigger.xml
index 6d3d1ffb..81cc19ec 100644
--- a/src/libical-glib/api/i-cal-trigger.xml
+++ b/src/libical-glib/api/i-cal-trigger.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Trigger" native="struct icaltriggertype" is_bare="true" default_native="icaltriggertype_from_int (0)">
<method name="i_cal_trigger_new_from_int" corresponds="icaltriggertype_from_int" kind="constructor" since="1.0">
diff --git a/src/libical-glib/api/i-cal-unknowntokenhandling.xml b/src/libical-glib/api/i-cal-unknowntokenhandling.xml
index 5c08c7ba..7d656224 100644
--- a/src/libical-glib/api/i-cal-unknowntokenhandling.xml
+++ b/src/libical-glib/api/i-cal-unknowntokenhandling.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Unknowntokenhandling">
<enum name="ICalUnknowntokenhandling" native_name="ical_unknown_token_handling" default_native="0">
diff --git a/src/libical-glib/api/i-cal-value.xml b/src/libical-glib/api/i-cal-value.xml
index adfaf2a9..c7cf2c6e 100644
--- a/src/libical-glib/api/i-cal-value.xml
+++ b/src/libical-glib/api/i-cal-value.xml
@@ -1,17 +1,9 @@
<!--
- Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
- This library is free software: you can redistribute it and/or modify it
- under the terms of version 2.1. of the GNU Lesser General Public License
- as published by the Free Software Foundation.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- This library is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
-->
<structure namespace="ICal" name="Value" native="icalvalue" destroy_func="icalvalue_free" includes="string.h">
<method name="i_cal_value_new" corresponds="icalvalue_new" kind="constructor" since="1.0">
@@ -78,7 +70,7 @@ be cloned."/>
</method>
<method name="i_cal_value_encode_ical_string" corresponds="CUSTOM" since="1.0">
<parameter type="const gchar *" name="szText" comment="A string"/>
- <returns type="gchar *" annotation="allow-none, transfer full" comment="The encoded string. NULL if fail."/>
+ <returns type="gchar *" annotation="nullable, transfer full" comment="The encoded string. NULL if fail."/>
<comment xml:space="preserve">Encodes a character string in ical format, escape certain characters, etc.</comment>
<custom> gchar *szEncText;
gchar *buffer = NULL;
@@ -99,7 +91,7 @@ be cloned."/>
</method>
<method name="i_cal_value_decode_ical_string" corresponds="CUSTOM" since="1.0">
<parameter type="const gchar *" name="szText" comment="A string"/>
- <returns type="gchar *" annotation="allow-none, transfer full" comment="The decoded string. NULL if fail."/>
+ <returns type="gchar *" annotation="nullable, transfer full" comment="The decoded string. NULL if fail."/>
<comment xml:space="preserve">Extracts the original character string encoded by the above function.</comment>
<custom> gchar *szDecText;
gchar *buffer = NULL;
diff --git a/src/libical-glib/i-cal-object.c.in b/src/libical-glib/i-cal-object.c.in
index 4b2fa34e..95ab14b4 100644
--- a/src/libical-glib/i-cal-object.c.in
+++ b/src/libical-glib/i-cal-object.c.in
@@ -1,17 +1,7 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifdef HAVE_CONFIG_H
@@ -107,6 +97,7 @@ typedef struct
gpointer native;
GDestroyNotify native_destroy_func;
gboolean is_global_memory;
+ gboolean always_destroy;
GObject *owner;
GSList *dependers; /* referenced GObject-s */
} ICalObjectPrivate;
@@ -122,6 +113,7 @@ enum
PROP_NATIVE,
PROP_NATIVE_DESTROY_FUNC,
PROP_IS_GLOBAL_MEMORY,
+ PROP_ALWAYS_DESTROY,
PROP_OWNER
};
@@ -149,6 +141,10 @@ static void i_cal_object_set_property(GObject *object, guint property_id,
priv->is_global_memory = g_value_get_boolean(value);
return;
+ case PROP_ALWAYS_DESTROY:
+ i_cal_object_set_always_destroy(iobject, g_value_get_boolean(value));
+ return;
+
case PROP_OWNER:
i_cal_object_set_owner(iobject, g_value_get_object(value));
return;
@@ -177,6 +173,10 @@ static void i_cal_object_get_property(GObject *object, guint property_id,
g_value_set_boolean(value, i_cal_object_get_is_global_memory(iobject));
return;
+ case PROP_ALWAYS_DESTROY:
+ g_value_set_boolean(value, i_cal_object_get_always_destroy(iobject));
+ return;
+
case PROP_OWNER:
g_value_take_object(value, i_cal_object_ref_owner(iobject));
return;
@@ -190,7 +190,8 @@ static void i_cal_object_finalize(GObject *object)
ICalObject *iobject = I_CAL_OBJECT(object);
ICalObjectPrivate *priv = i_cal_object_get_instance_private(iobject);
- if (!priv->owner && !priv->is_global_memory &&
+ if ((priv->always_destroy || !priv->owner) &&
+ !priv->is_global_memory &&
priv->native && priv->native_destroy_func) {
g_clear_pointer(&priv->native, priv->native_destroy_func);
}
@@ -264,6 +265,25 @@ static void i_cal_object_class_init(ICalObjectClass * class)
G_PARAM_STATIC_STRINGS));
/**
+ * ICalObject:always-destroy:
+ *
+ * Whether free the native libical structure on #ICalObject's finalize even
+ * if the object has set an owner.
+ *
+ * Since: 3.0.11
+ **/
+ g_object_class_install_property(
+ object_class,
+ PROP_ALWAYS_DESTROY,
+ g_param_spec_boolean(
+ "always-destroy",
+ "Always-Destroy",
+ "Whether the native libical structure is freed even when the owner is set",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS));
+
+ /**
* ICalObject:owner:
*
* Owner of the native libical structure. If set, then it is
@@ -294,7 +314,7 @@ static void i_cal_object_init(ICalObject *iobject)
* @native: a native libical structure
* @native_destroy_func: a function to be called on @native when it should be freed
* @is_global_memory: whether @native is a global shared memory structure
- * @owner: (allow-none): an owner of @native
+ * @owner: (nullable): an owner of @native
*
* Creates an #ICalObject descendant of type @type and initialize private members
* of it. The descendants should call this function in their _new() function, or use
@@ -556,8 +576,8 @@ void i_cal_object_set_owner(ICalObject *iobject, GObject *owner)
* if not NULL, is referenced for thread safety. Unref it with g_object_unref
* when done with it.
*
- * Returns: (transfer full) (allow-none): Current owner of the libical
- * native structure. returns NULL, when there is no owner.
+ * Returns: (transfer full) (nullable): Current owner of the libical
+ * native structure. Returns %NULL when there is no owner.
*
* Since: 1.0
**/
@@ -663,3 +683,58 @@ void i_cal_object_remove_depender(ICalObject *iobject, GObject *depender)
UNLOCK_PROPS(priv);
}
+
+/**
+ * i_cal_object_set_always_destroy:
+ * @iobject: an #ICalObject
+ * @value: value to set
+ *
+ * Sets the @ICalObject::always-destroy property value. When %TRUE, the native
+ * libical structure is always freed, even when an owner of the @iobject is set.
+ *
+ * Since: 3.0.11
+ **/
+void i_cal_object_set_always_destroy(ICalObject *iobject, gboolean value)
+{
+ ICalObjectPrivate *priv = i_cal_object_get_instance_private(iobject);
+ gboolean changed;
+
+ g_return_if_fail(I_CAL_IS_OBJECT(iobject));
+
+ LOCK_PROPS(priv);
+
+ changed = (value ? 1 : 0) != (priv->always_destroy ? 1 : 0);
+ if (changed)
+ priv->always_destroy = value;
+
+ UNLOCK_PROPS(priv);
+
+ if (changed)
+ g_object_notify(G_OBJECT(iobject), "always-destroy");
+}
+
+/**
+ * i_cal_object_get_always_destroy:
+ * @iobject: an #ICalObject
+ *
+ * Obtain the @ICalObject::always-destroy property value.
+ *
+ * Returns: Whether the native libical structure is freed even when an owner is set.
+ *
+ * Since: 3.0.11
+ **/
+gboolean i_cal_object_get_always_destroy(ICalObject *iobject)
+{
+ ICalObjectPrivate *priv = i_cal_object_get_instance_private(iobject);
+ gboolean value;
+
+ g_return_val_if_fail(I_CAL_IS_OBJECT(iobject), FALSE);
+
+ LOCK_PROPS(priv);
+
+ value = priv->always_destroy;
+
+ UNLOCK_PROPS(priv);
+
+ return value;
+}
diff --git a/src/libical-glib/i-cal-object.h.in b/src/libical-glib/i-cal-object.h.in
index 799e3112..9803b5c2 100644
--- a/src/libical-glib/i-cal-object.h.in
+++ b/src/libical-glib/i-cal-object.h.in
@@ -1,17 +1,7 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#if !defined (__LIBICAL_GLIB_H_INSIDE__) && !defined (LIBICAL_GLIB_COMPILATION)
@@ -77,6 +67,10 @@ LIBICAL_ICAL_EXPORT void i_cal_object_add_depender(ICalObject *iobject, GObject
LIBICAL_ICAL_EXPORT void i_cal_object_remove_depender(ICalObject *iobject, GObject *depender);
+LIBICAL_ICAL_EXPORT void i_cal_object_set_always_destroy(ICalObject *iobject, gboolean value);
+
+LIBICAL_ICAL_EXPORT gboolean i_cal_object_get_always_destroy(ICalObject *iobject);
+
LIBICAL_ICAL_EXPORT void i_cal_object_free_global_objects(void);
G_END_DECLS
diff --git a/src/libical-glib/libical-glib.pc.in b/src/libical-glib/libical-glib.pc.in
index e164cfb5..8938834f 100644
--- a/src/libical-glib/libical-glib.pc.in
+++ b/src/libical-glib/libical-glib.pc.in
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright Contributors to the libical project
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
diff --git a/src/libical-glib/tools/generator.c b/src/libical-glib/tools/generator.c
index 609c9297..d1d3fc23 100644
--- a/src/libical-glib/tools/generator.c
+++ b/src/libical-glib/tools/generator.c
@@ -1,16 +1,7 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#include "generator.h"
@@ -1575,13 +1566,39 @@ gchar *get_translator_for_return(Ret *ret)
return res;
}
+static gboolean parameter_is_out(Parameter *para)
+{
+ GList *link;
+ for (link = para->annotations; link; link = g_list_next(link)) {
+ if (g_strcmp0(link->data, "out") == 0 ||
+ g_strcmp0(link->data, "inout") == 0 ||
+ g_str_has_prefix(link->data, "out ")) {
+ break;
+ }
+ }
+
+ return link != NULL;
+}
+
static gboolean annotation_contains_nullable(GList *annotations) /* gchar * */
{
GList *link;
for (link = annotations; link; link = g_list_next(link)) {
- if (g_strcmp0(link->data, "allow-none") == 0 ||
- g_strcmp0(link->data, "nullable") == 0) {
+ if (g_strcmp0(link->data, "nullable") == 0) {
+ break;
+ }
+ }
+
+ return link != NULL;
+}
+
+static gboolean annotation_contains_optional(GList *annotations) /* gchar * */
+{
+ GList *link;
+
+ for (link = annotations; link; link = g_list_next(link)) {
+ if (g_strcmp0(link->data, "optional") == 0) {
break;
}
}
@@ -2033,6 +2050,7 @@ gchar *get_source_run_time_checkers(Method *method, const gchar *namespace)
gchar *defaultValue;
gchar *retTrueType;
guint namespace_len;
+ gboolean param_is_out;
g_return_val_if_fail(method != NULL, NULL);
g_return_val_if_fail(namespace != NULL && *namespace != '\0', NULL);
@@ -2095,7 +2113,10 @@ gchar *get_source_run_time_checkers(Method *method, const gchar *namespace)
(void)g_stpcpy(buffer + strlen(buffer), "\n");
}
- if (i != namespace_len && !annotation_contains_nullable(parameter->annotations)) {
+ param_is_out = parameter_is_out(parameter);
+ if (i != namespace_len && (
+ (!param_is_out && !annotation_contains_nullable(parameter->annotations)) ||
+ (param_is_out && !annotation_contains_optional(parameter->annotations)))) {
(void)g_stpcpy(buffer + strlen(buffer), "\t");
if (method->ret != NULL) {
(void)g_stpcpy(buffer + strlen(buffer), "g_return_val_if_fail (");
diff --git a/src/libical-glib/tools/generator.h b/src/libical-glib/tools/generator.h
index 4aa14693..31a4ea35 100644
--- a/src/libical-glib/tools/generator.h
+++ b/src/libical-glib/tools/generator.h
@@ -1,16 +1,7 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifndef GENERATOR_H
diff --git a/src/libical-glib/tools/header-forward-declarations-template b/src/libical-glib/tools/header-forward-declarations-template
index 7ea06c29..95de7492 100644
--- a/src/libical-glib/tools/header-forward-declarations-template
+++ b/src/libical-glib/tools/header-forward-declarations-template
@@ -1,19 +1,9 @@
/* Generated file (by generator) */
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#if !defined (__LIBICAL_GLIB_H_INSIDE__) && !defined (LIBICAL_GLIB_COMPILATION)
diff --git a/src/libical-glib/tools/header-header-template b/src/libical-glib/tools/header-header-template
index 9dde6369..b19012c2 100644
--- a/src/libical-glib/tools/header-header-template
+++ b/src/libical-glib/tools/header-header-template
@@ -1,19 +1,9 @@
/* Generated file (by generator) */
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifndef LIBICAL_GLIB_H
@@ -21,10 +11,6 @@
#include <glib-object.h>
-#if !defined(LIBICAL_GLIB_UNSTABLE_API) && !defined(LIBICAL_GLIB_COMPILATION)
-#error "Define LIBICAL_GLIB_UNSTABLE_API, to indicate it's understood the libical-glib API is currently unstable"
-#endif
-
#define __LIBICAL_GLIB_H_INSIDE__
#include <libical-glib/i-cal-forward-declarations.h>
diff --git a/src/libical-glib/tools/header-template b/src/libical-glib/tools/header-template
index f4edf16f..a51c7331 100644
--- a/src/libical-glib/tools/header-template
+++ b/src/libical-glib/tools/header-template
@@ -1,19 +1,9 @@
/* Generated file (by generator) */
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#if !defined (__LIBICAL_GLIB_H_INSIDE__) && !defined (LIBICAL_GLIB_COMPILATION)
diff --git a/src/libical-glib/tools/source-template b/src/libical-glib/tools/source-template
index 8b71354e..4a354b2c 100644
--- a/src/libical-glib/tools/source-template
+++ b/src/libical-glib/tools/source-template
@@ -1,19 +1,9 @@
/* Generated file (by generator) */
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software: you can redistribute it and/or modify it
- * under the terms of version 2.1. of the GNU Lesser General Public License
- * as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General 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 <https://www.gnu.org/licenses/>.
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifdef HAVE_CONFIG_H
diff --git a/src/libical-glib/tools/xml-parser.c b/src/libical-glib/tools/xml-parser.c
index a9cf2704..76e39b7f 100644
--- a/src/libical-glib/tools/xml-parser.c
+++ b/src/libical-glib/tools/xml-parser.c
@@ -1,16 +1,7 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#include "xml-parser.h"
diff --git a/src/libical-glib/tools/xml-parser.h b/src/libical-glib/tools/xml-parser.h
index bccbb4d3..403c40c0 100644
--- a/src/libical-glib/tools/xml-parser.h
+++ b/src/libical-glib/tools/xml-parser.h
@@ -1,16 +1,8 @@
/*
- * Copyright (C) 2015 William Yu <williamyu@gnome.org>
+ * SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
*/
#ifndef XML_PARSER_H
diff --git a/src/libical/CMakeLists.txt b/src/libical/CMakeLists.txt
index 9c7266b4..f53413a1 100644
--- a/src/libical/CMakeLists.txt
+++ b/src/libical/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_definitions(-Dlibical_ical_EXPORTS)
configure_file(
@@ -6,12 +9,20 @@ configure_file(
@ONLY
)
+configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/icaltime.h.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/icaltime.h
+)
+
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/src
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
)
+if(LIBICAL_DEVMODE_MEMORY_CONSISTENCY)
+ include_directories(${CMAKE_SOURCE_DIR}/src/test)
+endif()
if(ICU_FOUND)
include_directories(${ICU_INCLUDE_DIRS})
@@ -42,6 +53,7 @@ add_custom_command(
DEPENDS
${PROPERTYDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedproperty.h.in
+ COMMENT "Generate icalderivedproperty.h"
)
list(APPEND BUILT_HEADERS ${CMAKE_BINARY_DIR}/src/libical/icalderivedproperty.h)
@@ -57,6 +69,7 @@ add_custom_command(
DEPENDS
${PROPERTYDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedproperty.c.in
+ COMMENT "Generate icalderivedproperty.c"
)
list(APPEND BUILT_SOURCES ${CMAKE_BINARY_DIR}/src/libical/icalderivedproperty.c)
@@ -76,6 +89,7 @@ add_custom_command(
DEPENDS
${PARAMETERDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedparameter.h.in
+ COMMENT "Generate icalderivedparameter.h"
)
list(APPEND BUILT_HEADERS ${CMAKE_BINARY_DIR}/src/libical/icalderivedparameter.h)
@@ -90,6 +104,7 @@ add_custom_command(
DEPENDS
${PARAMETERDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedparameter.c.in
+ COMMENT "Generate icalderivedparameter.c"
)
list(APPEND BUILT_SOURCES ${CMAKE_BINARY_DIR}/src/libical/icalderivedparameter.c)
@@ -109,6 +124,7 @@ add_custom_command(
DEPENDS
${RESTRICTIONDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalrestriction.c.in
+ COMMENT "Generate icalrestriction.c"
)
list(APPEND BUILT_SOURCES ${CMAKE_BINARY_DIR}/src/libical/icalrestriction.c)
@@ -128,6 +144,7 @@ add_custom_command(
DEPENDS
${VALUEDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedvalue.h.in
+ COMMENT "Generate icalderivedvalue.h"
)
list(APPEND BUILT_HEADERS ${CMAKE_BINARY_DIR}/src/libical/icalderivedvalue.h)
@@ -142,6 +159,7 @@ add_custom_command(
DEPENDS
${VALUEDEPS}
${CMAKE_SOURCE_DIR}/src/libical/icalderivedvalue.c.in
+ COMMENT "Generate icalderivedvalue.c"
)
list(APPEND BUILT_SOURCES ${CMAKE_BINARY_DIR}/src/libical/icalderivedvalue.c)
@@ -156,6 +174,7 @@ endif()
add_custom_target(
ical-header ALL
DEPENDS ${CMAKE_BINARY_DIR}/src/libical/ical.h
+ COMMENT "Target to generate the aggregate ical.h header"
)
# GObject Introspection
@@ -243,6 +262,9 @@ set(ical_LIB_SRCS
caldate.c
astime.h
)
+if(LIBICAL_DEVMODE_MEMORY_CONSISTENCY)
+ list(APPEND ical_LIB_SRCS ${PROJECT_SOURCE_DIR}/src/test/test-malloc.c)
+endif()
add_custom_command(
OUTPUT
@@ -254,6 +276,7 @@ add_custom_command(
-DICAL_FILE_H_FILE:FILEPATH=${CMAKE_BINARY_DIR}/src/libical/ical.h
-P ${CMAKE_CURRENT_SOURCE_DIR}/ical_file.cmake
DEPENDS ${ical_LIB_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/ical_file.cmake
+ COMMENT "Generate the aggregate ical.h header"
)
add_library(ical ${LIBRARY_TYPE} ${ical_LIB_SRCS})
@@ -265,8 +288,11 @@ elseif(STATIC_ONLY)
add_library(ical-static ALIAS ical)
endif()
-target_link_libraries(ical ${CMAKE_THREAD_LIBS_INIT})
+target_include_directories(ical INTERFACE "$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>")
+if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(ical ${CMAKE_THREAD_LIBS_INIT})
+endif()
if(ICU_FOUND)
target_link_libraries(ical ${ICU_LIBRARIES})
endif()
@@ -332,7 +358,10 @@ if(WITH_CXX_BINDINGS)
elseif(STATIC_ONLY)
add_library(ical_cxx-static ALIAS ical_cxx)
endif()
- target_link_libraries(ical_cxx ical ${CMAKE_THREAD_LIBS_INIT})
+ target_link_libraries(ical_cxx ical)
+ if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(ical_cxx ${CMAKE_THREAD_LIBS_INIT})
+ endif()
if(MSVC)
set_target_properties(ical_cxx PROPERTIES PREFIX "lib")
@@ -393,7 +422,7 @@ install(FILES
icalproperty.h
icalrecur.h
icalrestriction.h
- icaltime.h
+ ${CMAKE_BINARY_DIR}/src/libical/icaltime.h
icaltz-util.h
icaltimezone.h
icaltypes.h
diff --git a/src/libical/astime.h b/src/libical/astime.h
index 8c537b0a..f89ddf67 100644
--- a/src/libical/astime.h
+++ b/src/libical/astime.h
@@ -44,19 +44,10 @@
*/
/*======================================================================
- (C) COPYRIGHT 2018, Markus Minichmayr
+ SPDX-FileCopyrightText: 2018, Markus Minichmayr
https://tapkey.com
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: http://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at http://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
========================================================================*/
/**
diff --git a/src/libical/caldate.c b/src/libical/caldate.c
index c62a1aa8..a04bc8b1 100644
--- a/src/libical/caldate.c
+++ b/src/libical/caldate.c
@@ -3,7 +3,7 @@
* needs of the libical project. The original copyright notice is as follows:
*/
/*
- * Copyright (c) 1986-2000, Hiram Clawson
+ * Copyright (c) 1986-2000, Hiram Clawson
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
@@ -22,7 +22,7 @@
* Neither name of The Museum of Hiram nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior
- * written permission.
+ * written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
@@ -35,7 +35,7 @@
* 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.
+ * THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* The modifications made are licensed as follows (to distinguish between
@@ -44,22 +44,12 @@
*/
/*======================================================================
- (C) COPYRIGHT 2018, Markus Minichmayr
+ SPDX-FileCopyrightText: 2018, Markus Minichmayr
https://tapkey.com
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: http://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at http://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
========================================================================*/
-
#include "astime.h" /* time structures */
/**
diff --git a/src/libical/ical_file.cmake b/src/libical/ical_file.cmake
index e1db0cc8..59e96d77 100644
--- a/src/libical/ical_file.cmake
+++ b/src/libical/ical_file.cmake
@@ -1,8 +1,11 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
# ORDERING OF HEADERS IS SIGNIFICANT. Don't change this ordering.
# It is required to make the combined header ical.h properly.
set(COMBINEDHEADERSICAL
${TOPB}/src/libical/icalversion.h
- ${TOPS}/src/libical/icaltime.h
+ ${TOPB}/src/libical/icaltime.h
${TOPS}/src/libical/icalduration.h
${TOPS}/src/libical/icalperiod.h
${TOPS}/src/libical/icalenums.h
diff --git a/src/libical/icalarray.c b/src/libical/icalarray.c
index 58c545d2..a472c3a0 100644
--- a/src/libical/icalarray.c
+++ b/src/libical/icalarray.c
@@ -2,18 +2,10 @@
FILE: icalarray.c
CREATOR: Damon Chaplin 07 March 2001
- (C) COPYRIGHT 2001, Ximian, Inc.
+ SPDX-FileCopyrightText: 2001, Ximian, Inc.
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -22,6 +14,7 @@
#include "icalarray.h"
#include "icalerror.h"
+#include "icalmemory.h"
#include "qsort_gen.h"
#include <stdlib.h>
@@ -33,7 +26,7 @@ icalarray *icalarray_new(size_t element_size, size_t increment_size)
{
icalarray *array;
- array = (icalarray *) malloc(sizeof(icalarray));
+ array = (icalarray *) icalmemory_new_buffer(sizeof(icalarray));
if (!array) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return NULL;
@@ -50,7 +43,7 @@ icalarray *icalarray_new(size_t element_size, size_t increment_size)
static void *icalarray_alloc_chunk(icalarray *array)
{
- void *chunk = malloc(array->element_size * array->increment_size);
+ void *chunk = icalmemory_new_buffer(array->element_size * array->increment_size);
if (!chunk) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
@@ -68,23 +61,30 @@ icalarray *icalarray_copy(icalarray *originalarray)
return NULL;
}
- array->num_elements = originalarray->num_elements;
- array->space_allocated = originalarray->space_allocated;
-
- array->chunks = malloc(chunks * sizeof(void *));
+ array->chunks = icalmemory_new_buffer(chunks * sizeof(void *));
if (array->chunks) {
for (chunk = 0; chunk < chunks; chunk++) {
array->chunks[chunk] = icalarray_alloc_chunk(array);
if (array->chunks[chunk]) {
memcpy(array->chunks[chunk], originalarray->chunks[chunk],
array->increment_size * array->element_size);
+
+ array->space_allocated += array->increment_size;
+ } else {
+ icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ icalarray_free(array);
+ return NULL;
}
}
} else {
icalerror_set_errno(ICAL_ALLOCATION_ERROR);
+ icalarray_free(array);
+ return NULL;
}
+ array->num_elements = originalarray->num_elements;
+
return array;
}
@@ -95,12 +95,12 @@ void icalarray_free(icalarray *array)
size_t chunk;
for (chunk = 0; chunk < chunks; chunk++) {
- free(array->chunks[chunk]);
+ icalmemory_free_buffer(array->chunks[chunk]);
}
- free(array->chunks);
+ icalmemory_free_buffer(array->chunks);
array->chunks = 0;
}
- free(array);
+ icalmemory_free_buffer(array);
}
void icalarray_append(icalarray *array, const void *element)
@@ -109,6 +109,10 @@ void icalarray_append(icalarray *array, const void *element)
if (array->num_elements >= array->space_allocated) {
icalarray_expand(array, 1);
+ if (array->num_elements >= array->space_allocated) {
+ /* expansion failed. Error has already been set. */
+ return;
+ }
}
pos = array->num_elements++;
@@ -180,7 +184,7 @@ static void icalarray_expand(icalarray *array, size_t space_needed)
num_new_chunks = 1;
}
- new_chunks = malloc((num_chunks + num_new_chunks) * sizeof(void *));
+ new_chunks = icalmemory_new_buffer((num_chunks + num_new_chunks) * sizeof(void *));
if (new_chunks) {
if (array->chunks && num_chunks) {
@@ -188,9 +192,13 @@ static void icalarray_expand(icalarray *array, size_t space_needed)
}
for (c = 0; c < num_new_chunks; c++) {
new_chunks[c + num_chunks] = icalarray_alloc_chunk(array);
+ if (!new_chunks[c + num_chunks]) {
+ num_new_chunks = c;
+ break;
+ }
}
if (array->chunks) {
- free(array->chunks);
+ icalmemory_free_buffer(array->chunks);
}
array->chunks = new_chunks;
array->space_allocated = array->space_allocated + num_new_chunks * array->increment_size;
diff --git a/src/libical/icalarray.h b/src/libical/icalarray.h
index 2fc9fb26..4c253fbc 100644
--- a/src/libical/icalarray.h
+++ b/src/libical/icalarray.h
@@ -2,18 +2,10 @@
FILE: icalarray.h
CREATOR: Damon Chaplin 07 March 2001
- (C) COPYRIGHT 2001, Ximian, Inc.
+ SPDX-FileCopyrightText: 2001, Ximian, Inc.
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/** @file icalarray.h
@@ -27,6 +19,8 @@
#include "libical_ical_export.h"
+#include <stddef.h>
+
/**
* @typedef icalarray
* @brief A struct representing an icalarray object
@@ -42,29 +36,29 @@ struct _icalarray
};
/**
- * @brief Creates a new ::icalarray object.
+ * @brief Creates a new icalarray object.
* @param element_size The size of the elements to be held by the array
* @param increment_size How many extra elements worth of space to allocate on expansion
- * @return The new ::icalarray object
+ * @return The new icalarray object
* @sa icalarray_free()
*
- * Creates a new ::icalarray object. The parameter @a element_size determines
+ * Creates a new icalarray object. The parameter @a element_size determines
* the size of the elements that the array will hold (in bytes). The parameter
* @a increment_size determines how many extra elements to be allocated when
* expanding the array for performance reasons (expansions are expensive, since
* it involves copying all existing elements).
*
* @par Error handling
- * If @a element_size or @a increment_size is not at least 1, using the ::icalarray
+ * If @a element_size or @a increment_size is not at least 1, using the icalarray
* object results in undefined behaviour. If there is an error while creating the
* object, it returns `NULL` and sets ::icalerrno to ::ICAL_NEWFAILED_ERROR.
*
* @par Ownership
- * The returned ::icalarray object is owned by the caller of the function,
+ * The returned icalarray object is owned by the caller of the function,
* and needs to be released properly after it's no longer needed with
* icalarray_free().
*
- * ### Usage
+ * @par Usage
* ```c
* // create new array
* icalarray *array = icalarray_new(sizeof(int), 1);
@@ -81,11 +75,11 @@ struct _icalarray
LIBICAL_ICAL_EXPORT icalarray *icalarray_new(size_t element_size, size_t increment_size);
/**
- * @brief Copies an existing ::icalarray and its elements, creating a new one.
+ * @brief Copies an existing icalarray and its elements, creating a new one.
* @param array The array to copy
* @return A new array, holding all the elements of @a array
*
- * Creates a new ::icalarray object, copying all the existing elements from
+ * Creates a new icalarray object, copying all the existing elements from
* @a array as well as its properties (such as @a element_size and
* @a increment_size) over.
*
@@ -98,7 +92,7 @@ LIBICAL_ICAL_EXPORT icalarray *icalarray_new(size_t element_size, size_t increme
* The created copy is owned by the caller of the function, and needs to
* be released with icalarray_free() after it's no longer being used.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new array
* icalarray *array = icalarray_new(sizeof(int), 1);
@@ -122,7 +116,7 @@ LIBICAL_ICAL_EXPORT icalarray *icalarray_copy(icalarray *array);
* @brief Frees an array object and everything that it contains.
* @param array The array to release
*
- * ### Example
+ * @par Example
* ```c
* // creating an array
* icalarray *array = icalarray_new(sizeof(int), 1);
@@ -149,7 +143,7 @@ LIBICAL_ICAL_EXPORT void icalarray_free(icalarray *array);
* The @a element does not get consumed by the method, since it creates
* a copy of it
*
- * ### Usage
+ * @par Usage
* ```c
* // create new array
* icalarray *array = icalarray_new(sizeof(int), 1);
@@ -176,7 +170,7 @@ LIBICAL_ICAL_EXPORT void icalarray_append(icalarray *array, const void *element)
* If the array is empty, using this function results in undefined behaviour.
* If the @a position is non-existent, it removes the last element.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new array
* icalarray *array = icalarray_new(sizeof(int), 2);
@@ -227,10 +221,10 @@ LIBICAL_ICAL_EXPORT void icalarray_remove_element_at(icalarray *array, size_t po
* results in undefined behaviour.
*
* @par Ownership
- * The element is owned by the ::icalarray, it must not be freed by
+ * The element is owned by the icalarray, it must not be freed by
* the user.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new array
* icalarray *array = icalarray_new(sizeof(int), 1);
@@ -255,7 +249,7 @@ LIBICAL_ICAL_EXPORT void icalarray_remove_element_at(icalarray *array, size_t po
LIBICAL_ICAL_EXPORT void *icalarray_element_at(icalarray *array, size_t position);
/**
- * @brief Sorts the elements of an ::icalarray using the given comparison function.
+ * @brief Sorts the elements of an icalarray using the given comparison function.
* @param array The array to sort
* @param compare The comparison function to use
*
@@ -263,7 +257,7 @@ LIBICAL_ICAL_EXPORT void *icalarray_element_at(icalarray *array, size_t position
* Passing `NULL` as either @a array or @a compare results in undefined
* behaviour.
*
- * ### Usage
+ * @par Usage
* ```c
* int compare_ints(const void *a, const void *b) {
* return *((int*)a) - *((int*)b);
diff --git a/src/libical/icalattach.c b/src/libical/icalattach.c
index 423cc27e..a2ec5fce 100644
--- a/src/libical/icalattach.c
+++ b/src/libical/icalattach.c
@@ -2,18 +2,10 @@
FILE: icalattach.c
CREATOR: acampi 28 May 02
- (C) COPYRIGHT 2002, Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2002, Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -22,6 +14,7 @@
#include "icalattachimpl.h"
#include "icalerror.h"
+#include "icalmemory.h"
#include <errno.h>
#include <stdlib.h>
@@ -33,13 +26,13 @@ icalattach *icalattach_new_from_url(const char *url)
icalerror_check_arg_rz((url != NULL), "url");
- if ((attach = malloc(sizeof(icalattach))) == NULL) {
+ if ((attach = icalmemory_new_buffer(sizeof(icalattach))) == NULL) {
errno = ENOMEM;
return NULL;
}
- if ((url_copy = strdup(url)) == NULL) {
- free(attach);
+ if ((url_copy = icalmemory_strdup(url)) == NULL) {
+ icalmemory_free_buffer(attach);
errno = ENOMEM;
return NULL;
}
@@ -54,7 +47,7 @@ icalattach *icalattach_new_from_url(const char *url)
static void attach_data_free(char *data, void *free_fn_data)
{
_unused(free_fn_data);
- free(data);
+ icalmemory_free_buffer(data);
}
icalattach *icalattach_new_from_data(const char *data, icalattach_free_fn_t free_fn,
@@ -64,15 +57,15 @@ icalattach *icalattach_new_from_data(const char *data, icalattach_free_fn_t free
icalerror_check_arg_rz((data != NULL), "data");
- if ((attach = malloc(sizeof(icalattach))) == NULL) {
+ if ((attach = icalmemory_new_buffer(sizeof(icalattach))) == NULL) {
errno = ENOMEM;
return NULL;
}
if (!free_fn) {
- data = strdup(data);
+ data = icalmemory_strdup(data);
if (!data) {
- free(attach);
+ icalmemory_free_buffer(attach);
errno = ENOMEM;
return NULL;
}
@@ -107,12 +100,12 @@ void icalattach_unref(icalattach *attach)
return;
if (attach->is_url) {
- free(attach->u.url.url);
+ icalmemory_free_buffer(attach->u.url.url);
} else if (attach->u.data.free_fn) {
(* attach->u.data.free_fn) (attach->u.data.data, attach->u.data.free_fn_data);
}
- free(attach);
+ icalmemory_free_buffer(attach);
}
int icalattach_get_is_url(icalattach *attach)
diff --git a/src/libical/icalattach.h b/src/libical/icalattach.h
index 9a606773..b21aaf50 100644
--- a/src/libical/icalattach.h
+++ b/src/libical/icalattach.h
@@ -2,18 +2,10 @@
FILE: icalattach.h
CREATOR: acampi 28 May 02
- (C) COPYRIGHT 2002, Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2002, Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/**
@@ -23,7 +15,7 @@
* With the `ATTACH` property, the iCal standard defines a way to
* associate a document object with a calendar component.
*
- * These are represented with ::icalattach objects in libical.
+ * These are represented with icalattach objects in libical.
* This file contains functions to create and work with these
* objects.
*/
@@ -37,7 +29,7 @@
* @typedef icalattach
* @brief An iCal attach object representing a link to a document object.
*
- * Represents an association with a document object. ::icalattach objects
+ * Represents an association with a document object. icalattach objects
* are reference counted, meaning that if the last reference to them is
* removed (with icalattach_unref()), they are destroyed.
*/
@@ -54,9 +46,9 @@ typedef struct icalattach_impl icalattach;
typedef void (*icalattach_free_fn_t) (char *data, void *user_data);
/**
- * @brief Creates new ::icalattach object from a URL.
+ * @brief Creates new icalattach object from a URL.
* @param url The URL to create the object from
- * @return An ::icalattach object with the given URL as association
+ * @return An icalattach object with the given URL as association
* @sa icalattach_unref()
*
* @par Error handling
@@ -65,12 +57,12 @@ typedef void (*icalattach_free_fn_t) (char *data, void *user_data);
* returns `NULL` and sets `errno` to `ENOMEM`.
*
* @par Ownership
- * The returned ::icalattach object is owned by the caller of the function.
- * ::icalattach objects are reference counted, which means that after
+ * The returned icalattach object is owned by the caller of the function.
+ * icalattach objects are reference counted, which means that after
* use, icalattach_unref() needs to be called to signal that they are
* not used anymore.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new
* icalattach *attach = icalattach_new_from_url("http://example.com");
@@ -86,11 +78,11 @@ typedef void (*icalattach_free_fn_t) (char *data, void *user_data);
LIBICAL_ICAL_EXPORT icalattach *icalattach_new_from_url(const char *url);
/**
- * @brief Creates new ::icalattach object from data.
- * @param data The data to create the ::icalattach from
+ * @brief Creates new icalattach object from data.
+ * @param data The data to create the icalattach from
* @param free_fn The function to free the data
* @param free_fn_data Data to pass to the @a free_fn
- * @return An ::icalattach object with the given data
+ * @return An icalattach object with the given data
* @sa icalattach_unref()
*
* @par Error handling
@@ -99,8 +91,8 @@ LIBICAL_ICAL_EXPORT icalattach *icalattach_new_from_url(const char *url);
* returns `NULL` and sets `errno` to `ENOMEM`.
*
* @par Ownership
- * The returned ::icalattach object is owned by the caller of the function.
- * ::icalattach objects are reference counted, which means that after
+ * The returned icalattach object is owned by the caller of the function.
+ * icalattach objects are reference counted, which means that after
* use, icalattach_unref() needs to be called to signal that they are
* not used anymore.
*/
@@ -109,7 +101,7 @@ LIBICAL_ICAL_EXPORT icalattach *icalattach_new_from_data(const char *data,
void *free_fn_data);
/**
- * @brief Increments reference count of the ::icalattach.
+ * @brief Increments reference count of the icalattach.
* @param attach The object to increase the reference count of
* @sa icalattach_unref()
*
@@ -125,7 +117,7 @@ LIBICAL_ICAL_EXPORT icalattach *icalattach_new_from_data(const char *data,
LIBICAL_ICAL_EXPORT void icalattach_ref(icalattach *attach);
/**
- * @brief Decrements reference count of the ::icalattach.
+ * @brief Decrements reference count of the icalattach.
* @param attach The object to decrease the reference count of
* @sa icalattach_ref()
*
@@ -140,7 +132,7 @@ LIBICAL_ICAL_EXPORT void icalattach_ref(icalattach *attach);
* Calling this function releases the icalattach back to the library,
* and it must not be used afterwards.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new
* icalattach *attach = icalattach_new_from_url("http://example.com");
@@ -153,7 +145,7 @@ LIBICAL_ICAL_EXPORT void icalattach_unref(icalattach *attach);
/**
* @brief Determines if @a attach is an URL.
- * @param attach the ::icalattach object to check
+ * @param attach the icalattach object to check
* @return 1 if it is a URL, otherwise 0.
* @sa icalattach_get_url()
*
@@ -161,7 +153,7 @@ LIBICAL_ICAL_EXPORT void icalattach_unref(icalattach *attach);
* Returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR if
* @a attach is `NULL`.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new
* icalattach *attach = icalattach_new_from_url("http://example.com");
@@ -176,12 +168,12 @@ LIBICAL_ICAL_EXPORT void icalattach_unref(icalattach *attach);
LIBICAL_ICAL_EXPORT int icalattach_get_is_url(icalattach *attach);
/**
- * @brief Returns the URL of the ::icalattach object.
+ * @brief Returns the URL of the icalattach object.
* @param attach The object from which to return the URL
* @return The URL of the object
* @sa icalattach_get_is_url()
*
- * Returns the URL of the ::icalattach object.
+ * Returns the URL of the icalattach object.
*
* @par Error handling
* Returns `NULL` and set ::icalerrno to ::ICAL_BADARG_ERROR if
@@ -192,7 +184,7 @@ LIBICAL_ICAL_EXPORT int icalattach_get_is_url(icalattach *attach);
* The string returned is owned by libical and must not be freed
* by the caller.
*
- * # Usage
+ * @par Usage
* ```c
* // creates new
* icalattach *attach = icalattach_new_from_url("http://example.com");
@@ -208,12 +200,12 @@ LIBICAL_ICAL_EXPORT int icalattach_get_is_url(icalattach *attach);
LIBICAL_ICAL_EXPORT const char *icalattach_get_url(icalattach *attach);
/**
- * @brief Returns the data of the ::icalattach object.
+ * @brief Returns the data of the icalattach object.
* @param attach The object from which to return the data
* @return The data of the object
* @sa icalattach_get_is_url()
*
- * Returns the URL of the ::icalattach object.
+ * Returns the URL of the icalattach object.
*
* @par Error handling
* Returns `NULL` and set ::icalerrno to ::ICAL_BADARG_ERROR if
diff --git a/src/libical/icalattachimpl.h b/src/libical/icalattachimpl.h
index af9975c0..7ca14441 100644
--- a/src/libical/icalattachimpl.h
+++ b/src/libical/icalattachimpl.h
@@ -2,18 +2,10 @@
FILE: icalattachimpl.h
CREATOR: acampi 28 May 02
- (C) COPYRIGHT 2000, Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2000, Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALATTACHIMPL_H
diff --git a/src/libical/icalcomponent.c b/src/libical/icalcomponent.c
index deb2c402..4f9fa79d 100644
--- a/src/libical/icalcomponent.c
+++ b/src/libical/icalcomponent.c
@@ -2,18 +2,10 @@
FILE: icalcomponent.c
CREATOR: eric 28 April 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -73,7 +65,7 @@ void icalcomponent_add_children(icalcomponent *impl, va_list args)
while ((vp = va_arg(args, void *)) != 0)
{
- assert(icalcomponent_isa_component(vp) != 0 || icalproperty_isa_property(vp) != 0);
+ icalassert(icalcomponent_isa_component(vp) != 0 || icalproperty_isa_property(vp) != 0);
if (icalcomponent_isa_component(vp) != 0) {
icalcomponent_add_component(impl, (icalcomponent *) vp);
@@ -91,7 +83,7 @@ static icalcomponent *icalcomponent_new_impl(icalcomponent_kind kind)
if (!icalcomponent_kind_is_valid(kind))
return NULL;
- if ((comp = (icalcomponent *) malloc(sizeof(icalcomponent))) == 0) {
+ if ((comp = (icalcomponent *) icalmemory_new_buffer(sizeof(icalcomponent))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -210,7 +202,7 @@ void icalcomponent_free(icalcomponent *c)
pvl_free(c->components);
if (c->x_name != 0) {
- free(c->x_name);
+ icalmemory_free_buffer(c->x_name);
}
if (c->timezones) {
@@ -227,7 +219,7 @@ void icalcomponent_free(icalcomponent *c)
c->id[0] = 'X';
c->timezones = NULL;
- free(c);
+ icalmemory_free_buffer(c);
}
}
@@ -236,7 +228,9 @@ char *icalcomponent_as_ical_string(icalcomponent *impl)
char *buf;
buf = icalcomponent_as_ical_string_r(impl);
- icalmemory_add_tmp_buffer(buf);
+ if (buf) {
+ icalmemory_add_tmp_buffer(buf);
+ }
return buf;
}
@@ -269,6 +263,9 @@ char *icalcomponent_as_ical_string_r(icalcomponent *impl)
icalerror_check_arg_rz((kind_string != 0), "Unknown kind of component");
buf = icalmemory_new_buffer(buf_size);
+ if (buf == NULL)
+ return NULL;
+
buf_ptr = buf;
icalmemory_append_string(&buf, &buf_ptr, &buf_size, "BEGIN:");
@@ -282,16 +279,17 @@ char *icalcomponent_as_ical_string_r(icalcomponent *impl)
tmp_buf = icalproperty_as_ical_string_r(p);
icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
- free(tmp_buf);
+ icalmemory_free_buffer(tmp_buf);
}
for (itr = pvl_head(impl->components); itr != 0; itr = pvl_next(itr)) {
c = (icalcomponent *) pvl_data(itr);
tmp_buf = icalcomponent_as_ical_string_r(c);
-
- icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
- free(tmp_buf);
+ if (tmp_buf != NULL) {
+ icalmemory_append_string(&buf, &buf_ptr, &buf_size, tmp_buf);
+ icalmemory_free_buffer(tmp_buf);
+ }
}
icalmemory_append_string(&buf, &buf_ptr, &buf_size, "END:");
@@ -532,7 +530,8 @@ void icalcomponent_add_component(icalcomponent *parent, icalcomponent *child)
if (!parent->timezones)
parent->timezones = icaltimezone_array_new();
- icaltimezone_array_append_from_vtimezone(parent->timezones, child);
+ if (parent->timezones)
+ icaltimezone_array_append_from_vtimezone(parent->timezones, child);
/* Flag that we need to sort it before doing any binary searches. */
parent->timezones_sorted = 0;
@@ -726,24 +725,14 @@ or empty VCALENDAR component"); */
}
span.start = icaltime_as_timet_with_zone(start, icaltimezone_get_utc_timezone());
- /* The end time could be specified as either a DTEND or a DURATION */
+ /* The end time could be specified as either a DTEND, a DURATION, or be missing */
/* icalcomponent_get_dtend takes care of these cases. */
end = icalcomponent_get_dtend(comp);
- if (icaltime_is_null_time(end)) {
- if (!icaltime_is_date(start)) {
- /* If dtstart is a DATE-TIME and there is no DTEND nor DURATION
- it takes no time */
- span.start = 0;
- return span;
- } else {
- end = start;
- }
- }
span.end = icaltime_as_timet_with_zone(end, icaltimezone_get_utc_timezone());
if (icaltime_is_date(start)) {
/* Until the end of the day */
- span.end += 60 * 60 * 24 - 1;
+ span.end -= 1;
}
return span;
@@ -806,7 +795,8 @@ int icalproperty_recurrence_is_excluded(icalcomponent *comp,
/** exrule_time > recurtime **/
}
- icalrecur_iterator_free(exrule_itr);
+ if (exrule_itr)
+ icalrecur_iterator_free(exrule_itr);
}
comp->property_iterator = property_iterator;
@@ -873,8 +863,8 @@ void icalcomponent_foreach_recurrence(icalcomponent *comp,
{
struct icaltimetype dtstart, dtend;
icaltime_span recurspan, basespan, limit_span;
- time_t limit_start, limit_end;
- time_t dtduration;
+ icaltime_t limit_start, limit_end;
+ icaltime_t dtduration;
icalproperty *rrule, *rdate;
pvl_elem property_iterator; /* for saving the iterator */
@@ -891,16 +881,9 @@ void icalcomponent_foreach_recurrence(icalcomponent *comp,
if (icaltime_is_null_time(dtstart))
return;
- /* The end time could be specified as either a DTEND or a DURATION */
+ /* The end time could be specified as either a DTEND, a DURATION or be missing */
/* icalcomponent_get_dtend takes care of these cases. */
dtend = icalcomponent_get_dtend(comp);
- if (icaltime_is_null_time(dtend) && icaltime_is_date(dtstart)) {
- /* No DTEND or DURATION and DTSTART is DATE - duration is 1 day */
- struct icaldurationtype dur = icaldurationtype_null_duration();
-
- dur.days = 1;
- dtend = icaltime_add(dtstart, dur);
- }
/* Now set up the base span for this item, corresponding to the
base DTSTART and DTEND */
@@ -915,10 +898,10 @@ void icalcomponent_foreach_recurrence(icalcomponent *comp,
limit_end = icaltime_as_timet_with_zone(end,
icaltimezone_get_utc_timezone());
} else {
-#if (SIZEOF_TIME_T > 4)
- limit_end = (time_t) LONG_MAX;
+#if (SIZEOF_ICALTIME_T > 4)
+ limit_end = (icaltime_t) LONG_MAX;
#else
- limit_end = (time_t) INT_MAX;
+ limit_end = (icaltime_t) INT_MAX;
#endif
}
limit_span.start = limit_start;
@@ -1199,6 +1182,11 @@ static const struct icalcomponent_kind_map component_map[] = {
{ICAL_VPATCH_COMPONENT, "VPATCH"},
{ICAL_XPATCH_COMPONENT, "PATCH"},
+ /* Event Publishing components */
+ {ICAL_PARTICIPANT_COMPONENT, "PARTICIPANT"},
+ {ICAL_VLOCATION_COMPONENT, "VLOCATION"},
+ {ICAL_VRESOURCE_COMPONENT, "VRESOURCE"},
+
/* End of list */
{ICAL_NO_COMPONENT, ""},
};
@@ -1423,13 +1411,26 @@ struct icaltimetype icalcomponent_get_dtstart(icalcomponent *comp)
struct icaltimetype icalcomponent_get_dtend(icalcomponent *comp)
{
icalcomponent *inner = icalcomponent_get_inner(comp);
- icalproperty *end_prop = icalcomponent_get_first_property(inner, ICAL_DTEND_PROPERTY);
- icalproperty *dur_prop = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
- struct icaltimetype ret = icaltime_null_time();
+ const icalcomponent_kind kind = icalcomponent_isa(inner);
+ icalproperty *end_prop, *dur_prop;
+ struct icaltimetype ret;
+
+ switch(kind) {
+ case ICAL_VAVAILABILITY_COMPONENT:
+ case ICAL_VEVENT_COMPONENT:
+ case ICAL_VFREEBUSY_COMPONENT:
+ case ICAL_XAVAILABLE_COMPONENT:
+ break;
+ default:
+ return icaltime_null_time();
+ }
+
+ end_prop = icalcomponent_get_first_property(inner, ICAL_DTEND_PROPERTY);
+ dur_prop = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
- if (end_prop != 0) {
+ if (end_prop != 0 && dur_prop == 0) {
ret = icalproperty_get_datetime_with_component(end_prop, comp);
- } else if (dur_prop != 0) {
+ } else if (end_prop == 0 && dur_prop != 0) {
struct icaltimetype start = icalcomponent_get_dtstart(inner);
struct icaldurationtype duration;
@@ -1442,6 +1443,23 @@ struct icaltimetype icalcomponent_get_dtend(icalcomponent *comp)
}
ret = icaltime_add(start, duration);
+ } else if (end_prop == 0 && dur_prop == 0) {
+ if (kind == ICAL_VEVENT_COMPONENT) {
+ struct icaltimetype start = icalcomponent_get_dtstart(inner);
+ if (icaltime_is_date(start)) {
+ struct icaldurationtype duration = icaldurationtype_null_duration();
+ duration.days = 1;
+ ret = icaltime_add(start, duration);
+ } else {
+ ret = start;
+ }
+ } else {
+ ret = icaltime_null_time();
+ }
+ } else {
+ /* Error, both duration and dtend have been specified */
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+ ret = icaltime_null_time();
}
return ret;
@@ -1492,12 +1510,32 @@ void icalcomponent_set_duration(icalcomponent *comp, struct icaldurationtype v)
struct icaldurationtype icalcomponent_get_duration(icalcomponent *comp)
{
icalcomponent *inner = icalcomponent_get_inner(comp);
+ const icalcomponent_kind kind = icalcomponent_isa(inner);
+ icalproperty *end_prop, *dur_prop;
+ struct icaltimetype end;
+ struct icaldurationtype ret;
+
+ switch(kind) {
+ case ICAL_VAVAILABILITY_COMPONENT:
+ case ICAL_VEVENT_COMPONENT:
+ case ICAL_XAVAILABLE_COMPONENT:
+ end_prop = icalcomponent_get_first_property(inner, ICAL_DTEND_PROPERTY);
+ if (end_prop) {
+ end = icalcomponent_get_dtend(inner);
+ }
+ break;
+ case ICAL_VTODO_COMPONENT:
+ end_prop = icalcomponent_get_first_property(inner, ICAL_DUE_PROPERTY);
+ if (end_prop) {
+ end = icalcomponent_get_due(inner);
+ }
+ break;
+ default:
+ /* The libical API is used incorrectly */
+ return icaldurationtype_null_duration();
+ }
- icalproperty *end_prop = icalcomponent_get_first_property(inner, ICAL_DTEND_PROPERTY);
-
- icalproperty *dur_prop = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
-
- struct icaldurationtype ret = icaldurationtype_null_duration();
+ dur_prop = icalcomponent_get_first_property(inner, ICAL_DURATION_PROPERTY);
if (dur_prop != 0 && end_prop == 0) {
ret = icalproperty_get_duration(dur_prop);
@@ -1506,13 +1544,19 @@ struct icaldurationtype icalcomponent_get_duration(icalcomponent *comp)
/**
* FIXME
* We assume DTSTART and DTEND are not in different time zones.
- * Does the standard actually guarantee this?
+ * The standard actually allows different time zones.
*/
struct icaltimetype start = icalcomponent_get_dtstart(inner);
- struct icaltimetype end = icalcomponent_get_dtend(inner);
ret = icaltime_subtract(end, start);
+ } else if (end_prop == 0 && dur_prop == 0) {
+ struct icaltimetype start = icalcomponent_get_dtstart(inner);
+ ret = icaldurationtype_null_duration();
+ if (kind == ICAL_VEVENT_COMPONENT && icaltime_is_date(start)) {
+ ret.days = 1;
+ }
} else {
+ ret = icaldurationtype_null_duration();
/* Error, both duration and dtend have been specified */
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
}
@@ -1921,6 +1965,21 @@ icalcomponent *icalcomponent_new_xpatch(void)
return icalcomponent_new(ICAL_XPATCH_COMPONENT);
}
+icalcomponent *icalcomponent_new_participant(void)
+{
+ return icalcomponent_new(ICAL_PARTICIPANT_COMPONENT);
+}
+
+icalcomponent *icalcomponent_new_vlocation(void)
+{
+ return icalcomponent_new(ICAL_VLOCATION_COMPONENT);
+}
+
+icalcomponent *icalcomponent_new_vresource(void)
+{
+ return icalcomponent_new(ICAL_VRESOURCE_COMPONENT);
+}
+
/*
* Timezone stuff.
*/
@@ -1932,13 +1991,16 @@ void icalcomponent_merge_component(icalcomponent *comp, icalcomponent *comp_to_m
size_t i;
/* Check that both components are VCALENDAR components. */
- assert(icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT);
- assert(icalcomponent_isa(comp_to_merge) == ICAL_VCALENDAR_COMPONENT);
+ icalassert(icalcomponent_isa(comp) == ICAL_VCALENDAR_COMPONENT);
+ icalassert(icalcomponent_isa(comp_to_merge) == ICAL_VCALENDAR_COMPONENT);
/* Step through each subcomponent of comp_to_merge, looking for VTIMEZONEs.
For each VTIMEZONE found, check if we need to add it to comp and if we
need to rename it and all TZID references to it. */
tzids_to_rename = icalarray_new(sizeof(char *), 16);
+ if (!tzids_to_rename)
+ return;
+
subcomp = icalcomponent_get_first_component(comp_to_merge, ICAL_VTIMEZONE_COMPONENT);
while (subcomp) {
next_subcomp = icalcomponent_get_next_component(comp_to_merge, ICAL_VTIMEZONE_COMPONENT);
@@ -1956,7 +2018,7 @@ void icalcomponent_merge_component(icalcomponent *comp, icalcomponent *comp_to_m
/* Now free the tzids_to_rename array. */
for (i = 0; i < tzids_to_rename->num_elements; i++) {
- free(icalarray_element_at(tzids_to_rename, i));
+ icalmemory_free_buffer(icalarray_element_at(tzids_to_rename, i));
}
}
icalarray_free(tzids_to_rename);
@@ -2015,7 +2077,7 @@ static void icalcomponent_merge_vtimezone(icalcomponent *comp,
unique one), so we compare the VTIMEZONE components to see if they are
the same. If they are, we don't need to do anything. We make a copy of
the tzid, since the parameter may get modified in these calls. */
- tzid_copy = strdup(tzid);
+ tzid_copy = icalmemory_strdup(tzid);
if (!tzid_copy) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return;
@@ -2028,7 +2090,7 @@ static void icalcomponent_merge_vtimezone(icalcomponent *comp,
icalcomponent_handle_conflicting_vtimezones(comp, vtimezone, tzid_prop,
tzid_copy, tzids_to_rename);
}
- free(tzid_copy);
+ icalmemory_free_buffer(tzid_copy);
}
static void icalcomponent_handle_conflicting_vtimezones(icalcomponent *comp,
@@ -2072,20 +2134,20 @@ static void icalcomponent_handle_conflicting_vtimezones(icalcomponent *comp,
if (icalcomponent_compare_vtimezones(icaltimezone_get_component(zone), vtimezone)) {
/* The VTIMEZONEs match, so we can use the existing VTIMEZONE. But
we have to rename TZIDs to this TZID. */
- tzid_copy = strdup(tzid);
+ tzid_copy = icalmemory_strdup(tzid);
if (!tzid_copy) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return;
}
- existing_tzid_copy = strdup(existing_tzid);
+ existing_tzid_copy = icalmemory_strdup(existing_tzid);
if (!existing_tzid_copy) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- free(tzid_copy);
+ icalmemory_free_buffer(tzid_copy);
} else {
icalarray_append(tzids_to_rename, tzid_copy);
- free(tzid_copy);
+ icalmemory_free_buffer(tzid_copy);
icalarray_append(tzids_to_rename, existing_tzid_copy);
- free(existing_tzid_copy);
+ icalmemory_free_buffer(existing_tzid_copy);
}
return;
} else {
@@ -2102,17 +2164,17 @@ static void icalcomponent_handle_conflicting_vtimezones(icalcomponent *comp,
/* We didn't find a VTIMEZONE that matched, so we have to rename the TZID,
using the maximum numerical suffix found + 1. */
- tzid_copy = strdup(tzid);
+ tzid_copy = icalmemory_strdup(tzid);
if (!tzid_copy) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return;
}
snprintf(suffix_buf, sizeof(suffix_buf), "%i", max_suffix + 1);
- new_tzid = malloc(tzid_len + strlen(suffix_buf) + 1);
+ new_tzid = icalmemory_new_buffer(tzid_len + strlen(suffix_buf) + 1);
if (!new_tzid) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- free(tzid_copy);
+ icalmemory_free_buffer(tzid_copy);
return;
}
@@ -2120,8 +2182,8 @@ static void icalcomponent_handle_conflicting_vtimezones(icalcomponent *comp,
strcpy(new_tzid + tzid_len, suffix_buf);
icalarray_append(tzids_to_rename, tzid_copy);
icalarray_append(tzids_to_rename, new_tzid);
- free(tzid_copy);
- free(new_tzid);
+ icalmemory_free_buffer(tzid_copy);
+ icalmemory_free_buffer(new_tzid);
}
/* Returns the length of the TZID, without any trailing digits. */
@@ -2294,7 +2356,7 @@ static int icalcomponent_compare_vtimezones(icalcomponent *vtimezone1, icalcompo
/* Copy the second TZID, and set the property to the same as the first
TZID, since we don't care if these match of not. */
- tzid2_copy = strdup(tzid2);
+ tzid2_copy = icalmemory_strdup(tzid2);
if (!tzid2_copy) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
@@ -2305,25 +2367,25 @@ static int icalcomponent_compare_vtimezones(icalcomponent *vtimezone1, icalcompo
/* Now convert both VTIMEZONEs to strings and compare them. */
string1 = icalcomponent_as_ical_string_r(vtimezone1);
if (!string1) {
- free(tzid2_copy);
+ icalmemory_free_buffer(tzid2_copy);
return -1;
}
string2 = icalcomponent_as_ical_string_r(vtimezone2);
if (!string2) {
- free(string1);
- free(tzid2_copy);
+ icalmemory_free_buffer(string1);
+ icalmemory_free_buffer(tzid2_copy);
return -1;
}
cmp = strcmp(string1, string2);
- free(string1);
- free(string2);
+ icalmemory_free_buffer(string1);
+ icalmemory_free_buffer(string2);
/* Now reset the second TZID. */
icalproperty_set_tzid(prop2, tzid2_copy);
- free(tzid2_copy);
+ icalmemory_free_buffer(tzid2_copy);
return (cmp == 0) ? 1 : 0;
}
@@ -2412,6 +2474,7 @@ void icalcomponent_set_due(icalcomponent *comp, struct icaltimetype v)
icalcomponent_add_property(inner, due_prop);
} else if (due_prop != 0) {
icalproperty_set_due(due_prop, v);
+ icalproperty_remove_parameter_by_kind(due_prop, ICAL_TZID_PARAMETER);
} else if (dur_prop != 0) {
struct icaltimetype start = icalcomponent_get_dtstart(inner);
@@ -2427,6 +2490,12 @@ void icalcomponent_set_due(icalcomponent *comp, struct icaltimetype v)
}
}
+static int strcmpsafe(const char *a, const char *b)
+{
+ return strcmp((a == NULL ? "" : a),
+ (b == NULL ? "" : b));
+}
+
static int prop_compare(void *a, void *b)
{
icalproperty *p1 = (icalproperty*) a;
@@ -2442,8 +2511,8 @@ static int prop_compare(void *a, void *b)
}
if (r == 0) {
- r = strcmp(icalproperty_get_value_as_string(p1),
- icalproperty_get_value_as_string(p2));
+ r = strcmpsafe(icalproperty_get_value_as_string(p1),
+ icalproperty_get_value_as_string(p2));
}
}
diff --git a/src/libical/icalcomponent.h b/src/libical/icalcomponent.h
index 8b68c5e7..69d6c72e 100644
--- a/src/libical/icalcomponent.h
+++ b/src/libical/icalcomponent.h
@@ -2,18 +2,10 @@
FILE: icalcomponent.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/**
@@ -281,6 +273,13 @@ LIBICAL_ICAL_EXPORT struct icaltimetype icalcomponent_get_dtstart(icalcomponent
* there is a DTEND and you call get_duration, the routine will
* return the difference between DTEND and DTSTART.
*
+ * When DURATION and DTEND are both missing, for VEVENT an implicit
+ * DTEND is calculated based of DTSTART; for AVAILABLE, VAVAILABILITY,
+ * and VFREEBUSY null-time is returned.
+ *
+ * Returns null-time, unless called on AVAILABLE, VEVENT,
+ * VAVAILABILITY, or VFREEBUSY components.
+ *
* FIXME this is useless until we can flag the failure
*/
LIBICAL_ICAL_EXPORT struct icaltimetype icalcomponent_get_dtend(icalcomponent *comp);
@@ -345,15 +344,14 @@ LIBICAL_ICAL_EXPORT void icalcomponent_set_duration(icalcomponent *comp,
/** @brief Gets the DURATION property as an icalduration
*
* For the icalcomponent routines only, DTEND and DURATION are tied
- * together.
- * If a DURATION property is not present but a DTEND is, we use
- * that to determine the proper end.
- *
- * For the icalcomponent routines only, dtend and duration are tied
* together. If you call the get routine for one and the other
* exists, the routine will calculate the return value. That is, if
- * there is a DTEND and you call get_duration, the routine will
- * return the difference between DTEND and DTSTART.
+ * there is a DTEND and you call get_duration, the routine will return
+ * the difference between DTEND and DTSTART in AVAILABLE, VEVENT, or
+ * VAVAILABILITY; and the difference between DUE and DTSTART in VTODO.
+ * When both DURATION and DTEND are missing from VEVENT an implicit
+ * duration is returned, based on the value-type of DTSTART. Otherwise
+ * null-duration is returned.
*/
LIBICAL_ICAL_EXPORT struct icaldurationtype icalcomponent_get_duration(icalcomponent *comp);
@@ -461,8 +459,8 @@ LIBICAL_ICAL_EXPORT int icalproperty_recurrence_is_excluded(icalcomponent *comp,
*
* It will filter out events that are specified as an EXDATE or an EXRULE.
*
- * @todo We do not filter out duplicate RRULES/RDATES
- * @todo We do not handle RDATEs with explicit periods
+ * TODO: We do not filter out duplicate RRULES/RDATES
+ * TODO: We do not handle RDATEs with explicit periods
*/
LIBICAL_ICAL_EXPORT void icalcomponent_foreach_recurrence(icalcomponent *comp,
struct icaltimetype start,
@@ -529,4 +527,10 @@ LIBICAL_ICAL_EXPORT icalcomponent *icalcomponent_new_vpatch(void);
LIBICAL_ICAL_EXPORT icalcomponent *icalcomponent_new_xpatch(void);
+LIBICAL_ICAL_EXPORT icalcomponent *icalcomponent_new_participant(void);
+
+LIBICAL_ICAL_EXPORT icalcomponent *icalcomponent_new_vlocation(void);
+
+LIBICAL_ICAL_EXPORT icalcomponent *icalcomponent_new_vresource(void);
+
#endif /* !ICALCOMPONENT_H */
diff --git a/src/libical/icalderivedparameter.c.in b/src/libical/icalderivedparameter.c.in
index f0af1fe7..0e203179 100644
--- a/src/libical/icalderivedparameter.c.in
+++ b/src/libical/icalderivedparameter.c.in
@@ -2,18 +2,9 @@
FILE: icalderivedparameters.{c,h}
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
Contributions from:
Graham Davison (g.m.davison@computer.org)
diff --git a/src/libical/icalderivedparameter.h.in b/src/libical/icalderivedparameter.h.in
index 9bb58fca..07649533 100644
--- a/src/libical/icalderivedparameter.h.in
+++ b/src/libical/icalderivedparameter.h.in
@@ -2,18 +2,9 @@
FILE: icalparam.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalparam.h
======================================================================*/
diff --git a/src/libical/icalderivedproperty.c.in b/src/libical/icalderivedproperty.c.in
index 93883b3a..62cbf6d1 100644
--- a/src/libical/icalderivedproperty.c.in
+++ b/src/libical/icalderivedproperty.c.in
@@ -2,18 +2,10 @@
FILE: icalderivedproperty.c
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 1999, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/libical/icalderivedproperty.h.in b/src/libical/icalderivedproperty.h.in
index 0ebec067..c5244dd8 100644
--- a/src/libical/icalderivedproperty.h.in
+++ b/src/libical/icalderivedproperty.h.in
@@ -2,24 +2,15 @@
FILE: icalderivedproperty.h
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 1999, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALDERIVEDPROPERTY_H
#define ICALDERIVEDPROPERTY_H
-#include <time.h>
#include "icalparameter.h"
#include "icalderivedvalue.h"
#include "icalrecur.h"
diff --git a/src/libical/icalderivedvalue.c.in b/src/libical/icalderivedvalue.c.in
index 2727e0b4..8dde33eb 100644
--- a/src/libical/icalderivedvalue.c.in
+++ b/src/libical/icalderivedvalue.c.in
@@ -2,18 +2,9 @@
FILE: icalvalue.c
CREATOR: eric 02 May 1999
- (C) COPYRIGHT 1999, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
Contributions from:
Graham Davison (g.m.davison@computer.org)
@@ -28,6 +19,7 @@
#include "icalvalueimpl.h"
#include "icalerror.h"
#include "icalmemory.h"
+#include "icaltimezone.h"
#include <errno.h>
#include <stdlib.h>
@@ -114,7 +106,7 @@ void icalvalue_set_x(icalvalue *impl, const char *v)
icalerror_check_arg_rv((v != 0), "v");
if (impl->x_value != 0) {
- free((void *)impl->x_value);
+ icalmemory_free_buffer((void *)impl->x_value);
}
impl->x_value = icalmemory_strdup(v);
@@ -150,12 +142,12 @@ void icalvalue_set_recur(icalvalue *impl, struct icalrecurrencetype v)
icalerror_check_value_type(value, ICAL_RECUR_VALUE);
if (impl->data.v_recur != 0) {
- free(impl->data.v_recur->rscale);
- free(impl->data.v_recur);
+ icalmemory_free_buffer(impl->data.v_recur->rscale);
+ icalmemory_free_buffer(impl->data.v_recur);
impl->data.v_recur = 0;
}
- impl->data.v_recur = malloc(sizeof(struct icalrecurrencetype));
+ impl->data.v_recur = icalmemory_new_buffer(sizeof(struct icalrecurrencetype));
if (impl->data.v_recur == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
@@ -299,6 +291,12 @@ void icalvalue_set_datetimedate(icalvalue *value, struct icaltimetype v)
impl = (struct icalvalue_impl *)value;
impl->data.v_time = v;
+ /* preserve only built-in UTC time zone, otherwise unset any set on the 'v' */
+ if (impl->data.v_time.zone != NULL &&
+ impl->data.v_time.zone != icaltimezone_get_utc_timezone()) {
+ impl->data.v_time.zone = NULL;
+ }
+
icalvalue_reset_kind(impl);
}
@@ -432,9 +430,8 @@ void icalvalue_set_geo(icalvalue *value, struct icalgeotype v)
struct icalgeotype icalvalue_get_geo(const icalvalue *value)
{
struct icalgeotype gt;
-
- gt.lat = 255.0;
- gt.lon = 255.0;
+ strcpy(gt.lat, "255.0");
+ strcpy(gt.lon, "255.0");
icalerror_check_arg_rx((value != 0), "value", gt);
icalerror_check_value_type(value, ICAL_GEO_VALUE);
diff --git a/src/libical/icalderivedvalue.h.in b/src/libical/icalderivedvalue.h.in
index 52f57418..65ed8588 100644
--- a/src/libical/icalderivedvalue.h.in
+++ b/src/libical/icalderivedvalue.h.in
@@ -2,18 +2,10 @@
FILE: icalvalue.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 1999, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALDERIVEDVALUE_H
diff --git a/src/libical/icalduration.c b/src/libical/icalduration.c
index c978fb79..e6780f59 100644
--- a/src/libical/icalduration.c
+++ b/src/libical/icalduration.c
@@ -2,18 +2,9 @@
FILE: icaltime.c
CREATOR: eric 02 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -338,8 +329,8 @@ struct icaltimetype icaltime_add(struct icaltimetype t, struct icaldurationtype
struct icaldurationtype icaltime_subtract(struct icaltimetype t1, struct icaltimetype t2)
{
- time_t t1t = icaltime_as_timet(t1);
- time_t t2t = icaltime_as_timet(t2);
+ icaltime_t t1t = icaltime_as_timet(t1);
+ icaltime_t t2t = icaltime_as_timet(t2);
return icaldurationtype_from_int((int)(t1t - t2t));
}
diff --git a/src/libical/icalduration.h b/src/libical/icalduration.h
index 228dab7c..a6723770 100644
--- a/src/libical/icalduration.h
+++ b/src/libical/icalduration.h
@@ -2,18 +2,9 @@
FILE: icalduration.h
CREATOR: eric 26 Jan 2001
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -50,7 +41,7 @@ struct icaldurationtype
* @param t The duration in seconds
* @return An ::icaldurationtype representing the duration @a t in seconds
*
- * ### Example
+ * @par Example
* ```c
* // create a new icaldurationtype with a duration of 60 seconds
* struct icaldurationtype duration;
@@ -71,7 +62,7 @@ LIBICAL_ICAL_EXPORT struct icaldurationtype icaldurationtype_from_int(int t);
* When given bad input, it sets ::icalerrno to ::ICAL_MALFORMEDDATA_ERROR and
* returns icaldurationtype_bad_duration().
*
- * ### Usage
+ * @par Usage
* ```c
* // create a new icaldurationtype
* struct icaldurationtype duration;
@@ -88,7 +79,7 @@ LIBICAL_ICAL_EXPORT struct icaldurationtype icaldurationtype_from_string(const c
* @param duration The duration to convert to seconds
* @return An `int` representing the duration in seconds
*
- * ### Usage
+ * @par Usage
* ```c
* // create icaldurationtype with given duration
* struct icaldurationtype duration;
@@ -102,15 +93,15 @@ LIBICAL_ICAL_EXPORT int icaldurationtype_as_int(struct icaldurationtype duration
/**
* Converts an icaldurationtype into the iCal format as string.
- * @param The icaldurationtype to convert to iCal format
+ * @param d is the icaldurationtype to convert to iCal format
* @return A string representing duration @p d in iCal format
* @sa icaldurationtype_as_ical_string_r()
*
- * @b Ownership
+ * @par Ownership
* The string returned by this function is owned by the caller and needs to be
- * released with `free()` after it's no longer needed.
+ * released with `icalmemory_free_buffer()` after it's no longer needed.
*
- * @b Usage
+ * @par Usage
* ```c
* // create new duration
* struct icaldurationtype duration;
@@ -121,22 +112,22 @@ LIBICAL_ICAL_EXPORT int icaldurationtype_as_int(struct icaldurationtype duration
* printf("%s\n", ical);
*
* // release string
- * free(ical);
+ * icalmemory_free_buffer(ical);
* ```
*/
LIBICAL_ICAL_EXPORT char *icaldurationtype_as_ical_string(struct icaldurationtype d);
/**
* Converts an icaldurationtype into the iCal format as string.
- * @param The icaldurationtype to convert to iCal format
+ * @param d is the icaldurationtype to convert to iCal format
* @return A string representing duration @p d in iCal format
* @sa icaldurationtype_as_ical_string()
*
- * @b Ownership
+ * @par Ownership
* The string returned by this function is owned by libical and must not be
* released by the caller of the function.
*
- * @b Usage
+ * @par Usage
* ```c
* // create new duration
* struct icaldurationtype duration;
@@ -153,7 +144,7 @@ LIBICAL_ICAL_EXPORT char *icaldurationtype_as_ical_string_r(struct icaldurationt
* @return An ::icaldurationtype with a zero length
* @sa icaldurationtype_is_null_duration()
*
- * ### Usage
+ * @par Usage
* ```c
* // create null duration
* struct icaldurationtype duration;
@@ -176,7 +167,7 @@ LIBICAL_ICAL_EXPORT struct icaldurationtype icaldurationtype_null_duration(void)
* @return A bad duration
* @sa icaldurationtype_is_bad_duration()
*
- * ### Usage
+ * @par Usage
* ```c
* // create bad duration
* struct icaldurationtype duration;
@@ -194,7 +185,7 @@ LIBICAL_ICAL_EXPORT struct icaldurationtype icaldurationtype_bad_duration(void);
* @return 1 if the duration is a null duration, 0 otherwise
* @sa icalduration_null_duration()
*
- * ### Usage
+ * @par Usage
* ```
* // make null duration
* struct icaldurationtype duration;
@@ -212,7 +203,7 @@ LIBICAL_ICAL_EXPORT int icaldurationtype_is_null_duration(struct icaldurationtyp
* @return 1 if the duration is a bad duration, 0 otherwise
* @sa icalduration_bad_duration()
*
- * ### Usage
+ * @par Usage
* ```
* // make bad duration
* struct icaldurationtype duration;
@@ -225,12 +216,12 @@ LIBICAL_ICAL_EXPORT int icaldurationtype_is_null_duration(struct icaldurationtyp
LIBICAL_ICAL_EXPORT int icaldurationtype_is_bad_duration(struct icaldurationtype d);
/**
- * @brief Adds a duration to an ::icaltime object and returns the result.
+ * @brief Adds a duration to an icaltime object and returns the result.
* @param t The time object to add the duration to
* @param d The duration to add to the time object
* @return The new ::icaltimetype which has been added the duration to
*
- * ### Example
+ * @par Example
* ```c
* struct icaltimetype time;
* struct icaldurationtype duration;
@@ -253,7 +244,7 @@ LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_add(struct icaltimetype t,
* @return An ::icaldurationtype representing the duration the elapsed between
* @a t1 and @a t2
*
- * ### Usage
+ * @par Usage
* ```c
* struct icaltimetype t1 = icaltime_from_day_of_year(111, 2018);
* struct icaltimetype t2 = icaltime_from_day_of_year(112, 2018);
diff --git a/src/libical/icalenums.c b/src/libical/icalenums.c
index 4e184795..954a7832 100644
--- a/src/libical/icalenums.c
+++ b/src/libical/icalenums.c
@@ -2,18 +2,10 @@
FILE: icalenum.c
CREATOR: eric 29 April 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -81,7 +73,8 @@ const char *icalenum_reqstat_desc(icalrequeststatus stat)
{
int i;
- for (i = 0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ int len = (int)(sizeof(request_status_map) / sizeof(request_status_map[0]));
+ for (i = 0; i < len && request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
if (request_status_map[i].kind == stat) {
return request_status_map[i].str;
}
@@ -104,7 +97,8 @@ char *icalenum_reqstat_code_r(icalrequeststatus stat)
int i, major, minor;
char tmpbuf[36];
- for (i = 0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ int len = (int)(sizeof(request_status_map) / sizeof(request_status_map[0]));
+ for (i = 0; i < len && request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
if (request_status_map[i].kind == stat) {
major = request_status_map[i].major;
minor = request_status_map[i].minor;
@@ -119,7 +113,8 @@ short icalenum_reqstat_major(icalrequeststatus stat)
{
int i;
- for (i = 0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ int len = (int)(sizeof(request_status_map) / sizeof(request_status_map[0]));
+ for (i = 0; i < len && request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
if (request_status_map[i].kind == stat) {
return request_status_map[i].major;
}
@@ -131,7 +126,8 @@ short icalenum_reqstat_minor(icalrequeststatus stat)
{
int i;
- for (i = 0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ int len = (int)(sizeof(request_status_map) / sizeof(request_status_map[0]));
+ for (i = 0; i < len && request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
if (request_status_map[i].kind == stat) {
return request_status_map[i].minor;
}
@@ -143,7 +139,8 @@ icalrequeststatus icalenum_num_to_reqstat(short major, short minor)
{
int i;
- for (i = 0; request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
+ int len = (int)(sizeof(request_status_map) / sizeof(request_status_map[0]));
+ for (i = 0; i < len && request_status_map[i].kind != ICAL_UNKNOWN_STATUS; i++) {
if (request_status_map[i].major == major && request_status_map[i].minor == minor) {
return request_status_map[i].kind;
}
diff --git a/src/libical/icalenums.h b/src/libical/icalenums.h
index 6d3ac09e..8c72a008 100644
--- a/src/libical/icalenums.h
+++ b/src/libical/icalenums.h
@@ -1,18 +1,9 @@
/*======================================================================
FILE: icalenums.h
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
Contributions from:
Graham Davison <g.m.davison@computer.org>
@@ -64,7 +55,11 @@ typedef enum icalcomponent_kind
ICAL_VVOTER_COMPONENT,
ICAL_XVOTE_COMPONENT,
ICAL_VPATCH_COMPONENT,
- ICAL_XPATCH_COMPONENT
+ ICAL_XPATCH_COMPONENT,
+ ICAL_PARTICIPANT_COMPONENT,
+ ICAL_VLOCATION_COMPONENT,
+ ICAL_VRESOURCE_COMPONENT,
+ ICAL_NUM_COMPONENT_TYPES /* MUST be last (unless we can put NO_COMP last) */
} icalcomponent_kind;
/***********************************************************************
diff --git a/src/libical/icalerror.c b/src/libical/icalerror.c
index 12071ff8..1e6e4602 100644
--- a/src/libical/icalerror.c
+++ b/src/libical/icalerror.c
@@ -2,18 +2,9 @@
FILE: icalerror.c
CREATOR: eric 16 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalerror.c
======================================================================*/
@@ -23,6 +14,7 @@
#endif
#include "icalerror.h"
+#include "icalmemory.h"
#include <stdlib.h>
@@ -38,7 +30,7 @@ static pthread_once_t icalerrno_key_once = PTHREAD_ONCE_INIT;
static void icalerrno_destroy(void *buf)
{
- free(buf);
+ icalmemory_free_buffer(buf);
pthread_setspecific(icalerrno_key, NULL);
}
@@ -56,7 +48,7 @@ icalerrorenum *icalerrno_return(void)
_errno = (icalerrorenum *) pthread_getspecific(icalerrno_key);
if (!_errno) {
- _errno = malloc(sizeof(icalerrorenum));
+ _errno = icalmemory_new_buffer(sizeof(icalerrorenum));
*_errno = ICAL_NO_ERROR;
pthread_setspecific(icalerrno_key, _errno);
}
@@ -90,7 +82,7 @@ void icalerror_crash_here(void)
*p = 1;
/* cppcheck-suppress nullPointer */
- assert(*p);
+ icalassert(*p);
#endif
}
@@ -123,7 +115,7 @@ void icalerror_set_errno(icalerrorenum x)
(icalerror_get_error_state(x) == ICAL_ERROR_DEFAULT && icalerror_errors_are_fatal == 1)) {
icalerror_warn(icalerror_strerror(x));
ical_bt();
- assert(0);
+ icalassert(0);
}
}
@@ -272,11 +264,11 @@ void ical_bt(void)
strings = backtrace_symbols(stack_frames, num);
for (i = 0; i < num; i++) {
if (strings != NULL) {
- fprintf(stderr, "%s\n", strings[i]);
+ icalerrprintf("%s\n", strings[i]);
} else {
- fprintf(stderr, "%p\n", stack_frames[i]);
+ icalerrprintf("%p\n", stack_frames[i]);
}
}
- free(strings);
+ icalmemory_free_buffer(strings);
#endif
}
diff --git a/src/libical/icalerror.h b/src/libical/icalerror.h
index 7fd1253a..87ed8a98 100644
--- a/src/libical/icalerror.h
+++ b/src/libical/icalerror.h
@@ -2,18 +2,9 @@
FILE: icalerror.h
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalerror.h
======================================================================*/
@@ -118,7 +109,7 @@ typedef enum icalerrorenum
* Yields a pointer to the current ::icalerrno value. This can
* be used to access (read from and write to) it.
*
- * ### Examples
+ * @par Examples
* ```c
* assert(*icalerrno_return() == icalerrno);
* ```
@@ -131,7 +122,7 @@ LIBICAL_ICAL_EXPORT icalerrorenum *icalerrno_return(void);
* @note Pseudo-variable that can be used to access the current
* ::icalerrno.
*
- * ### Usage
+ * @par Usage
* ```c
* if(icalerrno == ICAL_PARSE_ERROR) {
* // ...
@@ -149,7 +140,7 @@ LIBICAL_ICAL_EXPORT icalerrorenum *icalerrno_return(void);
* @warning NOT THREAD SAFE: it is recommended that you do not change
* this in a multithreaded program.
*
- * ### Usage
+ * @par Usage
* ```c
* icalerror_set_errors_are_fatal(true); // default
* icalerror_set_errors_are_fatal(false);
@@ -161,7 +152,7 @@ LIBICAL_ICAL_EXPORT void icalerror_set_errors_are_fatal(int fatal);
* @brief Determine if errors are fatal
* @return True if libical errors are fatal
*
- * ### Usage
+ * @par Usage
* ```c
* if(icalerror_get_errors_are_fatal()) {
* // since errors are fatal, this will abort the
@@ -179,7 +170,7 @@ LIBICAL_ICAL_EXPORT int icalerror_get_errors_are_fatal(void);
* @brief Prints a formatted warning message to stderr
* @param message Warning message to print
*
- * ### Usage
+ * @par Usage
* ```c
* icalerror_warn("Non-standard tag encountered");
* ```
@@ -187,16 +178,16 @@ LIBICAL_ICAL_EXPORT int icalerror_get_errors_are_fatal(void);
#ifdef __GNUC__ca
#define icalerror_warn(message) \
-{fprintf(stderr, "%s(), %s:%d: %s\n", __FUNCTION__, __FILE__, __LINE__, message);}
+{icalerrprintf("%s(), %s:%d: %s\n", __FUNCTION__, __FILE__, __LINE__, message);}
#else /* __GNU_C__ */
#define icalerror_warn(message) \
-{fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, message);}
+{icalerrprintf("%s:%d: %s\n", __FILE__, __LINE__, message);}
#endif /* __GNU_C__ */
/**
* @brief Resets icalerrno to ::ICAL_NO_ERROR
*
- * ### Usage
+ * @par Usage
* ```c
* if(icalerrno == ICAL_PARSE_ERROR) {
* // ignore parsing errors
@@ -239,7 +230,7 @@ typedef enum icalerrorstate
* The string that is returned is owned by the library and must not
* be free'd() by the user.
*
- * ### Usage
+ * @par Usage
* ```c
* if(icalerrno != ICAL_NO_ERROR) {
* printf("%s\n", icalerror_strerror(icalerrno));
@@ -259,7 +250,7 @@ LIBICAL_ICAL_EXPORT const char *icalerror_strerror(icalerrorenum e);
* The string that is returned is owned by the library and must not
* be free'd() by the user.
*
- * ### Usage
+ * @par Usage
* ```c
* if(icalerrno != ICAL_NO_ERROR) {
* printf("%s\n", icalerror_perror());
@@ -272,7 +263,7 @@ LIBICAL_ICAL_EXPORT const char *icalerror_perror(void);
* @brief Prints backtrace
* @note Only works on systems that support it (HAVE_BACKTRACE enabled).
*
- * ### Usage
+ * @par Usage
* ```
* if(icalerrno != ICAL_NO_ERROR) {
* ical_bt();
@@ -289,7 +280,7 @@ LIBICAL_ICAL_EXPORT void ical_bt(void);
* Sets the severity of a given error. For example, it can be used to
* set the severity of an ::ICAL_PARSE_ERROR to be an ::ICAL_ERROR_NONFATAL.
*
- * ### Usage
+ * @par Usage
* ```c
* icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);
* ```
@@ -312,7 +303,7 @@ LIBICAL_ICAL_EXPORT icalerrorstate icalerror_get_error_state(icalerrorenum error
* If the error specified in @a str can't be found, instead
* ::ICAL_UNKNOWN_ERROR is returned.
*
- * ### Usage
+ * @par Usage
* ```c
* assert(icalerror_error_from_string("PARSE") == ICAL_PARSE_ERROR);
* assert(icalerror_error_from_string("NONSENSE") == ICAL_UNKNOWN_ERROR);
@@ -330,7 +321,7 @@ LIBICAL_ICAL_EXPORT icalerrorenum icalerror_error_from_string(const char *str);
* and ::ICAL_ERRORS_ARE_FATAL is true, it prints a warning to @a stderr
* and aborts the process.
*
- * ### Usage
+ * @par Usage
* ```c
* icalerror_set_errno(ICAL_PARSE_ERROR);
* ```
@@ -343,7 +334,7 @@ if(icalerror_get_error_state(x) == ICAL_ERROR_FATAL || \
icalerror_get_errors_are_fatal() == 1)){ \
icalerror_warn(icalerror_strerror(x)); \
ical_bt(); \
- assert(0); \
+ icalassert(0); \
} }
#else
/**
@@ -355,7 +346,7 @@ if(icalerror_get_error_state(x) == ICAL_ERROR_FATAL || \
* and ::ICAL_ERRORS_ARE_FATAL is true, it prints a warning to @a stderr
* and aborts the process.
*
- * ### Usage
+ * @par Usage
* ```c
* icalerror_set_errno(ICAL_PARSE_ERROR);
* ```
@@ -405,13 +396,13 @@ LIBICAL_ICAL_EXPORT void icalerror_set_errno(icalerrorenum x);
#ifdef __GNUC__
#define icalerror_assert(test,message) \
if (!(test)) { \
- fprintf(stderr, "%s(), %s:%d: %s\n", __FUNCTION__, __FILE__, __LINE__, message); \
+ icalerrprintf("%s(), %s:%d: %s\n", __FUNCTION__, __FILE__, __LINE__, message); \
icalerror_stop_here(); \
abort();}
#else /*__GNUC__*/
#define icalerror_assert(test,message) \
if (!(test)) { \
- fprintf(stderr, "%s:%d: %s\n", __FILE__, __LINE__, message); \
+ icalerrprintf("%s:%d: %s\n", __FILE__, __LINE__, message); \
icalerror_stop_here(); \
abort();}
#endif /*__GNUC__*/
@@ -429,7 +420,7 @@ if (!(test)) { \
* test if the parameter @a arg is correct. If the assertion fails,
* it sets ::icalerrno to ::ICAL_BADARG_ERROR.
*
- * ### Example
+ * @par Example
* ```c
* void test_function(icalcomponent *component) {
* icalerror_check_arg(component != 0, "component");
@@ -453,7 +444,7 @@ if (!(test)) { \
* it sets ::icalerrno to ::ICAL_BADARG_ERROR and causes the enclosing
* function to return `void`.
*
- * ### Example
+ * @par Example
* ```c
* void test_function(icalcomponent *component) {
* icalerror_check_arg_rv(component != 0, "component");
@@ -478,7 +469,7 @@ if (!(test)) { \
* it sets ::icalerrno to ::ICAL_BADARG_ERROR and causes the enclosing
* function to return `0`.
*
- * ### Example
+ * @par Example
* ```c
* int test_function(icalcomponent *component) {
* icalerror_check_arg_rz(component != 0, "component");
@@ -505,7 +496,7 @@ if (!(test)) { \
* it aborts the process with `assert(0)` and causes the enclosing
* function to return @a error.
*
- * ### Example
+ * @par Example
* ```c
* icalcomponent *test_function(icalcomponent *component) {
* icalerror_check_arg_re(component != 0, "component", NULL);
@@ -518,7 +509,7 @@ if (!(test)) { \
#define icalerror_check_arg_re(test,arg,error) \
if (!(test)) { \
icalerror_stop_here(); \
- assert(0); \
+ icalassert(0); \
return error; \
}
@@ -533,7 +524,7 @@ if (!(test)) { \
* it sets ::icalerrno to ::ICAL_BADARG_ERROR and causes the enclosing
* function to return @a x.
*
- * ### Example
+ * @par Example
* ```c
* icalcomponent *test_function(icalcomponent *component) {
* icalerror_check_arg_rx(component != 0, "component", NULL);
@@ -560,7 +551,7 @@ if (!(test)) { \
* ::ICAL_ERROR_NONFATAL, and thus suppressed. Error states can be
* restored with icalerror_restore().
*
- * ### Usage
+ * @par Usage
* ```c
* // suppresses internal errors
* icalerror_supress("INTERNAL");
@@ -575,7 +566,7 @@ LIBICAL_ICAL_EXPORT icalerrorstate icalerror_supress(const char *error);
*
* Calling the function changes the ::icalerrorstate of the given error.
*
- * ### Usage
+ * @par Usage
* ```c
* // suppress internal errors
* icalerror_supress("INTERNAL");
diff --git a/src/libical/icallangbind.c b/src/libical/icallangbind.c
index 859d6c8e..03a973bb 100644
--- a/src/libical/icallangbind.c
+++ b/src/libical/icallangbind.c
@@ -2,18 +2,10 @@
FILE: icallangbind.c
CREATOR: eric 15 dec 2000
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -29,14 +21,14 @@
int *icallangbind_new_array(int size)
{
- int *p = (int *)malloc(size * sizeof(int));
+ int *p = (int *)icalmemory_new_buffer(size * sizeof(int));
return p; /* Caller handles failures */
}
void icallangbind_free_array(int *array)
{
- free(array);
+ icalmemory_free_buffer(array);
}
int icallangbind_access_array(int *array, int index)
@@ -195,7 +187,7 @@ char *icallangbind_property_eval_string_r(icalproperty *prop, const char *sep)
default:
{
char *str = icalvalue_as_ical_string_r(value);
- char *copy = (char *)malloc(strlen(str) + 1);
+ char *copy = (char *)icalmemory_new_buffer(strlen(str) + 1);
const char *i;
char *j;
@@ -221,8 +213,8 @@ char *icallangbind_property_eval_string_r(icalproperty *prop, const char *sep)
APPENDS(copy);
APPENDC('\'');
- free(copy);
- free(str);
+ icalmemory_free_buffer(copy);
+ icalmemory_free_buffer(str);
break;
}
}
@@ -244,7 +236,7 @@ char *icallangbind_property_eval_string_r(icalproperty *prop, const char *sep)
v = strchr(copy, '=');
if (v == 0) {
- free(copy);
+ icalmemory_free_buffer(copy);
continue;
}
@@ -260,7 +252,7 @@ char *icallangbind_property_eval_string_r(icalproperty *prop, const char *sep)
APPENDC('\'');
APPENDS(v);
APPENDC('\'');
- free(copy);
+ icalmemory_free_buffer(copy);
}
APPENDC('}');
diff --git a/src/libical/icallangbind.h b/src/libical/icallangbind.h
index c5ff8715..1ad4e10e 100644
--- a/src/libical/icallangbind.h
+++ b/src/libical/icallangbind.h
@@ -2,18 +2,10 @@
FILE: icallangbind.h
CREATOR: eric 25 jan 2001
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALLANGBIND_H
diff --git a/src/libical/icalmemory.c b/src/libical/icalmemory.c
index 6c1bd9ca..2b5d0490 100644
--- a/src/libical/icalmemory.c
+++ b/src/libical/icalmemory.c
@@ -2,29 +2,9 @@
FILE: icalmemory.c
CREATOR: eric 30 June 1999
- Copyright (C) 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -33,6 +13,9 @@
#include "icalmemory.h"
#include "icalerror.h"
+#if defined(MEMORY_CONSISTENCY)
+#include "test-malloc.h"
+#endif
#include <stdlib.h>
@@ -74,10 +57,10 @@ static void icalmemory_free_ring_byval(buffer_ring * br)
for (i = 0; i < BUFFER_RING_SIZE; i++) {
if (br->ring[i] != 0) {
- free(br->ring[i]);
+ icalmemory_free_buffer(br->ring[i]);
}
}
- free(br);
+ icalmemory_free_buffer(br);
}
#if defined(HAVE_PTHREAD)
@@ -109,7 +92,7 @@ static void icalmemory_free_tmp_buffer(void *buf)
return;
}
- free(buf);
+ icalmemory_free_buffer(buf);
}
#endif
@@ -122,7 +105,9 @@ static buffer_ring *buffer_ring_new(void)
buffer_ring *br;
int i;
- br = (buffer_ring *) malloc(sizeof(buffer_ring));
+ br = (buffer_ring *) icalmemory_new_buffer(sizeof(buffer_ring));
+ if (!br)
+ return NULL;
for (i = 0; i < BUFFER_RING_SIZE; i++) {
br->ring[i] = 0;
@@ -182,6 +167,9 @@ static buffer_ring *get_buffer_ring(void)
void icalmemory_add_tmp_buffer(void *buf)
{
buffer_ring *br = get_buffer_ring();
+ if (!br) {
+ return;
+ }
/* Wrap around the ring */
if (++(br->pos) == BUFFER_RING_SIZE) {
@@ -190,7 +178,7 @@ void icalmemory_add_tmp_buffer(void *buf)
/* Free buffers as their slots are overwritten */
if (br->ring[br->pos] != 0) {
- free(br->ring[br->pos]);
+ icalmemory_free_buffer(br->ring[br->pos]);
}
/* Assign the buffer to a slot */
@@ -210,7 +198,7 @@ void *icalmemory_tmp_buffer(size_t size)
size = MIN_BUFFER_SIZE;
}
- buf = (void *)malloc(size);
+ buf = (void *)icalmemory_new_buffer(size);
if (buf == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
@@ -229,6 +217,8 @@ void icalmemory_free_ring()
buffer_ring *br;
br = get_buffer_ring();
+ if (!br)
+ return;
icalmemory_free_ring_byval(br);
#if defined(HAVE_PTHREAD)
@@ -241,7 +231,15 @@ void icalmemory_free_ring()
/* Like strdup, but the buffer is on the ring. */
char *icalmemory_tmp_copy(const char *str)
{
- char *b = icalmemory_tmp_buffer(strlen(str) + 1);
+ char *b;
+
+ if (!str)
+ return NULL;
+
+ b = icalmemory_tmp_buffer(strlen(str) + 1);
+
+ if (!b)
+ return NULL;
strcpy(b, str);
@@ -250,7 +248,67 @@ char *icalmemory_tmp_copy(const char *str)
char *icalmemory_strdup(const char *s)
{
- return strdup(s);
+ size_t l;
+ char *res;
+
+ if (!s)
+ return NULL;
+
+ l = (strlen(s) + 1) * sizeof(char);
+ res = (char *) icalmemory_new_buffer(l);
+ if (res == NULL)
+ return NULL;
+
+ memcpy(res, s, l);
+
+ return res;
+}
+
+#if defined(MEMORY_CONSISTENCY)
+static icalmemory_malloc_f global_icalmem_malloc = &test_malloc;
+#elif defined(ICALMEMORY_DEFAULT_MALLOC) && !defined(S_SPLINT_S)
+static icalmemory_malloc_f global_icalmem_malloc = &ICALMEMORY_DEFAULT_MALLOC;
+#else
+static icalmemory_malloc_f global_icalmem_malloc = NULL;
+#endif
+
+#if defined(MEMORY_CONSISTENCY)
+static icalmemory_realloc_f global_icalmem_realloc = &test_realloc;
+#elif defined(ICALMEMORY_DEFAULT_REALLOC) && !defined(S_SPLINT_S)
+static icalmemory_realloc_f global_icalmem_realloc = &ICALMEMORY_DEFAULT_REALLOC;
+#else
+static icalmemory_realloc_f global_icalmem_realloc = NULL;
+#endif
+
+#if defined(MEMORY_CONSISTENCY)
+static icalmemory_free_f global_icalmem_free = &test_free;
+#elif defined(ICALMEMORY_DEFAULT_FREE) && !defined(S_SPLINT_S)
+static icalmemory_free_f global_icalmem_free = &ICALMEMORY_DEFAULT_FREE;
+#else
+static icalmemory_free_f global_icalmem_free = NULL;
+#endif
+
+void icalmemory_set_mem_alloc_funcs(icalmemory_malloc_f f_malloc,
+ icalmemory_realloc_f f_realloc,
+ icalmemory_free_f f_free)
+{
+ global_icalmem_malloc = f_malloc;
+ global_icalmem_realloc = f_realloc;
+ global_icalmem_free = f_free;
+}
+
+void icalmemory_get_mem_alloc_funcs(icalmemory_malloc_f *f_malloc,
+ icalmemory_realloc_f *f_realloc,
+ icalmemory_free_f *f_free) {
+ if (f_malloc) {
+ *f_malloc = global_icalmem_malloc;
+ }
+ if (f_realloc) {
+ *f_realloc = global_icalmem_realloc;
+ }
+ if (f_free) {
+ *f_free = global_icalmem_free;
+ }
}
/*
@@ -260,7 +318,14 @@ char *icalmemory_strdup(const char *s)
void *icalmemory_new_buffer(size_t size)
{
- void *b = malloc(size);
+ void *b;
+
+ if (global_icalmem_malloc == NULL) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ b = global_icalmem_malloc(size);
if (b == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
@@ -274,7 +339,14 @@ void *icalmemory_new_buffer(size_t size)
void *icalmemory_resize_buffer(void *buf, size_t size)
{
- void *b = realloc(buf, size);
+ void *b;
+
+ if (global_icalmem_realloc == NULL) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return 0;
+ }
+
+ b = global_icalmem_realloc(buf, size);
if (b == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
@@ -286,7 +358,12 @@ void *icalmemory_resize_buffer(void *buf, size_t size)
void icalmemory_free_buffer(void *buf)
{
- free(buf);
+ if (global_icalmem_free == NULL) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
+ }
+
+ global_icalmem_free(buf);
}
void icalmemory_append_string(char **buf, char **pos, size_t *buf_size, const char *string)
@@ -314,7 +391,11 @@ void icalmemory_append_string(char **buf, char **pos, size_t *buf_size, const ch
*buf_size = (*buf_size) * 2 + final_length;
- new_buf = realloc(*buf, *buf_size);
+ new_buf = icalmemory_resize_buffer(*buf, *buf_size);
+ if (!new_buf) {
+ // an error was set in the resize function, so we just return here.
+ return;
+ }
new_pos = (void *)((size_t) new_buf + data_length);
@@ -351,7 +432,11 @@ void icalmemory_append_char(char **buf, char **pos, size_t *buf_size, char ch)
*buf_size = (*buf_size) * 2 + final_length + 1;
- new_buf = realloc(*buf, *buf_size);
+ new_buf = icalmemory_resize_buffer(*buf, *buf_size);
+ if (!new_buf) {
+ // an error was set in the resize function, so we just return here.
+ return;
+ }
new_pos = (void *)((size_t) new_buf + data_length);
diff --git a/src/libical/icalmemory.h b/src/libical/icalmemory.h
index 7eb7e010..39541d2d 100644
--- a/src/libical/icalmemory.h
+++ b/src/libical/icalmemory.h
@@ -2,18 +2,9 @@
FILE: icalmemory.h
CREATOR: eric 30 June 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
@@ -50,7 +41,7 @@
* @return A pointer to the newly created buffer on the ring
*
* Creates a temporary buffer on the ring. Regardless of what @a size you
- * specify, the buffer will always be at least ::MIN_BUFFER_SIZE big, and it
+ * specify, the buffer will always be at least MIN_BUFFER_SIZE big, and it
* will be zeroed out.
*
* @par Error handling
@@ -62,7 +53,7 @@
* caller and the returned memory will be automatically reclaimed as more items
* are added to the ring buffer.
*
- * ### Usage
+ * @par Usage
* ```c
* char *str = icalmemory_tmp_buffer(256);
* strcpy(str, "some data");
@@ -88,7 +79,7 @@ LIBICAL_ICAL_EXPORT void *icalmemory_tmp_buffer(size_t size);
* caller, and it will be automatically reclaimed as more items are added to the
* buffer.
*
- * ### Usage
+ * @par Usage
* ```c
* const char *str = "Example string";
* char *tmp_copy = icalmemory_tmp_copy(str);
@@ -101,9 +92,13 @@ LIBICAL_ICAL_EXPORT char *icalmemory_tmp_copy(const char *str);
* @param buf The externally allocated buffer to add to the ring
*
* Adds an externally allocated buffer to the ring. This ensures that libical
- * will `free()` the buffer automatically, either after ::BUFFER_RING_SIZE other
+ * will `free()` the buffer automatically, either after BUFFER_RING_SIZE other
* buffers have been created or added, or after ::icalmemory_free_ring() has
- * been called.
+ * been called. Note that freeing the buffers is done using the
+ * icalmemory_free_buffer() function, which by default is a wrapper around stdlib's
+ * free() function. However, if the memory management functions are
+ * customized by the user, the user must make sure to only pass in buffers
+ * that have been allocated in a compatible manner.
*
* @par Error handling
* No error is raised if @a buf is `NULL`.
@@ -113,7 +108,7 @@ LIBICAL_ICAL_EXPORT char *icalmemory_tmp_copy(const char *str);
* be `free()`d manually anymore, it leads to a double-`free()` when icalmemory
* reclaims the memory.
*
- * ### Usage
+ * @par Usage
* ```c
* char *buf = calloc(256, sizeof(char));
*
@@ -125,11 +120,11 @@ LIBICAL_ICAL_EXPORT void icalmemory_add_tmp_buffer(void *buf);
/**
* @brief Frees all memory used in the ring
*
- * Frees all memory used in the ring. Depending on if ::HAVE_PTHREAD is set or
+ * Frees all memory used in the ring. Depending on if HAVE_PTHREAD is set or
* not, the ring buffer is allocated on a per-thread basis, meaning that if all
* rings are to be released, it must be called once in every thread.
*
- * ### Usage
+ * @par Usage
* ``` c
* void *buf = icalmemory_tmp_buffer(256);
*
@@ -141,9 +136,42 @@ LIBICAL_ICAL_EXPORT void icalmemory_add_tmp_buffer(void *buf);
*/
LIBICAL_ICAL_EXPORT void icalmemory_free_ring(void);
-/* Non-tmp buffers must be freed. These are mostly wrappers around
- * malloc, etc, but are used so the caller can change the memory
- * allocators in a future version of the library */
+typedef void *(*icalmemory_malloc_f)(size_t);
+typedef void *(*icalmemory_realloc_f)(void *, size_t);
+typedef void (*icalmemory_free_f)(void *);
+
+/**
+ * @brief Configures the functions to use for memory management.
+ *
+ * @param f_malloc The function to use for memory allocation.
+ * @param f_realloc The function to use for memory reallocation.
+ * @param f_free The function to use for memory deallocation.
+ *
+ * This function configures the library to use the specified functions for
+ * memory management. By default the standard system memory management
+ * functions malloc(), realloc() and free() are used.
+ *
+ * Note: The memory management functions configured via this
+ * functions are used throughout the core libical component but not within
+ * other components like libicalvcal.
+ * @since 3.1.0
+ */
+LIBICAL_ICAL_EXPORT void icalmemory_set_mem_alloc_funcs(icalmemory_malloc_f f_malloc,
+ icalmemory_realloc_f f_realloc,
+ icalmemory_free_f f_free);
+
+/**
+ * @brief Returns the functions used for memory management.
+ *
+ * @param f_malloc A pointer to the function to use for memory allocation.
+ * @param f_realloc A pointer to the function to use for memory reallocation.
+ * @param f_free A pointer to the function to use for memory deallocation.
+ *
+ * Retrieves the functions used by the library for memory management.
+ * @since 3.1.0
+ */
+LIBICAL_ICAL_EXPORT void icalmemory_get_mem_alloc_funcs(icalmemory_malloc_f *f_malloc,
+ icalmemory_realloc_f *f_realloc, icalmemory_free_f *f_free);
/**
* @brief Creates new buffer with the specified size.
@@ -156,13 +184,16 @@ LIBICAL_ICAL_EXPORT void icalmemory_free_ring(void);
* ::ICAL_NEWFAILED_ERROR and returns `NULL`.
*
* @par Ownership
- * Buffers created with this method are owned by the caller. The must be
- * released with the appropriate icalmemory_free_buffer() method.
+ * Buffers created with this method are owned by the caller. They must be
+ * released with the icalmemory_free_buffer() method.
*
* This creates a new (non-temporary) buffer of the specified @a size. All
* buffers returned by this method are zeroed-out.
*
- * ### Usage
+ * By default this function delegates to stdlib's malloc() but
+ * the used function can be changed via icalmemory_set_mem_alloc_funcs().
+ *
+ * @par Usage
* ```c
* // create buffer
* char *buffer = icalmemory_new_buffer(50);
@@ -194,7 +225,10 @@ LIBICAL_ICAL_EXPORT void *icalmemory_new_buffer(size_t size);
* appropriate icalmemory_free_buffer() method. The old buffer, @a buf, can not
* be used anymore after calling this method.
*
- * ### Usage
+ * By default this function delegates to stdlib's realloc() but
+ * the used function can be configured via icalmemory_set_mem_alloc_funcs().
+ *
+ * @par Usage
* ```c
* // create new buffer
* char *buffer = icalmemory_new_buffer(10);
@@ -220,6 +254,9 @@ LIBICAL_ICAL_EXPORT void *icalmemory_resize_buffer(void *buf, size_t size);
* @sa icalmemory_new_buffer()
*
* Releases the memory of the buffer.
+ *
+ * By default this function delegates to stdlib's free() but
+ * the used function can be configured via icalmemory_set_mem_alloc_funcs().
*/
LIBICAL_ICAL_EXPORT void icalmemory_free_buffer(void *buf);
@@ -249,7 +286,7 @@ LIBICAL_ICAL_EXPORT void icalmemory_free_buffer(void *buf);
* size of @a buf and will be changed if @a buf is reallocated. @a pos will
* point to the last byte of the new string in @a buf, usually a `'\0'`
*
- * ### Example
+ * @par Example
* ```c
* // creates a new buffer
* int buffer_len = 15;
@@ -291,7 +328,7 @@ LIBICAL_ICAL_EXPORT void icalmemory_append_string(char **buf, char **pos, size_t
* reallocated. @a pos will point to the new terminating `'\0'` character @a
* buf.
*
- * ### Example
+ * @par Example
* ```c
* // creates a new buffer
* int buffer_len = 15;
@@ -323,17 +360,19 @@ LIBICAL_ICAL_EXPORT void icalmemory_append_char(char **buf, char **pos, size_t *
*
* @par Ownership
* The returned string is owned by the caller and needs to be released with the
- * appropriate `free()` method.
+ * `icalmemory_free_buffer()` method.
*
- * A wrapper around `strdup()`. Partly to trap calls to `strdup()`, partly
- * because in `-ansi`, `gcc` on Red Hat claims that `strdup()` is undeclared.
+ * Replaces `strdup()`. The function uses icalmemory_new_buffer() for memory
+ * allocation. It also helps trapping calls to `strdup()` and solves the
+ * problem that in `-ansi`, `gcc` on Red Hat claims that `strdup()` is
+ * undeclared.
*
- * ### Usage
+ * @par Usage
* ```c
* const char *my_str = "LibIcal";
* char *dup = icalmemory_strdup(my_str);
* printf("%s\n", dup);
- * free(dup);
+ * icalmemory_free_buffer(dup);
* ```
*/
LIBICAL_ICAL_EXPORT char *icalmemory_strdup(const char *s);
diff --git a/src/libical/icalmime.c b/src/libical/icalmime.c
index 37688d0f..d1345e31 100644
--- a/src/libical/icalmime.c
+++ b/src/libical/icalmime.c
@@ -2,18 +2,10 @@
FILE: icalmime.c
CREATOR: eric 26 July 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
======================================================================*/
@@ -49,7 +41,7 @@ static void *icalmime_text_new_part(void)
struct text_part *impl;
- if ((impl = (struct text_part *)malloc(sizeof(struct text_part))) == 0) {
+ if ((impl = (struct text_part *)icalmemory_new_buffer(sizeof(struct text_part))) == 0) {
return 0;
}
@@ -77,7 +69,7 @@ static void *icalmime_textcalendar_end_part(void *part)
icalcomponent *c = icalparser_parse_string(impl->buf);
icalmemory_free_buffer(impl->buf);
- free(impl);
+ icalmemory_free_buffer(impl);
return c;
}
@@ -88,7 +80,7 @@ static void *icalmime_text_end_part_r(void *part)
struct text_part *impl = (struct text_part *)part;
buf = impl->buf;
- free(impl);
+ icalmemory_free_buffer(impl);
return buf;
}
@@ -166,7 +158,7 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
int i, last_level = 0;
icalcomponent *root = 0, *parent = 0, *comp = 0, *last = 0;
- if ((parts = (struct sspm_part *)malloc(NUM_PARTS * sizeof(struct sspm_part))) == 0) {
+ if ((parts = (struct sspm_part *)icalmemory_new_buffer(NUM_PARTS * sizeof(struct sspm_part))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -185,7 +177,7 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
const char *minor = sspm_minor_type_string(parts[i].header.minor);
if (parts[i].header.minor == SSPM_UNKNOWN_MINOR_TYPE) {
- assert(parts[i].header.minor_text != 0);
+ icalassert(parts[i].header.minor_text != 0);
minor = parts[i].header.minor_text;
}
@@ -195,7 +187,7 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
if (comp == 0) {
/* HACK Handle Error */
- assert(0);
+ icalassert(0);
}
if (parts[i].header.error != SSPM_NO_ERROR) {
@@ -245,7 +237,7 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
icalcomponent_add_property(
comp,
icalproperty_new_xlicmimecontenttype(mimeTypeCopy));
- free(mimeTypeCopy);
+ icalmemory_free_buffer(mimeTypeCopy);
}
if (parts[i].header.encoding != SSPM_NO_ENCODING) {
@@ -288,7 +280,7 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
icalcomponent_add_property(
comp,
icalproperty_new_description(descStr));
- free(descStr);
+ icalmemory_free_buffer(descStr);
parts[i].data = 0;
}
@@ -322,16 +314,16 @@ icalcomponent *icalmime_parse(char *(*get_string) (char *s, size_t size, void *d
icalcomponent_add_component(parent, comp);
} else {
- assert(0);
+ icalassert(0);
}
last = comp;
last_level = parts[i].level;
- assert(parts[i].data == 0);
+ icalassert(parts[i].data == 0);
}
sspm_free_parts(parts, NUM_PARTS);
- free(parts);
+ icalmemory_free_buffer(parts);
return root;
}
@@ -342,7 +334,7 @@ int icalmime_test(char *(*get_string) (char *s, size_t size, void *d), void *dat
struct sspm_part *parts;
int i;
- if ((parts = (struct sspm_part *)malloc(NUM_PARTS * sizeof(struct sspm_part))) == 0) {
+ if ((parts = (struct sspm_part *)icalmemory_new_buffer(NUM_PARTS * sizeof(struct sspm_part))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -363,7 +355,7 @@ int icalmime_test(char *(*get_string) (char *s, size_t size, void *d), void *dat
sspm_write_mime(parts, NUM_PARTS, &out, "To: bob@bob.org");
printf("%s\n", out);
- free(out);
+ icalmemory_free_buffer(out);
return 0;
}
diff --git a/src/libical/icalmime.h b/src/libical/icalmime.h
index ea2e1a0d..8dca137c 100644
--- a/src/libical/icalmime.h
+++ b/src/libical/icalmime.h
@@ -2,18 +2,10 @@
FILE: icalmime.h
CREATOR: eric 26 July 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALMIME_H
diff --git a/src/libical/icalparameter.c b/src/libical/icalparameter.c
index 0856b3c2..e4bf5842 100644
--- a/src/libical/icalparameter.c
+++ b/src/libical/icalparameter.c
@@ -2,18 +2,9 @@
FILE: icalderivedparameters.{c,h}
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalderivedparameters.{c,h}
@@ -36,7 +27,7 @@ LIBICAL_ICAL_EXPORT struct icalparameter_impl *icalparameter_new_impl(icalparame
{
struct icalparameter_impl *v;
- if ((v = (struct icalparameter_impl *)malloc(sizeof(struct icalparameter_impl))) == 0) {
+ if ((v = (struct icalparameter_impl *)icalmemory_new_buffer(sizeof(struct icalparameter_impl))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -67,18 +58,18 @@ void icalparameter_free(icalparameter *param)
}
if (param->string != 0) {
- free((void *)param->string);
+ icalmemory_free_buffer((void *)param->string);
}
if (param->x_name != 0) {
- free((void *)param->x_name);
+ icalmemory_free_buffer((void *)param->x_name);
}
memset(param, 0, sizeof(icalparameter));
param->parent = 0;
param->id[0] = 'X';
- free(param);
+ icalmemory_free_buffer(param);
}
icalparameter *icalparameter_clone(const icalparameter *old)
@@ -141,7 +132,7 @@ icalparameter *icalparameter_new_from_string(const char *str)
if (eq == 0) {
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- free(cpy);
+ icalmemory_free_buffer(cpy);
return 0;
}
@@ -153,7 +144,7 @@ icalparameter *icalparameter_new_from_string(const char *str)
if (kind == ICAL_NO_PARAMETER) {
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- free(cpy);
+ icalmemory_free_buffer(cpy);
return 0;
}
@@ -165,7 +156,7 @@ icalparameter *icalparameter_new_from_string(const char *str)
icalparameter_set_iana_name(param, cpy);
}
- free(cpy);
+ icalmemory_free_buffer(cpy);
return param;
}
@@ -297,7 +288,7 @@ char *icalparameter_as_ical_string_r(icalparameter *param)
if (param->kind == ICAL_NO_PARAMETER ||
param->kind == ICAL_ANY_PARAMETER || kind_string == 0) {
icalerror_set_errno(ICAL_BADARG_ERROR);
- free(buf);
+ icalmemory_free_buffer(buf);
return 0;
}
@@ -315,7 +306,7 @@ char *icalparameter_as_ical_string_r(icalparameter *param)
icalmemory_append_string(&buf, &buf_ptr, &buf_size, str);
} else {
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- free(buf);
+ icalmemory_free_buffer(buf);
return 0;
}
@@ -352,7 +343,7 @@ void icalparameter_set_xname(icalparameter *param, const char *v)
icalerror_check_arg_rv((v != 0), "v");
if (param->x_name != 0) {
- free((void *)param->x_name);
+ icalmemory_free_buffer((void *)param->x_name);
}
param->x_name = icalmemory_strdup(v);
@@ -375,7 +366,7 @@ void icalparameter_set_xvalue(icalparameter *param, const char *v)
icalerror_check_arg_rv((v != 0), "v");
if (param->string != 0) {
- free((void *)param->string);
+ icalmemory_free_buffer((void *)param->string);
}
param->string = icalmemory_strdup(v);
diff --git a/src/libical/icalparameter.h b/src/libical/icalparameter.h
index 8bbc96bc..93cd4855 100644
--- a/src/libical/icalparameter.h
+++ b/src/libical/icalparameter.h
@@ -2,18 +2,10 @@
FILE: icalparam.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/**
@@ -34,9 +26,9 @@
/*typedef struct icalparameter_impl icalparameter;*/
/**
- * @brief Creates new ::icalparameter object.
- * @param kind The kind of ::icalparameter to create.
- * @return An ::icalparameter with the given kind.
+ * @brief Creates new icalparameter object.
+ * @param kind The kind of icalparameter to create.
+ * @return An icalparameter with the given kind.
*
* @par Error handling
* If there was an internal error regarding
@@ -47,7 +39,7 @@
* Objects created by this method are owned by the caller and
* must be released with the icalparameter_free() method.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parameter
* icalparameter *parameter = icalparameter_new();
@@ -63,9 +55,9 @@
LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new(icalparameter_kind kind);
/**
- * @brief Creates new ::icalparameter as a clone of the given one.
+ * @brief Creates new icalparameter as a clone of the given one.
* @param p The existing, non-`NULL` parameter to clone.
- * @return An ::icalparameter that is a clone of the given one.
+ * @return An icalparameter that is a clone of the given one.
*
* @par Error handling
* If @a p is `NULL`, it returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR.
@@ -76,7 +68,7 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new(icalparameter_kind kind);
* Objects created by this method are owned by the caller and
* must be released with the icalparameter_free() method.
*
- * ### Usage
+ * @par Usage
* ```x
* // create an icalparameter
* icalparameter *param = icalparameter_new_from_string("ROLE=CHAIR");
@@ -103,9 +95,9 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_clone(const icalparameter *p);
LIBICAL_ICAL_EXPORT LIBICAL_DEPRECATED(icalparameter *icalparameter_new_clone(icalparameter *p));
/**
- * @brief Creates new ::icalparameter object from string
- * @param value The string from which to create the ::icalparameter, in the form `"PARAMNAME=VALUE"`
- * @return An ::icalparameter that corresponds to the given string.
+ * @brief Creates new icalparameter object from string
+ * @param value The string from which to create the icalparameter, in the form `"PARAMNAME=VALUE"`
+ * @return An icalparameter that corresponds to the given string.
*
* @par Error handling
* If there was an internal error copying data, it returns `NULL` and sets
@@ -117,7 +109,7 @@ LIBICAL_ICAL_EXPORT LIBICAL_DEPRECATED(icalparameter *icalparameter_new_clone(ic
* Objects created by this method are owned by the caller and
* must be released with the icalparameter_free() method.
*
- * ### Usage
+ * @par Usage
* ```c
* icalparameter *param = icalparameter_new_from_string("ROLE=CHAIR");
*
@@ -131,10 +123,10 @@ LIBICAL_ICAL_EXPORT LIBICAL_DEPRECATED(icalparameter *icalparameter_new_clone(ic
LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new_from_string(const char *value);
/**
- * @brief Creates new ::icalparameter of a given @a kind with a given @a value
- * @param kind The kind of ::icalparameter to create
+ * @brief Creates new icalparameter of a given @a kind with a given @a value
+ * @param kind The kind of icalparameter to create
* @param value The value of the parameter
- * @return An ::icalparameter with the given kind and value.
+ * @return An icalparameter with the given kind and value.
*
* @par Error handling
* If value is `NULL`, it returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR.
@@ -143,7 +135,7 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new_from_string(const char *val
* Objects created by this method are owned by the caller and
* must be released with the icalparameter_free() method.
*
- * ### Example
+ * @par Example
* ```c
* // create new parameter
* icalparameter *param;
@@ -161,7 +153,7 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new_from_value_string(icalparam
const char *value);
/**
- * @brief Frees an ::icalparameter object.
+ * @brief Frees an icalparameter object.
* @param parameter The icalparameter to free
*
* This method needs to be used on all parameter objects returned
@@ -170,7 +162,7 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new_from_value_string(icalparam
* and on cloned parameter objects returned by icalparameter_clone()
* when these object are not needed anymore and to be released.
*
- * ### Usage
+ * @par Usage
* ```c
* icalparameter *param = icalparameter_new();
*
@@ -185,8 +177,8 @@ LIBICAL_ICAL_EXPORT icalparameter *icalparameter_new_from_value_string(icalparam
LIBICAL_ICAL_EXPORT void icalparameter_free(icalparameter *parameter);
/**
- * @brief Converts ::icalparameter into a string representation
- * @param parameter The ::icalparameter to convert
+ * @brief Converts icalparameter into a string representation
+ * @param parameter The icalparameter to convert
* @return A string representing the parameter according to RFC5445/RFC6868.
* @sa icalparameter_as_ical_string_r()
*
@@ -203,7 +195,7 @@ LIBICAL_ICAL_EXPORT void icalparameter_free(icalparameter *parameter);
* the library. A version of this function, which returns strings
* that are not owned by libical, is icalparameter_as_ical_string_r().
*
- * ### Usage
+ * @par Usage
* ```c
* icalparameter *param = icalparameter_new_from_string("ROLE=CHAIR");
*
@@ -217,8 +209,8 @@ LIBICAL_ICAL_EXPORT void icalparameter_free(icalparameter *parameter);
LIBICAL_ICAL_EXPORT char *icalparameter_as_ical_string(icalparameter *parameter);
/**
- * @brief Converts ::icalparameter into an string representation according to RFC5445/RFC6868.
- * @param parameter The ::icalparameter to convert
+ * @brief Converts icalparameter into an string representation according to RFC5445/RFC6868.
+ * @param parameter The icalparameter to convert
* @return A string representing the parameter
* @sa icalparameter_as_ical_string()
*
@@ -231,18 +223,18 @@ LIBICAL_ICAL_EXPORT char *icalparameter_as_ical_string(icalparameter *parameter)
*
* @par Ownership
* Strings returned by this method are owned by the caller, thus they need
- * to be manually `free()`d after use. A version of this function which returns
- * strings that do not need to be freed manually is
- * icalparameter_as_ical_string().
+ * to be manually `icalmemory_free_buffer()`d after use.
+ * A version of this function which returns strings that do not
+ * need to be freed manually is icalparameter_as_ical_string().
*
- * ### Usage
+ * @par Usage
* ```c
* icalparameter *param = icalparameter_new_from_string("ROLE=CHAIR");
*
* if(param) {
* char *str = icalparameter_as_ical_string(param);
* printf("%s\n", str);
- * free(str);
+ * icalmemory_free_buffer(str);
* }
*
* icalparameter_free(param);
@@ -302,19 +294,19 @@ LIBICAL_ICAL_EXPORT int icalparameter_isa_parameter(void *param);
/**
* @brief Sets the X-name of @a param to @a v
- * @param param The ::icalparameter to change
+ * @param param The icalparameter to change
* @param v The X-name to set @a param to
* @sa icalparameter_get_xname()
*
* @par Error handling
- * If either @a param or @a v are `NULL`, it sets ::icalerrno to ::ICAL_BARARG_ERROR.
+ * If either @a param or @a v are `NULL`, it sets ::icalerrno to ICAL_BARARG_ERROR.
* If there is an error acquiring memory, it sets `errno` to `ENOMEM`.
*
* @par Ownership
* The passed string @a v stays in the ownership of the caller - libical
* creates a copy of it.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new parameter
* icalparameter *param = icalparameter_new();
@@ -332,19 +324,19 @@ LIBICAL_ICAL_EXPORT void icalparameter_set_xname(icalparameter *param, const cha
/**
* @brief Returns the X-name of @a param
- * @param param The ::icalparameter whose X-name is to be returned
+ * @param param The icalparameter whose X-name is to be returned
* @return A string representing the X-name of @a param
* @sa icalparameter_set_xname()
*
* @par Error handling
* Returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR when a `NULL`
- * is passed instead of an ::icalparameter.
+ * is passed instead of an icalparameter.
*
* @par Ownership
* The string that is returned stays owned by libical and must not
* be freed by the caller.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new parameter
* icalparameter *param = icalparameter_new();
@@ -362,19 +354,19 @@ LIBICAL_ICAL_EXPORT const char *icalparameter_get_xname(icalparameter *param);
/**
* @brief Sets the X-value of @a param to @a v
- * @param param The ::icalparameter to change
+ * @param param The icalparameter to change
* @param v The X-value to set @a param to
* @sa icalparameter_get_xvalue()
*
* @par Error handling
- * If either @a param or @a v are `NULL`, it sets ::icalerrno to ::ICAL_BARARG_ERROR.
+ * If either @a param or @a v are `NULL`, it sets ::icalerrno to ICAL_BARARG_ERROR.
* If there is an error acquiring memory, it sets `errno` to `ENOMEM`.
*
* @par Ownership
* The passed string @a v stays in the ownership of the caller - libical
* creates a copy of it.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parameter
* icalparameter *param = icalparameter_new_from_string("X-TEST=FAIL");
@@ -393,19 +385,19 @@ LIBICAL_ICAL_EXPORT void icalparameter_set_xvalue(icalparameter *param, const ch
/**
* @brief Returns the X-value of @a param
- * @param param The ::icalparameter whose X-value is to be returned
+ * @param param The icalparameter whose X-value is to be returned
* @return A string representing the X-value of @a param
* @sa icalparameter_set_xvalue()
*
* @par Error handling
* Returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR when a `NULL`
- * is passed instead of an ::icalparameter.
+ * is passed instead of an icalparameter.
*
* @par Ownership
* The string that is returned stays owned by libical and must not
* be freed by the caller.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parameter
* icalparameter *param = icalparameter_new_from_string("X-TEST=FAIL");
@@ -431,14 +423,14 @@ LIBICAL_ICAL_EXPORT const char *icalparameter_get_xvalue(icalparameter *param);
* @sa icalparameter_get_iana_name()
*
* @par Error handling
- * If either @a param or @a v are `NULL`, it sets ::icalerrno to ::ICAL_BARARG_ERROR.
+ * If either @a param or @a v are `NULL`, it sets :calerrno to ICAL_BARARG_ERROR.
* If there is an error acquiring memory, it sets `errno` to `ENOMEM`.
*
* @par Ownership
* The passed string @a v stays in the ownership of the caller - libical
* creates a copy of it.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new parameter
* icalparameter *param = icalparameter_new();
@@ -456,19 +448,19 @@ LIBICAL_ICAL_EXPORT void icalparameter_set_iana_name(icalparameter *param, const
/**
* @brief Returns the IANA name of @a param
- * @param param The ::icalparameter whose IANA name is to be returned
+ * @param param The icalparameter whose IANA name is to be returned
* @return A string representing the IANA name of @a param
* @sa icalparameter_set_iana_name()
*
* @par Error handling
* Returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR when a `NULL`
- * is passed instead of an ::icalparameter.
+ * is passed instead of an icalparameter.
*
* @par Ownership
* The string that is returned stays owned by libical and must not
* be freed by the caller.
*
- * ### Usage
+ * @par Usage
* ```c
* // creates new parameter
* icalparameter *param = icalparameter_new();
@@ -486,19 +478,19 @@ LIBICAL_ICAL_EXPORT const char *icalparameter_get_iana_name(icalparameter *param
/**
* @brief Sets the IANA value of @a param to @a v
- * @param param The ::icalparameter to change
+ * @param param The icalparameter to change
* @param v The IANA value to set @a param to
* @sa icalparameter_get_iana_value()
*
* @par Error handling
- * If either @a param or @a v are `NULL`, it sets ::icalerrno to ::ICAL_BARARG_ERROR.
+ * If either @a param or @a v are `NULL`, it sets ::icalerrno to ICAL_BARARG_ERROR.
* If there is an error acquiring memory, it sets `errno` to `ENOMEM`.
*
* @par Ownership
* The passed string @a v stays in the ownership of the caller - libical
* creates a copy of it.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parameter
* icalparameter *param = icalparameter_new_from_string("ROLE=ATTENDEE");
@@ -517,19 +509,19 @@ LIBICAL_ICAL_EXPORT void icalparameter_set_iana_value(icalparameter *param, cons
/**
* @brief Returns the IANA value of @a param
- * @param param The ::icalparameter whose value is to be returned
+ * @param param The icalparameter whose value is to be returned
* @return A string representing the value of @a param
* @sa icalparameter_set_iana_value()
*
* @par Error handling
* Returns `NULL` and sets ::icalerrno to ::ICAL_BADARG_ERROR when a `NULL`
- * is passed instead of an ::icalparameter.
+ * is passed instead of an icalparameter.
*
* @par Ownership
* The string that is returned stays owned by libical and must not
* be freed by the caller.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parameter
* icalparameter *param = icalparameter_new_from_string("ROLE=ATTENDEE");
@@ -557,9 +549,9 @@ LIBICAL_ICAL_EXPORT const char *icalparameter_get_iana_value(icalparameter *para
* ::icalerrno to ::ICAL_BADARG_ERROR.
*
* @par Ownership
- * Does not take ownership of either ::icalparameter.
+ * Does not take ownership of either icalparameter.
*
- * ### Example
+ * @par Example
* ```c
* // create two parameters
* icalparameter *param1 = icalparameter_new_from_string("ROLE=CHAIR");
@@ -578,18 +570,18 @@ LIBICAL_ICAL_EXPORT int icalparameter_has_same_name(icalparameter *param1, icalp
/* Convert enumerations */
/**
- * @brief Returns a string representing the given ::icalparameter_kind
+ * @brief Returns a string representing the given icalparameter_kind
* @param kind The icalparameter_kind
* @return A string representing @a kind
*
* @par Error handling
- * When passed a non-existing ::icalparameter_kind, it returns `NULL`.
+ * When passed a non-existing icalparameter_kind, it returns `NULL`.
*
* @par Ownership
* The string that is returned by this function is owned by libical and
* must not be freed by the caller.
*
- * ### Usage
+ * @par Usage
* ```c
* assert(0 == strcmp(icalparameter_kind_to_string(ICAL_ROLE_PARAMETER), "ROLE"));
* assert(0 == strcmp(icalparameter_kind_to_string(ICAL_EMAIL_PARAMETER), "EMAIL));
@@ -599,20 +591,20 @@ LIBICAL_ICAL_EXPORT int icalparameter_has_same_name(icalparameter *param1, icalp
LIBICAL_ICAL_EXPORT const char *icalparameter_kind_to_string(icalparameter_kind kind);
/**
- * @brief Returns the ::icalparameter_kind for a given string
+ * @brief Returns the icalparameter_kind for a given string
* @param string A string describing an icalparameter_kind
* @return An icalparameter_kind
*
* @par Error handling
- * Returns ::ICAL_NO_PARAMETER if @a string is `NULL`.
+ * Returns ICAL_NO_PARAMETER if @a string is `NULL`.
* If it can't find the parameter, depending on
* the ical_get_unknown_token_handling_setting(), it returns either
- * ::ICAL_NO_PARAMETER or ::ICAL_IANA_PARAMETER.
+ * ICAL_NO_PARAMETER or ICAL_IANA_PARAMETER.
*
* @par Ownership
* Does not take ownership of @a string.
*
- * ### Usage
+ * @par Usage
* ```c
* assert(icalparameter_string_to_kind("ROLE") == ICAL_ROLE_PARAMETER);
* assert(icalparameter_string_to_kind("EMAIL") == ICAL_EMAIL_PARAMETER);
@@ -622,11 +614,11 @@ LIBICAL_ICAL_EXPORT const char *icalparameter_kind_to_string(icalparameter_kind
LIBICAL_ICAL_EXPORT icalparameter_kind icalparameter_string_to_kind(const char *string);
/**
- * @brief Checks the validity of a ::icalparameter_kind
+ * @brief Checks the validity of a icalparameter_kind
* @param kind The icalparameter_kind
* @return 1 if @a kind is valid, 0 otherwise
*
- * ### Usage
+ * @par Usage
* ```c
* assert(icalparameter_kind_is_valid(ICAL_ROLE_PARAMETER));
* ```
diff --git a/src/libical/icalparameter_cxx.cpp b/src/libical/icalparameter_cxx.cpp
index 6b26a454..70510533 100644
--- a/src/libical/icalparameter_cxx.cpp
+++ b/src/libical/icalparameter_cxx.cpp
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief Implementation of C++ Wrapper for icalparameter.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#include "icalparameter_cxx.h"
diff --git a/src/libical/icalparameter_cxx.h b/src/libical/icalparameter_cxx.h
index 81c4d9e6..dfe98bbc 100644
--- a/src/libical/icalparameter_cxx.h
+++ b/src/libical/icalparameter_cxx.h
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief Definition of C++ Wrapper for icalparameter.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifndef ICALPARAMETER_CXX_H
diff --git a/src/libical/icalparameterimpl.h b/src/libical/icalparameterimpl.h
index 0d710978..67b4c76f 100644
--- a/src/libical/icalparameterimpl.h
+++ b/src/libical/icalparameterimpl.h
@@ -2,18 +2,9 @@
FILE: icalparameterimpl.h
CREATOR: eric 09 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalderivedparameters.{c,h}
diff --git a/src/libical/icalparser.c b/src/libical/icalparser.c
index 4ab1b1ca..3aaba0c8 100644
--- a/src/libical/icalparser.c
+++ b/src/libical/icalparser.c
@@ -2,31 +2,11 @@
FILE: icalparser.c
CREATOR: eric 04 August 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- The Initial Developer of the Original Code is Eric Busboom
+ The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -102,7 +82,7 @@ icalparser *icalparser_new(void)
{
struct icalparser_impl *impl = 0;
- if ((impl = (struct icalparser_impl *)malloc(sizeof(struct icalparser_impl))) == 0) {
+ if ((impl = (struct icalparser_impl *)icalmemory_new_buffer(sizeof(struct icalparser_impl))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -135,7 +115,7 @@ void icalparser_free(icalparser *parser)
pvl_free(parser->components);
- free(parser);
+ icalmemory_free_buffer(parser);
}
void icalparser_set_gen_data(icalparser *parser, void *data)
@@ -323,7 +303,7 @@ static char *parser_get_param_name_heap(char *line, char **end)
*end = *end + 1;
next = (**end == '"') ? *end : parser_get_next_char('"', *end, 0);
if (next == 0) {
- free(str);
+ icalmemory_free_buffer(str);
*end = NULL;
return 0;
}
@@ -557,7 +537,7 @@ char *icalparser_get_line(icalparser *parser,
} else {
/* No data in output; return and signal that there
is no more input */
- free(line);
+ icalmemory_free_buffer(line);
return 0;
}
}
@@ -661,8 +641,8 @@ icalcomponent *icalparser_parse(icalparser *parser,
/* This is bad news... assert? */
}
- assert(parser->root_component == 0);
- assert(pvl_count(parser->components) == 0);
+ icalassert(parser->root_component == 0);
+ icalassert(pvl_count(parser->components) == 0);
if (root == 0) {
/* Just one component */
@@ -682,7 +662,7 @@ icalcomponent *icalparser_parse(icalparser *parser,
} else {
/* Badness */
- assert(0);
+ icalassert(0);
}
c = 0;
@@ -820,7 +800,7 @@ icalcomponent *icalparser_add_line(icalparser *parser, char *line)
(void)icalparser_clean(parser); /* may reset parser->root_component */
}
- assert(pvl_count(parser->components) == 0);
+ icalassert(pvl_count(parser->components) == 0);
parser->state = ICALPARSER_SUCCESS;
rtrn = parser->root_component;
@@ -1247,7 +1227,7 @@ icalcomponent *icalparser_add_line(icalparser *parser, char *line)
if (pvl_data(pvl_tail(parser->components)) == 0 && parser->level == 0) {
/* HACK. Does this clause ever get executed? */
parser->state = ICALPARSER_SUCCESS;
- assert(0);
+ icalassert(0);
return parser->root_component;
} else {
parser->state = ICALPARSER_IN_PROGRESS;
@@ -1365,6 +1345,9 @@ icalcomponent *icalparser_parse_string(const char *str)
d.str = str;
p = icalparser_new();
+ if (!p)
+ return NULL;
+
icalparser_set_gen_data(p, &d);
icalerror_set_error_state(ICAL_MALFORMEDDATA_ERROR, ICAL_ERROR_NONFATAL);
diff --git a/src/libical/icalparser.h b/src/libical/icalparser.h
index 765f7730..e8dfb6a9 100644
--- a/src/libical/icalparser.h
+++ b/src/libical/icalparser.h
@@ -2,18 +2,9 @@
FILE: icalparser.h
CREATOR: eric 20 April 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalparser.h
======================================================================*/
@@ -31,7 +22,7 @@
* This file provides methods to parse iCalendar-formatted data
* into the structures provided by this library.
*
- * ### Usage
+ * @par Usage
* Create a new parser via icalparser_new_parser(), then add lines one at
* a time with icalparser_add_line(). icalparser_add_line() will return
* non-zero when it has finished with a component.
@@ -73,18 +64,18 @@ typedef enum icalparser_state
typedef char *(*icalparser_line_gen_func) (char *s, size_t size, void *d);
/**
- * @brief Creates a new ::icalparser.
- * @return An ::icalparser object
+ * @brief Creates a new icalparser.
+ * @return An icalparser object
*
* @par Error handling
* On error, it returns `NULL` and sets ::icalerrno to
* ::ICAL_NEWFAILED_ERROR.
*
* @par Ownership
- * All ::icalparser objects created with this function need to be
+ * All icalparser objects created with this function need to be
* freed using the icalparser_free() function.
*
- * ### Usage
+ * @par Usage
* ```c
* // create new parser
* icalparser *parser = icalparser_new();
@@ -98,7 +89,7 @@ typedef char *(*icalparser_line_gen_func) (char *s, size_t size, void *d);
LIBICAL_ICAL_EXPORT icalparser *icalparser_new(void);
/**
- * @brief Adds a single line to be parsed by the ::icalparser.
+ * @brief Adds a single line to be parsed by the icalparser.
* @param parser The parser to use
* @param str A string representing a single line of RFC5545-formatted iCalendar data
* @return When this was the last line of the component to be parsed,
@@ -112,15 +103,15 @@ LIBICAL_ICAL_EXPORT icalparser *icalparser_new(void);
* - If @a line is `NULL`, it returns `NULL` and sets the @a parser's ::icalparser_state to
* ::ICALPARSER_ERROR.
* - For errors during parsing, the functions can set the ::icalparser_state to
- * ::ICALPARSER_ERROR and/or return components of the type ::ICAL_XLICINVALID_COMPONENT,
- * or components with properties of the type ::ICAL_XLICERROR_PROPERTY.
+ * ::ICALPARSER_ERROR and/or return components of the type ICAL_XLICINVALID_COMPONENT,
+ * or components with properties of the type ICAL_XLICERROR_PROPERTY.
*
* @par Ownership
* Ownership of the @a str is transferred to libical upon calling this
- * method. The returned ::icalcomponent is owned by the caller and needs
+ * method. The returned icalcomponent is owned by the caller and needs
* to be `free()`d with the appropriate method after it's no longer needed.
*
- * ### Example
+ * @par Example
* ```c
* char* read_stream(char *s, size_t size, void *d)
* {
@@ -159,9 +150,9 @@ LIBICAL_ICAL_EXPORT icalparser *icalparser_new(void);
LIBICAL_ICAL_EXPORT icalcomponent *icalparser_add_line(icalparser *parser, char *str);
/**
- * @brief Cleans out an ::icalparser and returns whatever it has parsed so far.
- * @param parser The ::icalparser to clean
- * @return The parsed ::icalcomponent
+ * @brief Cleans out an icalparser and returns whatever it has parsed so far.
+ * @param parser The icalparser to clean
+ * @return The parsed icalcomponent
*
* @par Error handling
* If @a parser is `NULL`, it returns `NULL` and sets ::icalerrno to
@@ -169,7 +160,7 @@ LIBICAL_ICAL_EXPORT icalcomponent *icalparser_add_line(icalparser *parser, char
* property into the affected components.
*
* @par Ownership
- * The returned ::icalcomponent is property of the caller and needs to be
+ * The returned icalcomponent is property of the caller and needs to be
* free'd with icalcomponent_free() after use.
*
* This will parse components even if it hasn't encountered a proper
@@ -184,7 +175,7 @@ LIBICAL_ICAL_EXPORT icalcomponent *icalparser_clean(icalparser *parser);
* @param parser The (valid, non-`NULL`) parser object
* @return The current state of the icalparser, as an ::icalparser_state
*
- * ### Example
+ * @par Example
* ```c
* icalparser *parser = icalparser_new();
*
@@ -202,10 +193,10 @@ LIBICAL_ICAL_EXPORT icalcomponent *icalparser_clean(icalparser *parser);
LIBICAL_ICAL_EXPORT icalparser_state icalparser_get_state(icalparser *parser);
/**
- * @brief Frees an ::icalparser object.
- * @param parser The ::icalparser to be freed.
+ * @brief Frees an icalparser object.
+ * @param parser The icalparser to be freed.
*
- * ### Example
+ * @par Example
* ```c
* icalparser *parser = icalparser_new();
*
@@ -232,14 +223,14 @@ LIBICAL_ICAL_EXPORT void icalparser_free(icalparser *parser);
* - If data read by @a line_gen_func is `NULL`, it returns `NULL`
* and sets the @a parser's ::icalparser_state to ::ICALPARSER_ERROR.
* - For errors during parsing, the functions can set the ::icalparser_state to
- * ::ICALPARSER_ERROR and/or return components of the type ::ICAL_XLICINVALID_COMPONENT,
- * or components with properties of the type ::ICAL_XLICERROR_PROPERTY.
+ * ::ICALPARSER_ERROR and/or return components of the type ICAL_XLICINVALID_COMPONENT,
+ * or components with properties of the type ICAL_XLICERROR_PROPERTY.
*
* @par Ownership
- * The returned ::icalcomponent is owned by the caller of the function, and
+ * The returned icalcomponent is owned by the caller of the function, and
* needs to be `free()`d with the appropriate method when no longer needed.
*
- * ### Example
+ * @par Example
* ```c
* char* read_stream(char *s, size_t size, void *d)
* {
@@ -284,18 +275,18 @@ LIBICAL_ICAL_EXPORT icalcomponent *icalparser_parse(icalparser *parser,
LIBICAL_ICAL_EXPORT void icalparser_set_gen_data(icalparser *parser, void *data);
/**
- * @brief Parses a string and returns the parsed ::icalcomponent.
+ * @brief Parses a string and returns the parsed icalcomponent.
* @param str The iCal formatted data to be parsed
- * @return An ::icalcomponent representing the iCalendar
+ * @return An icalcomponent representing the iCalendar
*
* @par Error handling
* On error, returns `NULL` and sets ::icalerrno
*
* @par Ownership
- * The returned ::icalcomponent is owned by the caller of the function, and
+ * The returned icalcomponent is owned by the caller of the function, and
* needs to be free'd with the appropriate functions after use.
*
- * ### Example
+ * @par Example
* ```c
* char *ical_string;
*
diff --git a/src/libical/icalperiod.c b/src/libical/icalperiod.c
index 0dc3cb01..f3e57aab 100644
--- a/src/libical/icalperiod.c
+++ b/src/libical/icalperiod.c
@@ -2,18 +2,9 @@
FILE: icalperiod.c
CREATOR: eric 02 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libical/icalperiod.h b/src/libical/icalperiod.h
index fb8e3140..410a3bc4 100644
--- a/src/libical/icalperiod.h
+++ b/src/libical/icalperiod.h
@@ -2,18 +2,9 @@
FILE: icalperiod.h
CREATOR: eric 26 Jan 2001
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -57,7 +48,7 @@ struct icalperiodtype
* If @a str is not properly formatted, it sets ::icalerrno to
* ::ICAL_MALFORMEDDATA_ERROR and returns icalperiodtype_null_period().
*
- * ### Data format
+ * @par Data format
* There are two ways to specify a duration; either a start time
* and an end time can be specified, or a start time and a duration.
* The format for there is as such:
@@ -68,7 +59,7 @@ struct icalperiodtype
* icaltime_from_string(), and the format for the duration
* is the same as that used by icaldurationtype_from_string().
*
- * ### Usage
+ * @par Usage
* ```c
* // create icalperiodtype
* const char *period_string = "20170606T090000/20170607T090000";
@@ -94,7 +85,7 @@ LIBICAL_ICAL_EXPORT struct icalperiodtype icalperiodtype_from_string(const char
* The string returned by this method is owned by libical and must not be
* `free()` by the caller.
*
- * ### Example
+ * @par Example
* ```c
* // create icalperiodtype
* const char *period_string = "20170606T090000/20170607T090000";
@@ -120,7 +111,7 @@ LIBICAL_ICAL_EXPORT const char *icalperiodtype_as_ical_string(struct icalperiodt
* The string returned by this method is owned by the caller and must be
* released with the appropriate function after use.
*
- * ### Example
+ * @par Example
* ```c
* // create icalperiodtype
* const char *period_string = "20170606T090000/20170607T090000";
@@ -139,7 +130,7 @@ LIBICAL_ICAL_EXPORT char *icalperiodtype_as_ical_string_r(struct icalperiodtype
* @return An ::icalperiodtype representing a null period
* @sa icalperiodtype_is_null_period()
*
- * ### Usage
+ * @par Usage
* ```c
* // creates null period
* struct icalperiodtype period = icalperiodtype_null_period();
@@ -158,7 +149,7 @@ LIBICAL_ICAL_EXPORT struct icalperiodtype icalperiodtype_null_period(void);
* @return 1 if @a p is a null period, 0 otherwise
* @sa icalperiodtype_null_period()
*
- * ### Usage
+ * @par Usage
* ```c
* // creates null period
* struct icalperiodtype period = icalperiodtype_null_period();
@@ -174,7 +165,7 @@ LIBICAL_ICAL_EXPORT int icalperiodtype_is_null_period(struct icalperiodtype p);
* @param p The time period to check
* @return 1 if @a p is a valid period, 0 otherwise
*
- * ### Usage
+ * @par Usage
* ```c
* // creates null period
* struct icalperiodtype period = icalperiodtype_null_period();
diff --git a/src/libical/icalproperty.c b/src/libical/icalproperty.c
index a93d87ad..8227c185 100644
--- a/src/libical/icalproperty.c
+++ b/src/libical/icalproperty.c
@@ -2,18 +2,9 @@
FILE: icalproperty.c
CREATOR: eric 28 April 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalproperty.c
======================================================================*/
@@ -67,7 +58,7 @@ icalproperty *icalproperty_new_impl(icalproperty_kind kind)
if (!icalproperty_kind_is_valid(kind))
return NULL;
- if ((prop = (icalproperty *) malloc(sizeof(icalproperty))) == 0) {
+ if ((prop = (icalproperty *) icalmemory_new_buffer(sizeof(icalproperty))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -160,7 +151,7 @@ icalproperty *icalproperty_new_from_string(const char *str)
if (comp == 0) {
icalerror_set_errno(ICAL_PARSE_ERROR);
- free(buf);
+ icalmemory_free_buffer(buf);
return 0;
}
@@ -171,7 +162,7 @@ icalproperty *icalproperty_new_from_string(const char *str)
icalcomponent_remove_property(comp, prop);
icalcomponent_free(comp);
- free(buf);
+ icalmemory_free_buffer(buf);
if (errors > 0) {
icalproperty_free(prop);
@@ -203,7 +194,7 @@ void icalproperty_free(icalproperty *p)
pvl_free(p->parameters);
if (p->x_name != 0) {
- free(p->x_name);
+ icalmemory_free_buffer(p->x_name);
}
p->kind = ICAL_NO_PROPERTY;
@@ -213,7 +204,7 @@ void icalproperty_free(icalproperty *p)
p->x_name = 0;
p->id[0] = 'X';
- free(p);
+ icalmemory_free_buffer(p);
}
/* This returns where the start of the next line should be. chars_left does
@@ -422,13 +413,13 @@ char *icalproperty_as_ical_string_r(icalproperty *prop)
}
if (kind == ICAL_VALUE_PARAMETER) {
- free((char *)kind_string);
+ icalmemory_free_buffer((char *)kind_string);
continue;
}
icalmemory_append_string(&buf, &buf_ptr, &buf_size, ";");
icalmemory_append_string(&buf, &buf_ptr, &buf_size, kind_string);
- free((char *)kind_string);
+ icalmemory_free_buffer((char *)kind_string);
}
/* Append value */
@@ -447,7 +438,7 @@ char *icalproperty_as_ical_string_r(icalproperty *prop)
icalmemory_append_string(&buf, &buf_ptr, &buf_size, "ERROR: No Value");
#endif
}
- free(str);
+ icalmemory_free_buffer(str);
} else {
#if ICAL_ALLOW_EMPTY_PROPERTIES == 0
icalmemory_append_string(&buf, &buf_ptr, &buf_size, "ERROR: No Value");
@@ -600,13 +591,13 @@ char *icalproperty_get_parameter_as_string_r(icalproperty *prop, const char *nam
if (t == 0) {
icalerror_set_errno(ICAL_INTERNAL_ERROR);
- free(str);
+ icalmemory_free_buffer(str);
return 0;
}
/* Strip the property name and the equal sign */
pv = icalmemory_strdup(t + 1);
- free(str);
+ icalmemory_free_buffer(str);
/* Is the string quoted? */
pvql = strchr(pv, '"');
@@ -616,13 +607,13 @@ char *icalproperty_get_parameter_as_string_r(icalproperty *prop, const char *nam
/* Strip everything up to the first quote */
str = icalmemory_strdup(pvql + 1);
- free(pv);
+ icalmemory_free_buffer(pv);
/* Search for the end quote */
pvqr = strrchr(str, '"');
if (pvqr == 0) {
icalerror_set_errno(ICAL_INTERNAL_ERROR);
- free(str);
+ icalmemory_free_buffer(str);
return 0;
}
@@ -812,7 +803,7 @@ void icalproperty_set_value_from_string(icalproperty *prop, const char *str, con
if (nval == 0) {
/* icalvalue_new_from_string sets errno */
- assert(icalerrno != ICAL_NO_ERROR);
+ icalassert(icalerrno != ICAL_NO_ERROR);
return;
}
@@ -852,7 +843,7 @@ void icalproperty_set_x_name(icalproperty *prop, const char *name)
icalerror_check_arg_rv((prop != 0), "prop");
if (prop->x_name != 0) {
- free(prop->x_name);
+ icalmemory_free_buffer(prop->x_name);
}
prop->x_name = icalmemory_strdup(name);
diff --git a/src/libical/icalproperty.h b/src/libical/icalproperty.h
index e21bebb5..fdc4f57f 100644
--- a/src/libical/icalproperty.h
+++ b/src/libical/icalproperty.h
@@ -2,18 +2,10 @@
FILE: icalproperty.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALPROPERTY_H
@@ -96,7 +88,7 @@ LIBICAL_ICAL_EXPORT void icalproperty_remove_parameter_by_name(icalproperty *pro
/** @brief Removes the specified parameter reference from the property.
*
* @param prop A valid icalproperty.
- * @param parameter A reference to a specific icalparameter.
+ * @param param A reference to a specific icalparameter.
*
* This function removes the specified parameter reference from the
* property.
diff --git a/src/libical/icalproperty_cxx.cpp b/src/libical/icalproperty_cxx.cpp
index 6b542f19..6a377fec 100644
--- a/src/libical/icalproperty_cxx.cpp
+++ b/src/libical/icalproperty_cxx.cpp
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief Implementation of C++ Wrapper for icalproperty.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#include "icalproperty_cxx.h"
diff --git a/src/libical/icalproperty_cxx.h b/src/libical/icalproperty_cxx.h
index e243dd2e..c81acfde 100644
--- a/src/libical/icalproperty_cxx.h
+++ b/src/libical/icalproperty_cxx.h
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief Definition of C++ Wrapper for icalproperty.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifndef ICALPROPERTY_CXX_H
diff --git a/src/libical/icalproperty_p.h b/src/libical/icalproperty_p.h
index f8114a9e..dd0c9614 100644
--- a/src/libical/icalproperty_p.h
+++ b/src/libical/icalproperty_p.h
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalproperty_p.h
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALPROPERTY_P_H
diff --git a/src/libical/icalrecur.c b/src/libical/icalrecur.c
index dd129bf3..96d4190f 100644
--- a/src/libical/icalrecur.c
+++ b/src/libical/icalrecur.c
@@ -2,18 +2,10 @@
FILE: icalrecur.c
CREATOR: eric 16 May 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
========================================================================*/
/**
@@ -169,12 +161,12 @@ static ical_invalid_rrule_handling invalidRruleHandling = ICAL_RRULE_TREAT_AS_ER
#define ICAL_BY_YEARDAY_SIZE 367 /* 1 to 366 */
#endif
-#if (SIZEOF_TIME_T > 4)
+#if (SIZEOF_ICALTIME_T > 4)
/** Arbitrarily go up to 1000th anniversary of Gregorian calendar, since
- 64-bit time_t values get us up to the tm_year limit of 2+ billion years. */
+ 64-bit icaltime_t values get us up to the tm_year limit of 2+ billion years. */
#define MAX_TIME_T_YEAR 2582
#else
-/** This is the last year we will go up to, since 32-bit time_t values
+/** This is the last year we will go up to, since 32-bit icaltime_t values
only go up to the start of 2038. */
#define MAX_TIME_T_YEAR 2037
#endif
@@ -593,7 +585,7 @@ static int icalrecur_add_bydayrules(struct icalrecur_parser *parser,
icalrecurrencetype_weekday wd;
if (i == ICAL_BY_DAY_SIZE) {
- free(vals_copy);
+ icalmemory_free_buffer(vals_copy);
return -1;
}
@@ -624,7 +616,7 @@ static int icalrecur_add_bydayrules(struct icalrecur_parser *parser,
/* Sanity check value */
if (wd == ICAL_NO_WEEKDAY || weekno >= ICAL_BY_WEEKNO_SIZE) {
- free(vals_copy);
+ icalmemory_free_buffer(vals_copy);
return -1;
}
@@ -632,7 +624,7 @@ static int icalrecur_add_bydayrules(struct icalrecur_parser *parser,
array[i] = ICAL_RECURRENCE_ARRAY_MAX;
}
- free(vals_copy);
+ icalmemory_free_buffer(vals_copy);
sort_bydayrules(parser);
@@ -773,7 +765,7 @@ struct icalrecurrencetype icalrecurrencetype_from_string(const char *str)
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
}
if (parser.rt.rscale) {
- free(parser.rt.rscale);
+ icalmemory_free_buffer(parser.rt.rscale);
}
icalrecurrencetype_clear(&parser.rt);
break;
@@ -791,7 +783,7 @@ struct icalrecurrencetype icalrecurrencetype_from_string(const char *str)
if (rruleHandlingSetting == ICAL_RRULE_TREAT_AS_ERROR) {
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
if (parser.rt.rscale) {
- free(parser.rt.rscale);
+ icalmemory_free_buffer(parser.rt.rscale);
}
icalrecurrencetype_clear(&parser.rt);
break;
@@ -801,7 +793,7 @@ struct icalrecurrencetype icalrecurrencetype_from_string(const char *str)
}
}
- free(parser.copy);
+ icalmemory_free_buffer(parser.copy);
return parser.rt;
}
@@ -1451,9 +1443,18 @@ static int initialize_rscale(icalrecur_iterator *impl)
UChar *tzid = (UChar *) UCAL_UNKNOWN_ZONE_ID;
short is_hebrew = 0;
- if (dtstart.zone) {
- /* Convert the UTF8 timezoneid of dstart to ICU UChar. */
- const char *src = icaltimezone_get_tzid((icaltimezone *) dtstart.zone);
+ /* Convert the UTF8 timezoneid of dstart to ICU UChar. */
+ const char *src = icaltimezone_get_location((icaltimezone *) dtstart.zone);
+ if (!src) {
+ const char *prefix = icaltimezone_tzid_prefix();
+
+ src = icaltimezone_get_tzid((icaltimezone *) dtstart.zone);
+ if (src && !strncmp(src, prefix, strlen(prefix))) {
+ /* Skip past our prefix */
+ src += strlen(prefix);
+ }
+ }
+ if (src) {
size_t len = (strlen(src) + 1) * U_SIZEOF_UCHAR;
tzid = icalmemory_tmp_buffer(len);
tzid = u_strFromUTF8Lenient(tzid, (int32_t)len, NULL, src, -1, &status);
@@ -1956,7 +1957,7 @@ icalrecur_iterator *icalrecur_iterator_new(struct icalrecurrencetype rule,
return 0;
}
- if (!(impl = (icalrecur_iterator *)malloc(sizeof(icalrecur_iterator)))) {
+ if (!(impl = (icalrecur_iterator *)icalmemory_new_buffer(sizeof(icalrecur_iterator)))) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -2017,7 +2018,7 @@ icalrecur_iterator *icalrecur_iterator_new(struct icalrecurrencetype rule,
impl->orig_data[byrule] = 0;
} else {
icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
- free(impl);
+ icalmemory_free_buffer(impl);
return 0;
}
}
@@ -2061,7 +2062,7 @@ void icalrecur_iterator_free(icalrecur_iterator *i)
}
#endif
- free(i);
+ icalmemory_free_buffer(i);
}
/** Calculate the number of days between 2 dates */
@@ -2171,7 +2172,7 @@ static int next_unit(icalrecur_iterator *impl,
int end_of_data = 0;
- assert(has_by_unit || this_frequency);
+ icalassert(has_by_unit || this_frequency);
if (next_sub_unit && next_sub_unit(impl) == 0) {
return 0;
@@ -2243,7 +2244,7 @@ static int prev_unit(icalrecur_iterator *impl,
int end_of_data = 0;
- assert(has_by_unit || this_frequency);
+ icalassert(has_by_unit || this_frequency);
if (prev_sub_unit && prev_sub_unit(impl) == 0) {
return 0;
@@ -3604,15 +3605,15 @@ short icalrecurrencetype_encode_month(int month, int is_leap)
}
int icalrecur_expand_recurrence(const char *rule,
- time_t start, int count, time_t *array)
+ icaltime_t start, int count, icaltime_t *array)
{
struct icalrecurrencetype recur;
icalrecur_iterator *ritr;
- time_t tt;
+ icaltime_t tt;
struct icaltimetype icstart, next;
int i = 0;
- memset(array, 0, count * sizeof(time_t));
+ memset(array, 0, count * sizeof(icaltime_t));
icstart = icaltime_from_timet_with_zone(start, 0, 0);
@@ -3632,7 +3633,7 @@ int icalrecur_expand_recurrence(const char *rule,
icalrecur_iterator_free(ritr);
}
if(recur.rscale)
- free(recur.rscale);
+ icalmemory_free_buffer(recur.rscale);
return 1;
}
diff --git a/src/libical/icalrecur.h b/src/libical/icalrecur.h
index f7fe5ce4..b541362f 100644
--- a/src/libical/icalrecur.h
+++ b/src/libical/icalrecur.h
@@ -2,18 +2,10 @@
FILE: icalrecur.h
CREATOR: eric 20 March 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
========================================================================*/
/**
@@ -359,15 +351,15 @@ LIBICAL_ICAL_EXPORT void icalrecur_iterator_free(icalrecur_iterator *);
/** @brief Fills an array with the 'count' number of occurrences generated by
* the rrule.
*
- * Specifically, this fills @p array up with at most 'count' time_t values, each
+ * Specifically, this fills @p array up with at most 'count' icaltime_t values, each
* representing an occurrence time in seconds past the POSIX epoch.
*
* Note that the times are returned in UTC, but the times
* are calculated in local time. You will have to convert the results
* back into local time before using them.
*/
-LIBICAL_ICAL_EXPORT int icalrecur_expand_recurrence(const char *rule, time_t start,
- int count, time_t *array);
+LIBICAL_ICAL_EXPORT int icalrecur_expand_recurrence(const char *rule, icaltime_t start,
+ int count, icaltime_t *array);
/* ical_invalid_rrule_handling :
* How should the ICAL library handle RRULEs with invalid BYxxx part combos?
diff --git a/src/libical/icalrestriction.c.in b/src/libical/icalrestriction.c.in
index e36773f1..600ad5fd 100644
--- a/src/libical/icalrestriction.c.in
+++ b/src/libical/icalrestriction.c.in
@@ -1,18 +1,10 @@
/*======================================================================
File: icalrestriction.c
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/*#line 7 "icalrestriction.c.in"*/
@@ -28,34 +20,29 @@
/* Define the structs for the restrictions. these data are filled out
in machine generated code below */
-struct icalrestriction_property_record;
+struct icalrestriction_record;
-typedef const char *(*restriction_func) (const struct icalrestriction_property_record * rec,
+typedef const char *(*restriction_func) (const struct icalrestriction_record * rec,
icalcomponent *comp, icalproperty *prop);
-typedef struct icalrestriction_property_record
+typedef struct icalrestriction_record
{
icalproperty_method method;
icalcomponent_kind component;
icalproperty_kind property;
- icalrestriction_kind restriction;
- restriction_func function;
-} icalrestriction_property_record;
-
-typedef struct icalrestriction_component_record
-{
- icalproperty_method method;
- icalcomponent_kind component;
icalcomponent_kind subcomponent;
icalrestriction_kind restriction;
restriction_func function;
-} icalrestriction_component_record;
+} icalrestriction_record;
-static const icalrestriction_property_record *icalrestriction_get_property_restriction(
- icalproperty_method method, icalcomponent_kind component, icalproperty_kind property);
+static const icalrestriction_record *icalrestriction_get_restriction(
+ const icalrestriction_record *start,
+ icalproperty_method method, icalcomponent_kind component,
+ icalproperty_kind property, icalcomponent_kind subcomp);
-static const icalrestriction_property_record null_prop_record =
- { ICAL_METHOD_NONE, ICAL_NO_COMPONENT, ICAL_NO_PROPERTY, ICAL_RESTRICTION_UNKNOWN, NULL };
+static const icalrestriction_record null_restriction_record =
+ { ICAL_METHOD_NONE, ICAL_NO_COMPONENT,
+ ICAL_NO_PROPERTY, ICAL_NO_COMPONENT, ICAL_RESTRICTION_UNKNOWN, NULL };
/** Each row gives the result of comparing a restriction against a count.
The columns in each row represent 0,1,2+. '-1' indicates
@@ -104,265 +91,323 @@ int icalrestriction_compare(icalrestriction_kind restr, int count)
/* Special case routines */
-static const char *icalrestriction_may_be_draft_final_canceled(
- const icalrestriction_property_record *rec, icalcomponent *comp, icalproperty *prop)
+static const char *icalrestriction_validate_status_value(
+ const icalrestriction_record *rec, icalcomponent *comp, icalproperty *prop)
{
- icalproperty_status stat = icalproperty_get_status(prop);
+ icalproperty_status stat;
- _unused(rec);
_unused(comp);
- if (!(stat == ICAL_STATUS_DRAFT ||
- stat == ICAL_STATUS_FINAL ||
- stat == ICAL_STATUS_CANCELLED)) {
- return
- "Failed iTIP restrictions for STATUS property. "
- "Value must be one of DRAFT, FINAL, or CANCELED";
+ if (!prop) {
+ return 0;
}
- return 0;
-}
-
-static const char *icalrestriction_may_be_comp_need_process(const icalrestriction_property_record *
- rec, icalcomponent *comp,
- icalproperty *prop)
-{
- icalproperty_status stat = icalproperty_get_status(prop);
-
- _unused(rec);
- _unused(comp);
-
- if (!(stat == ICAL_STATUS_COMPLETED ||
- stat == ICAL_STATUS_NEEDSACTION || stat == ICAL_STATUS_INPROCESS)) {
- return
- "Failed iTIP restrictions for STATUS property. "
- "Value must be one of COMPLETED, NEEDS-ACTION or IN-PROCESS";
+ stat = icalproperty_get_status(prop);
+
+ if (rec->method == ICAL_METHOD_CANCEL) {
+ switch (rec->component) {
+ case ICAL_VEVENT_COMPONENT:
+ case ICAL_VTODO_COMPONENT:
+ /* Hack. see rfc5546, 3.2.5 CANCEL for property STATUS. I don't
+ understand the note */
+ break;
+
+ case ICAL_VJOURNAL_COMPONENT:
+ case ICAL_VPOLL_COMPONENT:
+ if (stat != ICAL_STATUS_CANCELLED) {
+ return
+ "Failed iTIP restrictions for STATUS property. "
+ "Value must be CANCELLED";
+ }
+ break;
+
+ default:
+ break;
+ }
+ } else {
+ switch (rec->component) {
+ case ICAL_VEVENT_COMPONENT:
+ switch (rec->method) {
+ case ICAL_METHOD_PUBLISH:
+ case ICAL_METHOD_COUNTER:
+ if (!(stat == ICAL_STATUS_TENTATIVE ||
+ stat == ICAL_STATUS_CONFIRMED ||
+ stat == ICAL_STATUS_CANCELLED)) {
+ return
+ "Failed iTIP restrictions for STATUS property. "
+ "Value must be one of TENTATIVE, CONFIRMED or CANCELED";
+ }
+ break;
+
+ case ICAL_METHOD_REQUEST:
+ case ICAL_METHOD_ADD:
+ if (!(stat == ICAL_STATUS_TENTATIVE ||
+ stat == ICAL_STATUS_CONFIRMED)) {
+ return
+ "Failed iTIP restrictions for STATUS property. "
+ "Value must be one of TENTATIVE or CONFIRMED";
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case ICAL_VTODO_COMPONENT:
+ switch (rec->method) {
+ case ICAL_METHOD_REQUEST:
+ case ICAL_METHOD_ADD:
+ case ICAL_METHOD_COUNTER:
+ if (!(stat == ICAL_STATUS_COMPLETED ||
+ stat == ICAL_STATUS_NEEDSACTION ||
+ stat == ICAL_STATUS_INPROCESS)) {
+ return
+ "Failed iTIP restrictions for STATUS property. "
+ "Value must be one of COMPLETED, NEEDS-ACTION or IN-PROCESS";
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
}
return 0;
}
-static const char *icalrestriction_may_be_tent_conf(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
+static const char *icalrestriction_must_be_recurring(const icalrestriction_record * rec,
+ icalcomponent *comp, icalproperty *prop)
{
- icalproperty_status stat = icalproperty_get_status(prop);
-
_unused(rec);
_unused(comp);
-
- if (!(stat == ICAL_STATUS_TENTATIVE || stat == ICAL_STATUS_CONFIRMED)) {
- return
- "Failed iTIP restrictions for STATUS property. "
- "Value must be one of TENTATIVE or CONFIRMED";
- }
-
+ _unused(prop);
return 0;
}
-static const char *icalrestriction_may_be_tent_conf_cancel(const icalrestriction_property_record *
- rec, icalcomponent *comp,
- icalproperty *prop)
+const char *icalrestriction_must_if_tz_ref(const icalrestriction_record * rec,
+ icalcomponent *comp, icalproperty *prop)
{
- icalproperty_status stat = icalproperty_get_status(prop);
-
_unused(rec);
_unused(comp);
-
- if (!(stat == ICAL_STATUS_TENTATIVE ||
- stat == ICAL_STATUS_CONFIRMED || stat == ICAL_STATUS_CANCELLED)) {
- return
- "Failed iTIP restrictions for STATUS property. "
- "Value must be one of TENTATIVE, CONFIRMED or CANCELED";
- }
-
+ _unused(prop);
return 0;
}
-static const char *icalrestriction_must_be_cancel_if_present(
- const icalrestriction_property_record *rec, icalcomponent *comp, icalproperty *prop)
+static const char *icalrestriction_no_dtend(const icalrestriction_record * rec,
+ icalcomponent *comp, icalproperty *prop)
{
- /* This routine will not be called if prop == 0 */
- icalproperty_status stat = icalproperty_get_status(prop);
-
_unused(rec);
- _unused(comp);
- if (stat != ICAL_STATUS_CANCELLED) {
- return "Failed iTIP restrictions for STATUS property. Value must be CANCELLED";
+ if (prop != NULL &&
+ icalcomponent_get_first_property(comp, ICAL_DTEND_PROPERTY)) {
+ return
+ "Failed iTIP restrictions for DTEND property. "
+ "The component must not have both DURATION and DTEND";
}
return 0;
}
-static const char *icalrestriction_must_be_canceled_no_attendee(
- const icalrestriction_property_record *rec, icalcomponent *comp, icalproperty *prop)
+static const char *icalrestriction_no_duration(const icalrestriction_record * rec,
+ icalcomponent *comp, icalproperty *prop)
{
_unused(rec);
- _unused(comp);
- _unused(prop);
- /* Hack. see rfc5546, 3.2.5 CANCEL for property STATUS. I don't
- understand the note */
-
- return 0;
-}
-
-static const char *icalrestriction_must_be_recurring(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- _unused(rec);
- _unused(comp);
- _unused(prop);
- return 0;
-}
-
-static const char *icalrestriction_must_have_duration(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- _unused(rec);
- _unused(prop);
- if (!icalcomponent_get_first_property(comp, ICAL_DURATION_PROPERTY)) {
+ if (prop != NULL &&
+ icalcomponent_get_first_property(comp, ICAL_DURATION_PROPERTY)) {
return
"Failed iTIP restrictions for DURATION property. "
- "This component must have a DURATION property";
+ "The component must not have both DTEND and DURATION";
}
return 0;
}
-static const char *icalrestriction_must_have_repeat(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
+static int _check_restriction(icalcomponent *comp,
+ const icalrestriction_record *record,
+ int count, icalproperty *prop)
{
- _unused(rec);
- _unused(prop);
- if (!icalcomponent_get_first_property(comp, ICAL_REPEAT_PROPERTY)) {
- return
- "Failed iTIP restrictions for REPEAT property. "
- "This component must have a REPEAT property";
- }
+ icalrestriction_kind restr;
+ const char *funcr = 0;
+ int compare;
- return 0;
-}
+ restr = record->restriction;
-const char *icalrestriction_must_if_tz_ref(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- _unused(rec);
- _unused(comp);
- _unused(prop);
- return 0;
-}
+ if (restr == ICAL_RESTRICTION_ONEEXCLUSIVE ||
+ restr == ICAL_RESTRICTION_ONEMUTUAL) {
-static const char *icalrestriction_no_dtend(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- _unused(rec);
- _unused(prop);
- if (icalcomponent_get_first_property(comp, ICAL_DTEND_PROPERTY)) {
- return
- "Failed iTIP restrictions for DTEND property. "
- "The component must not have both DURATION and DTEND";
+ /* First treat is as a 0/1 restriction */
+ restr = ICAL_RESTRICTION_ZEROORONE;
}
- return 0;
-}
+ compare = icalrestriction_compare(restr, count);
-static const char *icalrestriction_no_duration(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- _unused(rec);
- _unused(comp);
- _unused(prop);
+ assert(compare != -1);
- /* _no_dtend takes care of this one */
- return 0;
-}
+ if (compare == 0) {
+#define TMP_BUF_SIZE 1024
+ char temp[TMP_BUF_SIZE];
+ icalproperty *errProp;
+ icalparameter *errParam;
+ const char *type, *kind;
+
+ if (record->subcomponent != ICAL_NO_COMPONENT) {
+ type = "component";
+ kind = icalenum_component_kind_to_string(record->subcomponent);
+ } else {
+ type = "property";
+ kind = icalenum_property_kind_to_string(record->property);
+ }
-static const char *icalrestriction_must_be_email(const icalrestriction_property_record * rec,
- icalcomponent *comp, icalproperty *prop)
-{
- icalproperty_action stat = icalproperty_get_action(prop);
+ snprintf(temp, TMP_BUF_SIZE,
+ "Failed iTIP restrictions for %s %s. "
+ "Expected %s instances of the %s and got %d",
+ kind, type, restr_string_map[restr], type, count);
+ errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
+ errProp = icalproperty_vanew_xlicerror(temp, errParam, 0);
+ icalcomponent_add_property(comp, errProp);
+ icalproperty_free(errProp);
+ }
- _unused(rec);
- _unused(comp);
+ if (record->function != NULL) {
+ funcr = record->function(record, comp, prop);
+ }
+
+ if (funcr != 0) {
+ icalproperty *errProp;
+ icalparameter *errParam;
- if (!(stat == ICAL_ACTION_EMAIL)) {
- return "Failed iTIP restrictions for ACTION property. Value must be EMAIL.";
+ errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
+ errProp = icalproperty_vanew_xlicerror(funcr, errParam, 0);
+ icalcomponent_add_property(comp, errProp);
+ icalproperty_free(errProp);
+
+ compare = 0;
}
- return 0;
+ return compare;
}
-static int icalrestriction_check_component(icalproperty_method method, icalcomponent *comp)
+static int icalrestriction_check_component(icalproperty_method method,
+ icalcomponent *comp)
{
- icalproperty_kind kind;
- icalcomponent_kind comp_kind;
- icalrestriction_kind restr;
- const icalrestriction_property_record *prop_record;
- const char *funcr = 0;
- icalproperty *prop;
-
+ icalcomponent_kind comp_kind, inner_kind;
+ icalproperty_kind prop_kind;
+ const icalrestriction_record *start_record;
+ icalproperty *method_prop = NULL;
+ icalcomponent *inner_comp;
+ const char *errStr = NULL;
int count;
int compare;
int valid = 1;
comp_kind = icalcomponent_isa(comp);
+ switch (comp_kind) {
+ case ICAL_VCALENDAR_COMPONENT:
+ if (!icalcomponent_get_first_real_component(comp)) {
+
+ errStr = "Failed iTIP restrictions for VCALENDAR component. "
+ "Expected one or more \"real\" sub-components and got 0";
+ }
+
+ /* Get the Method property from the component */
+ method_prop = icalcomponent_get_first_property(comp, ICAL_METHOD_PROPERTY);
+ break;
+
+ case ICAL_VTIMEZONE_COMPONENT:
+ if (!icalcomponent_get_first_component(comp, ICAL_XSTANDARD_COMPONENT) &&
+ !icalcomponent_get_first_component(comp, ICAL_XDAYLIGHT_COMPONENT)) {
+
+ errStr = "Failed iTIP restrictions for VTIMEZONE component. "
+ "Expected one or more STANDARD/DAYLIGHT sub-components and got 0";
+ }
+
+ method = ICAL_METHOD_NONE;
+ break;
+
+ default:
+ break;
+ }
+
+ if (errStr != NULL) {
+ icalproperty *errProp;
+ icalparameter *errParam;
+
+ errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
+ errProp = icalproperty_vanew_xlicerror(errStr, errParam, 0);
+ icalcomponent_add_property(comp, errProp);
+ icalproperty_free(errProp);
+
+ valid = 0;
+ }
+
/* Check all of the properties in this component */
- for (kind = ICAL_ANY_PROPERTY + 1; kind != ICAL_NO_PROPERTY; kind++) {
- count = icalcomponent_count_properties(comp, kind);
+ start_record = icalrestriction_get_restriction(NULL, method, comp_kind,
+ ICAL_ANY_PROPERTY,
+ ICAL_NO_COMPONENT);
- prop_record = icalrestriction_get_property_restriction(method, comp_kind, kind);
+ if (start_record != &null_restriction_record) {
- restr = prop_record->restriction;
+ for (prop_kind = ICAL_ANY_PROPERTY + 1;
+ prop_kind != ICAL_NO_PROPERTY; prop_kind++) {
- if (restr == ICAL_RESTRICTION_ONEEXCLUSIVE || restr == ICAL_RESTRICTION_ONEMUTUAL) {
+ const icalrestriction_record *record =
+ icalrestriction_get_restriction(start_record, method, comp_kind,
+ prop_kind, ICAL_NO_COMPONENT);
- /* First treat is as a 0/1 restriction */
- restr = ICAL_RESTRICTION_ZEROORONE;
- compare = icalrestriction_compare(restr, count);
+ icalproperty *prop =
+ icalcomponent_get_first_property(comp, prop_kind);
- } else {
+ count = icalcomponent_count_properties(comp, prop_kind);
+
+ compare = _check_restriction(comp, record, count, prop);
- compare = icalrestriction_compare(restr, count);
+ valid = valid && compare;
}
+ }
- assert(compare != -1);
+ /* Now check the inner components */
- if (compare == 0) {
-#define TMP_BUF_SIZE 1024
- char temp[TMP_BUF_SIZE];
- icalproperty *errProp;
- icalparameter *errParam;
-
- snprintf(temp, TMP_BUF_SIZE,
- "Failed iTIP restrictions for %s property. "
- "Expected %s instances of the property and got %d",
- icalenum_property_kind_to_string(kind), restr_string_map[restr], count);
- errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
- errProp = icalproperty_vanew_xlicerror(temp, errParam, 0);
- icalcomponent_add_property(comp, errProp);
- icalproperty_free(errProp);
- }
+ start_record = icalrestriction_get_restriction(start_record, method, comp_kind,
+ ICAL_NO_PROPERTY,
+ ICAL_ANY_COMPONENT);
- prop = icalcomponent_get_first_property(comp, kind);
+ if (start_record != &null_restriction_record) {
- if (prop != 0 && prop_record->function != NULL) {
- funcr = prop_record->function(prop_record, comp, prop);
- }
+ for (inner_kind = ICAL_NO_COMPONENT + 3;
+ inner_kind != ICAL_NUM_COMPONENT_TYPES; inner_kind++) {
- if (funcr != 0) {
- icalproperty *errProp;
- icalparameter *errParam;
+ const icalrestriction_record *record =
+ icalrestriction_get_restriction(start_record, method, comp_kind,
+ ICAL_NO_PROPERTY, inner_kind);
- errParam = icalparameter_new_xlicerrortype(ICAL_XLICERRORTYPE_INVALIDITIP);
- errProp = icalproperty_vanew_xlicerror(funcr, errParam, 0);
- icalcomponent_add_property(comp, errProp);
- icalproperty_free(errProp);
+ count = icalcomponent_count_components(comp, inner_kind);
- compare = 0;
+ compare = _check_restriction(comp, record, count, NULL);
+
+ valid = valid && compare;
}
+ }
+
+ if (method_prop == 0) {
+ method = ICAL_METHOD_NONE;
+ } else {
+ method = icalproperty_get_method(method_prop);
+ }
+
+ for (inner_comp = icalcomponent_get_first_component(comp, ICAL_ANY_COMPONENT);
+ inner_comp != 0;
+ inner_comp = icalcomponent_get_next_component(comp, ICAL_ANY_COMPONENT)) {
+
+ compare = icalrestriction_check_component(method, inner_comp);
valid = valid && compare;
}
@@ -373,15 +418,10 @@ static int icalrestriction_check_component(icalproperty_method method, icalcompo
int icalrestriction_check(icalcomponent *outer_comp)
{
icalcomponent_kind comp_kind;
- icalproperty_method method;
- icalcomponent *inner_comp;
- icalproperty *method_prop;
int valid;
icalerror_check_arg_rz((outer_comp != 0), "outer comp");
- /* Get the Method value from the outer component */
-
comp_kind = icalcomponent_isa(outer_comp);
if (comp_kind != ICAL_VCALENDAR_COMPONENT) {
@@ -389,43 +429,198 @@ int icalrestriction_check(icalcomponent *outer_comp)
return 0;
}
- method_prop = icalcomponent_get_first_property(outer_comp, ICAL_METHOD_PROPERTY);
-
- if (method_prop == 0) {
- method = ICAL_METHOD_NONE;
- } else {
- method = icalproperty_get_method(method_prop);
- }
-
/* Check the VCALENDAR wrapper */
valid = icalrestriction_check_component(ICAL_METHOD_NONE, outer_comp);
- /* Now check the inner components */
+ return valid;
+}
- for (inner_comp = icalcomponent_get_first_component(outer_comp, ICAL_ANY_COMPONENT);
- inner_comp != 0;
- inner_comp = icalcomponent_get_next_component(outer_comp, ICAL_ANY_COMPONENT)) {
- valid = valid && icalrestriction_check_component(method, inner_comp);
+static const char *icalrestriction_validate_valarm_prop(
+ const icalrestriction_record *rec, icalcomponent *comp, icalproperty *prop)
+{
+ icalrestriction_record record =
+ { ICAL_METHOD_NONE, ICAL_VALARM_COMPONENT,
+ rec->property, ICAL_NO_COMPONENT, ICAL_RESTRICTION_UNKNOWN, NULL };
+ const icalrestriction_record *myrec = NULL;
+ enum icalproperty_action action = ICAL_ACTION_NONE;
+ icalproperty *action_prop;
+ int count = 0;
+
+ switch (rec->subcomponent) {
+ case ICAL_NO_COMPONENT:
+ action_prop = icalcomponent_get_first_property(comp, ICAL_ACTION_PROPERTY);
+
+ if (action_prop) {
+ action = icalproperty_get_action(action_prop);
+ }
+
+ if (prop) {
+ if (rec->restriction == ICAL_RESTRICTION_ZEROPLUS ||
+ rec->restriction == ICAL_RESTRICTION_ONEPLUS) {
+ count = icalcomponent_count_properties(comp, rec->property);
+ } else {
+ count = 1;
+ }
+ }
+
+ switch (rec->property) {
+ case ICAL_DURATION_PROPERTY:
+ if (count &&
+ !icalcomponent_get_first_property(comp, ICAL_DURATION_PROPERTY)) {
+ return
+ "Failed iTIP restrictions for REPEAT property. "
+ "This component must have a REPEAT property "
+ "if it has a DURATION property";
+ }
+ break;
+
+ case ICAL_REPEAT_PROPERTY:
+ if (count &&
+ !icalcomponent_get_first_property(comp, ICAL_DURATION_PROPERTY)) {
+ return
+ "Failed iTIP restrictions for DURATION property. "
+ "This component must have a DURATION property "
+ "if it has a REPEAT property";
+ }
+ break;
+
+ case ICAL_ATTACH_PROPERTY:
+ if (count) {
+ switch (action) {
+ case ICAL_ACTION_AUDIO:
+ case ICAL_ACTION_PROCEDURE:
+ record.restriction = ICAL_RESTRICTION_ZEROORONE;
+ myrec = &record;
+ break;
+
+ case ICAL_ACTION_DISPLAY:
+ record.restriction = ICAL_RESTRICTION_ZERO;
+ myrec = &record;
+ break;
+
+ default:
+ break;
+ }
+ break;
+ }
+ break;
+
+ case ICAL_ATTENDEE_PROPERTY:
+ switch (action) {
+ case ICAL_ACTION_AUDIO:
+ case ICAL_ACTION_DISPLAY:
+ case ICAL_ACTION_PROCEDURE:
+ if (count) {
+ record.restriction = ICAL_RESTRICTION_ZERO;
+ myrec = &record;
+ }
+ break;
+
+ case ICAL_ACTION_EMAIL:
+ if (!count) {
+ record.restriction = ICAL_RESTRICTION_ONEPLUS;
+ myrec = &record;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case ICAL_DESCRIPTION_PROPERTY:
+ switch (action) {
+ case ICAL_ACTION_AUDIO:
+ if (count) {
+ record.restriction = ICAL_RESTRICTION_ZERO;
+ myrec = &record;
+ }
+ break;
+
+ case ICAL_ACTION_DISPLAY:
+ case ICAL_ACTION_EMAIL:
+ if (!count) {
+ record.restriction = ICAL_RESTRICTION_ONE;
+ myrec = &record;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case ICAL_SUMMARY_PROPERTY:
+ switch (action) {
+ case ICAL_ACTION_AUDIO:
+ case ICAL_ACTION_DISPLAY:
+ case ICAL_ACTION_PROCEDURE:
+ if (count) {
+ record.restriction = ICAL_RESTRICTION_ZERO;
+ myrec = &record;
+ }
+ break;
+
+ case ICAL_ACTION_EMAIL:
+ if (!count) {
+ record.restriction = ICAL_RESTRICTION_ONE;
+ myrec = &record;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case ICAL_VLOCATION_COMPONENT:
+ if (!icalcomponent_get_first_property(comp, ICAL_PROXIMITY_PROPERTY)) {
+ return
+ "Failed iTIP restrictions for VLOCATION component. "
+ "This component must only appear in a VALARM component "
+ "if the VALARM has a PROXIMITY property.";
+ }
+ break;
+
+ default:
+ break;
}
- return valid;
+ if (myrec) {
+ _check_restriction(comp, myrec, count, NULL);
+ }
+
+ return 0;
}
<insert_code_here>
-static const icalrestriction_property_record *icalrestriction_get_property_restriction(
- icalproperty_method method, icalcomponent_kind component, icalproperty_kind property)
+static const icalrestriction_record *icalrestriction_get_restriction(
+ const icalrestriction_record *start,
+ icalproperty_method method, icalcomponent_kind component,
+ icalproperty_kind property, icalcomponent_kind subcomp)
{
- int i;
+ const icalrestriction_record *rec;
+
+ if (!start) {
+ start = &icalrestriction_records[0];
+ }
- for (i = 0; icalrestriction_property_records[i].restriction != ICAL_RESTRICTION_NONE; i++) {
+ for (rec = start; rec && rec->restriction != ICAL_RESTRICTION_NONE; rec++) {
- if (method == icalrestriction_property_records[i].method &&
- component == icalrestriction_property_records[i].component &&
- property == icalrestriction_property_records[i].property) {
- return &icalrestriction_property_records[i];
+ if (method == rec->method &&
+ (component == ICAL_ANY_COMPONENT ||
+ (component == rec->component &&
+ (property == ICAL_ANY_PROPERTY || property == rec->property) &&
+ (subcomp == ICAL_ANY_COMPONENT || subcomp == rec->subcomponent)))) {
+ return rec;
}
}
- return &null_prop_record;
+ return &null_restriction_record;
}
diff --git a/src/libical/icalrestriction.h b/src/libical/icalrestriction.h
index 38751efc..47d9d07a 100644
--- a/src/libical/icalrestriction.h
+++ b/src/libical/icalrestriction.h
@@ -2,18 +2,9 @@
FILE: icalrestriction.h
CREATOR: eric 24 April 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalrestriction.h
@@ -26,7 +17,7 @@
/**
* @file icalrestriction.h
- * @brief Functions to check if an ::icalcomponent meets the restrictions
+ * @brief Functions to check if an icalcomponent meets the restrictions
* imposed by the standard.
*/
@@ -76,7 +67,7 @@ typedef enum icalrestriction_kind
* @param count The amount present that is to be checked against the restriction
* @return 1 if the restriction is met, 0 if not
*
- * ### Example
+ * @par Example
* ```c
* assert(icalrestriction_compare(ICALRESTRICTION_ONEPLUS, 5) == true);
* assert(icalrestriction_compare(ICALRESTRICTION_NONE, 3) == false);
@@ -94,7 +85,7 @@ LIBICAL_ICAL_EXPORT int icalrestriction_compare(icalrestriction_kind restr, int
* Returns 0 and sets ::icalerrno if `NULL` is passed as @a comp, or if the
* component is not a `VCALENDAR`.
*
- * ### Example
+ * @par Example
* ```c
* icalcomponent *component = // ...
*
diff --git a/src/libical/icaltime.c b/src/libical/icaltime.c
index fd1bf3d8..d98880b2 100644
--- a/src/libical/icaltime.c
+++ b/src/libical/icaltime.c
@@ -2,20 +2,11 @@
FILE: icaltime.c
CREATOR: eric 02 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
The timegm code is Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -77,16 +68,16 @@ static int icaltime_leap_days(int y1, int y2)
/*
* Code adapted from Python 2.4.1 sources (Lib/calendar.py).
*/
-static time_t icaltime_timegm(const struct tm *tm)
+static icaltime_t icaltime_timegm(const struct tm *tm)
{
int year;
- time_t days;
- time_t hours;
- time_t minutes;
- time_t seconds;
+ icaltime_t days;
+ icaltime_t hours;
+ icaltime_t minutes;
+ icaltime_t seconds;
year = 1900 + tm->tm_year;
- days = (time_t)(365 * (year - 1970) + icaltime_leap_days(1970, year));
+ days = (icaltime_t)(365 * (year - 1970) + icaltime_leap_days(1970, year));
days += days_in_year_passed_month[0][tm->tm_mon];
if (tm->tm_mon > 1 && icaltime_is_leap_year(year))
@@ -102,40 +93,40 @@ static time_t icaltime_timegm(const struct tm *tm)
/*
* Function to convert a struct tm time specification
- * to an ANSI time_t using the specified time zone.
+ * to an ANSI-compatible icaltime_t using the specified time zone.
* This is different from the standard mktime() function
* in that we don't want the automatic adjustments for
* local daylight savings time applied to the result.
* This function expects well-formed input.
*/
-static time_t make_time(struct tm *tm, int tzm)
+static icaltime_t make_time(struct tm *tm, int tzm)
{
- time_t tim;
+ icaltime_t tim;
static int days[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 };
/* check that month specification within range */
if (tm->tm_mon < 0 || tm->tm_mon > 11)
- return ((time_t) - 1);
+ return ((icaltime_t) - 1);
-#if (SIZEOF_TIME_T == 4)
+#if (SIZEOF_ICALTIME_T == 4)
/* check that year specification within range */
if (tm->tm_year < 70 || tm->tm_year > 138)
- return ((time_t) - 1);
+ return ((icaltime_t) - 1);
/* check for upper bound of Jan 17, 2038 (to avoid possibility of
32-bit arithmetic overflow) */
if (tm->tm_year == 138) {
if (tm->tm_mon > 0) {
- return ((time_t) - 1);
+ return ((icaltime_t) - 1);
} else if (tm->tm_mday > 17) {
- return ((time_t) - 1);
+ return ((icaltime_t) - 1);
}
}
-#endif /* SIZEOF_TIME_T */
+#endif /* SIZEOF_ICALTIME_T */
/*
* calculate elapsed days since start of the epoch (midnight Jan
@@ -143,7 +134,7 @@ static time_t make_time(struct tm *tm, int tzm)
* (number of leap days to subtract)
*/
- tim = (time_t) ((tm->tm_year - 70) * 365 + ((tm->tm_year - 1) / 4) - 17);
+ tim = (icaltime_t) ((tm->tm_year - 70) * 365 + ((tm->tm_year - 1) / 4) - 17);
/* add number of days elapsed in the current year */
@@ -180,7 +171,7 @@ static time_t make_time(struct tm *tm, int tzm)
return (tim);
}
-struct icaltimetype icaltime_from_timet_with_zone(const time_t tm, const int is_date,
+struct icaltimetype icaltime_from_timet_with_zone(const icaltime_t tm, const int is_date,
const icaltimezone *zone)
{
struct icaltimetype tt;
@@ -189,8 +180,8 @@ struct icaltimetype icaltime_from_timet_with_zone(const time_t tm, const int is_
utc_zone = icaltimezone_get_utc_timezone();
- /* Convert the time_t to a struct tm in UTC time. We can trust gmtime for this. */
- if (!gmtime_r(&tm, &t))
+ /* Convert the icaltime_t to a struct tm in UTC time. We can trust gmtime for this. */
+ if (!icalgmtime_r(&tm, &t))
return is_date ? icaltime_null_date () : icaltime_null_time ();
tt.year = t.tm_year + 1900;
@@ -220,18 +211,18 @@ struct icaltimetype icaltime_from_timet_with_zone(const time_t tm, const int is_
struct icaltimetype icaltime_current_time_with_zone(const icaltimezone *zone)
{
- return icaltime_from_timet_with_zone(time(NULL), 0, zone);
+ return icaltime_from_timet_with_zone(icaltime(NULL), 0, zone);
}
struct icaltimetype icaltime_today(void)
{
- return icaltime_from_timet_with_zone(time(NULL), 1, NULL);
+ return icaltime_from_timet_with_zone(icaltime(NULL), 1, NULL);
}
-time_t icaltime_as_timet(const struct icaltimetype tt)
+icaltime_t icaltime_as_timet(const struct icaltimetype tt)
{
struct tm stm;
- time_t t;
+ icaltime_t t;
/* If the time is the special null time, return 0. */
if (icaltime_is_null_time(tt)) {
@@ -259,11 +250,11 @@ time_t icaltime_as_timet(const struct icaltimetype tt)
return t;
}
-time_t icaltime_as_timet_with_zone(const struct icaltimetype tt, const icaltimezone *zone)
+icaltime_t icaltime_as_timet_with_zone(const struct icaltimetype tt, const icaltimezone *zone)
{
icaltimezone *utc_zone;
struct tm stm;
- time_t t;
+ icaltime_t t;
struct icaltimetype local_tt;
utc_zone = icaltimezone_get_utc_timezone();
@@ -434,7 +425,7 @@ static const int _days_in_month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
int icaltime_days_in_month(const int month, const int year)
{
- int days = _days_in_month[month];
+ int days;
/* The old code aborting if it was passed a parameter like BYMONTH=0
* Unfortunately it's not practical right now to pass an error all
@@ -448,6 +439,8 @@ int icaltime_days_in_month(const int month, const int year)
return 30;
}
+ days = _days_in_month[month];
+
if (month == 2) {
days += icaltime_is_leap_year(year);
}
diff --git a/src/libical/icaltime.h b/src/libical/icaltime.h.cmake
index 1e28492b..90b62ce8 100644
--- a/src/libical/icaltime.h
+++ b/src/libical/icaltime.h.cmake
@@ -2,18 +2,9 @@
FILE: icaltime.h
CREATOR: eric 02 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -37,7 +28,7 @@
* - icaltime_null_date()
* - icaltime_current_time_with_zone()
* - icaltime_today()
- * - icaltime_from_timet_with_zone(time_t tm, int is_date,
+ * - icaltime_from_timet_with_zone(icaltime_t tm, int is_date,
* icaltimezone *zone)
* - icaltime_from_day_of_year(int doy, int year)
*
@@ -83,6 +74,7 @@
#include "libical_ical_export.h"
#include <time.h>
+#define icaltime_t ${ICAL_ICALTIME_T_TYPE}
/* An opaque struct representing a timezone. We declare this here to avoid
a circular dependency. */
@@ -94,8 +86,8 @@ typedef struct _icaltimezone icaltimezone;
/** icaltime_span is returned by icalcomponent_get_span() */
struct icaltime_span
{
- time_t start; /**< in UTC */
- time_t end; /**< in UTC */
+ icaltime_t start; /**< in UTC */
+ icaltime_t end; /**< in UTC */
int is_busy; /**< 1->busy time, 0-> free time */
};
@@ -169,7 +161,7 @@ LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_today(void);
* target timezone with no need to store the source timezone.
*
*/
-LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_from_timet_with_zone(const time_t tm,
+LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_from_timet_with_zone(const icaltime_t tm,
const int is_date,
const icaltimezone *zone);
@@ -199,7 +191,7 @@ LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_from_day_of_year(const int doy,
* only pass an icaltime in UTC, since no conversion is done. Even in that case,
* it's probably better to just use icaltime_as_timet_with_zone().
*/
-LIBICAL_ICAL_EXPORT time_t icaltime_as_timet(const struct icaltimetype);
+LIBICAL_ICAL_EXPORT icaltime_t icaltime_as_timet(const struct icaltimetype);
/** @brief Returns the time as seconds past the UNIX epoch, using the
* given timezone.
@@ -207,9 +199,9 @@ LIBICAL_ICAL_EXPORT time_t icaltime_as_timet(const struct icaltimetype);
* This convenience method combines a call to icaltime_convert_to_zone()
* with a call to icaltime_as_timet().
* If the input timezone is null, no conversion is done; that is, the
- * time is simply returned as time_t in its native timezone.
+ * time is simply returned as icaltime_t in its native timezone.
*/
-LIBICAL_ICAL_EXPORT time_t icaltime_as_timet_with_zone(const struct icaltimetype tt,
+LIBICAL_ICAL_EXPORT icaltime_t icaltime_as_timet_with_zone(const struct icaltimetype tt,
const icaltimezone *zone);
/**
@@ -352,7 +344,7 @@ LIBICAL_ICAL_EXPORT void icaltime_adjust(struct icaltimetype *tt,
* to do arithmetic on times without worrying about overflow or
* underflow.
*/
-LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_normalize(const struct icaltimetype t);
+LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_normalize(const struct icaltimetype tt);
/** @brief Converts time to a given timezone.
*
@@ -363,7 +355,7 @@ LIBICAL_ICAL_EXPORT struct icaltimetype icaltime_normalize(const struct icaltime
*
* If it's a floating time, the returned object
* represents the same time relative to @p zone.
- * For example, if @tt represents 9:30 AM floating and @p zone
+ * For example, if @p tt represents 9:30 AM floating and @p zone
* is the GMT timezone, the returned object will represent 9:30 AM GMT.
*
* Otherwise, the time will be converted to @p zone, and its timezone
diff --git a/src/libical/icaltimezone.c b/src/libical/icaltimezone.c
index e57c08d2..b272c0f0 100644
--- a/src/libical/icaltimezone.c
+++ b/src/libical/icaltimezone.c
@@ -2,18 +2,10 @@
FILE: icaltimezone.c
CREATOR: Damon Chaplin 15 March 2001
- (C) COPYRIGHT 2001, Damon Chaplin <damon@ximian.com>
+ SPDX-FileCopyrightText: 2001, Damon Chaplin <damon@ximian.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
//krazy:excludeall=cpp
@@ -85,12 +77,12 @@ static char s_ical_tzid_prefix[BUILTIN_TZID_PREFIX_LEN] = {0};
the timezone changes. */
#define ICALTIMEZONE_EXTRA_COVERAGE 5
-#if (SIZEOF_TIME_T > 4)
+#if (SIZEOF_ICALTIME_T > 4)
/** Arbitrarily go up to 1000th anniversary of Gregorian calendar, since
- 64-bit time_t values get us up to the tm_year limit of 2+ billion years. */
+ 64-bit icaltime_t values get us up to the tm_year limit of 2+ billion years. */
#define ICALTIMEZONE_MAX_YEAR 2582
#else
-/** This is the maximum year we will expand to, since 32-bit time_t values
+/** This is the maximum year we will expand to, since 32-bit icaltime_t values
only go up to the start of 2038. */
#define ICALTIMEZONE_MAX_YEAR 2037
#endif
@@ -212,7 +204,7 @@ icaltimezone *icaltimezone_new(void)
{
icaltimezone *zone;
- zone = (icaltimezone *) malloc(sizeof(icaltimezone));
+ zone = (icaltimezone *) icalmemory_new_buffer(sizeof(icaltimezone));
if (!zone) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return NULL;
@@ -227,7 +219,7 @@ icaltimezone *icaltimezone_copy(icaltimezone *originalzone)
{
icaltimezone *zone;
- zone = (icaltimezone *) malloc(sizeof(icaltimezone));
+ zone = (icaltimezone *) icalmemory_new_buffer(sizeof(icaltimezone));
if (!zone) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return NULL;
@@ -235,13 +227,13 @@ icaltimezone *icaltimezone_copy(icaltimezone *originalzone)
memcpy(zone, originalzone, sizeof(icaltimezone));
if (zone->tzid != NULL) {
- zone->tzid = strdup(zone->tzid);
+ zone->tzid = icalmemory_strdup(zone->tzid);
}
if (zone->location != NULL) {
- zone->location = strdup(zone->location);
+ zone->location = icalmemory_strdup(zone->location);
}
if (zone->tznames != NULL) {
- zone->tznames = strdup(zone->tznames);
+ zone->tznames = icalmemory_strdup(zone->tznames);
}
icaltimezone_changes_lock();
@@ -261,7 +253,7 @@ void icaltimezone_free(icaltimezone *zone, int free_struct)
{
icaltimezone_reset(zone);
if (free_struct)
- free(zone);
+ icalmemory_free_buffer(zone);
}
/** @brief Resets the icaltimezone to the initial state, freeing most of the
@@ -270,13 +262,13 @@ void icaltimezone_free(icaltimezone *zone, int free_struct)
static void icaltimezone_reset(icaltimezone *zone)
{
if (zone->tzid)
- free(zone->tzid);
+ icalmemory_free_buffer(zone->tzid);
if (zone->location)
- free(zone->location);
+ icalmemory_free_buffer(zone->location);
if (zone->tznames)
- free(zone->tznames);
+ icalmemory_free_buffer(zone->tznames);
if (zone->component)
icalcomponent_free(zone->component);
@@ -329,9 +321,9 @@ static int icaltimezone_get_vtimezone_properties(icaltimezone *zone, icalcompone
}
if (zone->tzid) {
- free(zone->tzid);
+ icalmemory_free_buffer(zone->tzid);
}
- zone->tzid = strdup(tzid);
+ zone->tzid = icalmemory_strdup(tzid);
if (zone->component) {
icalcomponent_free(zone->component);
@@ -339,12 +331,12 @@ static int icaltimezone_get_vtimezone_properties(icaltimezone *zone, icalcompone
zone->component = component;
if (zone->location) {
- free(zone->location);
+ icalmemory_free_buffer(zone->location);
}
zone->location = icaltimezone_get_location_from_vtimezone(component);
if (zone->tznames) {
- free(zone->tznames);
+ icalmemory_free_buffer(zone->tznames);
}
zone->tznames = icaltimezone_get_tznames_from_vtimezone(component);
@@ -361,7 +353,7 @@ char *icaltimezone_get_location_from_vtimezone(icalcomponent *component)
if (prop) {
location = icalproperty_get_location(prop);
if (location)
- return strdup(location);
+ return icalmemory_strdup(location);
}
prop = icalcomponent_get_first_property(component, ICAL_X_PROPERTY);
@@ -370,7 +362,7 @@ char *icaltimezone_get_location_from_vtimezone(icalcomponent *component)
if (name && !strcasecmp(name, "X-LIC-LOCATION")) {
location = icalproperty_get_x(prop);
if (location)
- return strdup(location);
+ return icalmemory_strdup(location);
}
prop = icalcomponent_get_next_property(component, ICAL_X_PROPERTY);
}
@@ -463,11 +455,11 @@ char *icaltimezone_get_tznames_from_vtimezone(icalcomponent *component)
char *tznames;
if (!strcmp(standard_tzname, daylight_tzname))
- return strdup(standard_tzname);
+ return icalmemory_strdup(standard_tzname);
standard_len = strlen(standard_tzname);
daylight_len = strlen(daylight_tzname);
- tznames = malloc(standard_len + daylight_len + 2);
+ tznames = icalmemory_new_buffer(standard_len + daylight_len + 2);
strcpy(tznames, standard_tzname);
tznames[standard_len] = '/';
strcpy(tznames + standard_len + 1, daylight_tzname);
@@ -477,7 +469,7 @@ char *icaltimezone_get_tznames_from_vtimezone(icalcomponent *component)
/* If either of the TZNAMEs was found just return that, else NULL. */
tznames = standard_tzname ? standard_tzname : daylight_tzname;
- return tznames ? strdup(tznames) : NULL;
+ return tznames ? icalmemory_strdup(tznames) : NULL;
}
}
@@ -1431,9 +1423,9 @@ static int get_offset(icaltimezone *zone)
struct tm local;
struct icaltimetype tt;
int offset;
- const time_t now = time(NULL);
+ const icaltime_t now = icaltime(NULL);
- if (!gmtime_r(&now, &local))
+ if (!icalgmtime_r(&now, &local))
return 0;
tt = tm_to_icaltimetype(&local);
@@ -1575,7 +1567,7 @@ static int parse_coord(char *coord, int len, int *degrees, int *minutes, int *se
} else if (len == 8) {
sscanf(coord + 1, "%3d%2d%2d", degrees, minutes, seconds);
} else {
- fprintf(stderr, "Invalid coordinate: %s\n", coord);
+ icalerrprintf("Invalid coordinate: %s\n", coord);
return 1;
}
@@ -1605,7 +1597,7 @@ static int fetch_lat_long_from_string(const char *str,
sptr++;
}
len = (ptrdiff_t) (sptr - temp);
- lat = (char *)malloc(len + 1);
+ lat = (char *)icalmemory_new_buffer(len + 1);
memset(lat, '\0', len + 1);
strncpy(lat, temp, len);
lat[len] = '\0';
@@ -1647,11 +1639,11 @@ static int fetch_lat_long_from_string(const char *str,
latitude_seconds) == 1 ||
parse_coord(lon, (int)strlen(lon),
longitude_degrees, longitude_minutes, longitude_seconds) == 1) {
- free(lat);
+ icalmemory_free_buffer(lat);
return 1;
}
- free(lat);
+ icalmemory_free_buffer(lat);
return 0;
}
@@ -1704,7 +1696,7 @@ static void icaltimezone_parse_zone_tab(void)
filename_len += strlen(zonetab);
filename_len += 2; /* for dir separator and final '\0' */
- filename = (char *)malloc(filename_len);
+ filename = (char *)icalmemory_new_buffer(filename_len);
if (!filename) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return;
@@ -1712,7 +1704,7 @@ static void icaltimezone_parse_zone_tab(void)
snprintf(filename, filename_len, "%s/%s", zonedir, zonetab);
fp = fopen(filename, "r");
- free(filename);
+ icalmemory_free_buffer(filename);
icalerror_assert(fp, "Cannot open the zonetab file for reading");
if (!fp) {
icalerror_set_errno(ICAL_INTERNAL_ERROR);
@@ -1732,7 +1724,7 @@ static void icaltimezone_parse_zone_tab(void)
if (sscanf(buf, "%1000s", location) != 1) { /*limit location to 1000chars */
/*increase as needed */
/*see location and buf declarations */
- fprintf(stderr, "Invalid timezone description line: %s\n", buf);
+ icalerrprintf("Invalid timezone description line: %s\n", buf);
continue;
}
} else if (sscanf(buf, "%4d%2d%2d %4d%2d%2d %1000s", /*limit location to 1000chars */
@@ -1742,7 +1734,7 @@ static void icaltimezone_parse_zone_tab(void)
&latitude_seconds,
&longitude_degrees, &longitude_minutes,
&longitude_seconds, location) != 7) {
- fprintf(stderr, "Invalid timezone description line: %s\n", buf);
+ icalerrprintf("Invalid timezone description line: %s\n", buf);
continue;
}
} else {
@@ -1751,13 +1743,13 @@ static void icaltimezone_parse_zone_tab(void)
&latitude_seconds,
&longitude_degrees, &longitude_minutes,
&longitude_seconds, location)) {
- fprintf(stderr, "Invalid timezone description line: %s\n", buf);
+ icalerrprintf("Invalid timezone description line: %s\n", buf);
continue;
}
}
icaltimezone_init(&zone);
- zone.location = strdup(location);
+ zone.location = icalmemory_strdup(location);
if (latitude_degrees >= 0) {
zone.latitude =
@@ -1803,7 +1795,7 @@ void icaltimezone_release_zone_tab(void)
builtin_timezones = NULL;
for (i = 0; i < mybuiltin_timezones->num_elements; i++) {
- free(((icaltimezone *) icalarray_element_at(mybuiltin_timezones, i))->location);
+ icalmemory_free_buffer(((icaltimezone *) icalarray_element_at(mybuiltin_timezones, i))->location);
}
icalarray_free(mybuiltin_timezones);
}
@@ -1839,7 +1831,7 @@ static void icaltimezone_load_builtin_timezone(icaltimezone *zone)
filename_len = strlen(get_zone_directory()) + strlen(zone->location) + 6;
- filename = (char *)malloc(filename_len);
+ filename = (char *)icalmemory_new_buffer(filename_len);
if (!filename) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto out;
@@ -1848,7 +1840,7 @@ static void icaltimezone_load_builtin_timezone(icaltimezone *zone)
snprintf(filename, filename_len, "%s/%s.ics", get_zone_directory(), zone->location);
fp = fopen(filename, "r");
- free(filename);
+ icalmemory_free_buffer(filename);
if (!fp) {
icalerror_set_errno(ICAL_FILE_ERROR);
goto out;
@@ -1856,7 +1848,7 @@ static void icaltimezone_load_builtin_timezone(icaltimezone *zone)
/* ##### B.# Sun, 11 Nov 2001 04:04:29 +1100
this is where the MALFORMEDDATA error is being set, after the call to 'icalparser_parse'
- fprintf(stderr, "** WARNING ** %s: %d %s\n",
+ icalerrprintf("** WARNING ** %s: %d %s\n",
__FILE__, __LINE__, icalerror_strerror(icalerrno));
*/
@@ -1880,11 +1872,11 @@ static void icaltimezone_load_builtin_timezone(icaltimezone *zone)
const char *tzid_prefix = icaltimezone_tzid_prefix();
new_tzid_len = strlen(tzid_prefix) + strlen(zone->location) + 1;
- new_tzid = (char *)malloc(sizeof(char) * (new_tzid_len + 1));
+ new_tzid = (char *)icalmemory_new_buffer(sizeof(char) * (new_tzid_len + 1));
if(new_tzid) {
snprintf(new_tzid, new_tzid_len, "%s%s", tzid_prefix, zone->location);
icalproperty_set_tzid(prop, new_tzid);
- free(new_tzid);
+ icalmemory_free_buffer(new_tzid);
} else {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
}
@@ -2003,7 +1995,7 @@ static void format_utc_offset(int utc_offset, char *buffer, size_t buffer_size)
hours, and daylight saving shouldn't change it by more than a few hours.
(The maximum offset is 15 hours 56 minutes at present.) */
if (hours < 0 || hours >= 24 || minutes < 0 || minutes >= 60 || seconds < 0 || seconds >= 60) {
- fprintf(stderr, "Warning: Strange timezone offset: H:%i M:%i S:%i\n",
+ icalerrprintf("Warning: Strange timezone offset: H:%i M:%i S:%i\n",
hours, minutes, seconds);
}
@@ -2139,7 +2131,7 @@ static const char *get_zone_directory(void)
zislashp1 = zislash + 1;
strcat(dirname, (char *)zislashp1);
if (stat(dirname, &st) == 0 && S_ISDIR(st.st_mode)) {
- cache = strdup(dirname);
+ cache = icalmemory_strdup(dirname);
return cache;
}
}
@@ -2154,7 +2146,7 @@ void set_zone_directory(const char *path)
if (zone_files_directory)
free_zone_directory();
- zone_files_directory = malloc(strlen(path) + 1);
+ zone_files_directory = icalmemory_new_buffer(strlen(path) + 1);
if (zone_files_directory != NULL)
strcpy(zone_files_directory, path);
@@ -2163,7 +2155,7 @@ void set_zone_directory(const char *path)
void free_zone_directory(void)
{
if (zone_files_directory != NULL) {
- free(zone_files_directory);
+ icalmemory_free_buffer(zone_files_directory);
zone_files_directory = NULL;
}
}
diff --git a/src/libical/icaltimezone.h b/src/libical/icaltimezone.h
index 90951ac4..01677150 100644
--- a/src/libical/icaltimezone.h
+++ b/src/libical/icaltimezone.h
@@ -2,18 +2,10 @@
FILE: icaltimezone.h
CREATOR: Damon Chaplin 15 March 2001
- (C) COPYRIGHT 2001, Damon Chaplin <damon@ximian.com>
+ SPDX-FileCopyrightText: 2001, Damon Chaplin <damon@ximian.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/**
* @file icaltimezone.h
diff --git a/src/libical/icaltimezoneimpl.h b/src/libical/icaltimezoneimpl.h
index 5f869521..63725f03 100644
--- a/src/libical/icaltimezoneimpl.h
+++ b/src/libical/icaltimezoneimpl.h
@@ -2,18 +2,10 @@
FILE: icaltimezoneimpl.h
CREATOR: glenn 07 March 2010
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALTIMEZONEIMPL_H
diff --git a/src/libical/icaltypes.c b/src/libical/icaltypes.c
index 97007134..99cbb42e 100644
--- a/src/libical/icaltypes.c
+++ b/src/libical/icaltypes.c
@@ -2,18 +2,10 @@
FILE: icaltypes.c
CREATOR: eric 16 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
#include <config.h>
diff --git a/src/libical/icaltypes.h b/src/libical/icaltypes.h
index edbf003d..bad766b5 100644
--- a/src/libical/icaltypes.h
+++ b/src/libical/icaltypes.h
@@ -2,18 +2,10 @@
FILE: icaltypes.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALTYPES_H
@@ -30,10 +22,11 @@ struct icaldatetimeperiodtype
struct icalperiodtype period;
};
+#define ICAL_GEO_LEN 16
struct icalgeotype
{
- double lat;
- double lon;
+ char lat[ICAL_GEO_LEN];
+ char lon[ICAL_GEO_LEN];
};
struct icaltriggertype
diff --git a/src/libical/icaltz-util.c b/src/libical/icaltz-util.c
index 88bd4ab6..a4a4db05 100644
--- a/src/libical/icaltz-util.c
+++ b/src/libical/icaltz-util.c
@@ -2,18 +2,9 @@
* Authors :
* Chenthill Palanisamy <pchenthill@novell.com>
*
- * Copyright 2007, Novell, Inc.
+ * SPDX-FileCopyrightText: 2007, Novell, Inc.
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
//krazy:excludeall=cpp
@@ -24,6 +15,7 @@
#include "icaltz-util.h"
#include "icalerror.h"
#include "icaltimezone.h"
+#include "icalmemory.h"
#include <stdlib.h>
#include <limits.h>
@@ -126,7 +118,7 @@ typedef struct
typedef struct
{
- time_t transition;
+ icaltime_t transition;
long int change;
} leap;
//@endcond
@@ -190,7 +182,7 @@ static char *zname_from_stridx(char *str, size_t idx)
size = i - idx;
str += idx;
- ret = (char *)malloc(size + 1);
+ ret = (char *)icalmemory_new_buffer(size + 1);
ret = strncpy(ret, str, size);
ret[size] = '\0';
@@ -270,7 +262,7 @@ static char *parse_posix_zone(char *p, ttinfo *type)
size = strcspn(p, "-+0123456789,\n");
}
- type->zname = (char *) malloc(size + 1);
+ type->zname = (char *) icalmemory_new_buffer(size + 1);
strncpy(type->zname, p, size);
type->zname[size] = '\0';
p += size;
@@ -444,7 +436,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
const char *zonedir;
FILE *f = NULL;
char *full_path = NULL;
- time_t *transitions = NULL;
+ icaltime_t *transitions = NULL;
char *r_trans = NULL, *temp;
int *trans_idx = NULL;
ttinfo *types = NULL;
@@ -484,7 +476,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
}
size = strlen(zonedir) + strlen(location) + 2;
- full_path = (char *)malloc(size);
+ full_path = (char *)icalmemory_new_buffer(size);
if (full_path == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
@@ -506,7 +498,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
break;
case '2':
case '3':
- if (sizeof(time_t) == 8) {
+ if (sizeof(icaltime_t) == 8) {
trans_size = 8;
}
break;
@@ -548,24 +540,24 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
}
/* read data block */
- transitions = calloc(num_trans+1, sizeof(time_t)); // +1 for TZ string
+ transitions = icalmemory_new_buffer((num_trans+1) * sizeof(icaltime_t)); // +1 for TZ string
if (transitions == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
}
- r_trans = calloc(num_trans, (size_t)trans_size);
+ r_trans = icalmemory_new_buffer(num_trans * (size_t)trans_size);
if (r_trans == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
}
- trans_idx = calloc(num_trans+1, sizeof(int)); // +1 for TZ string
+ trans_idx = icalmemory_new_buffer((num_trans+1) * sizeof(int)); // +1 for TZ string
if (trans_idx == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
}
if (num_trans == 0) {
// Add one transition using time type 0 at 19011213T204552Z
- transitions[0] = (time_t)INT_MIN;
+ transitions[0] = (icaltime_t)INT_MIN;
trans_idx[0] = 0;
num_trans = 1;
} else {
@@ -574,16 +566,16 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
for (i = 0; i < num_trans; i++) {
trans_idx[i] = fgetc(f);
if (trans_size == 8) {
- transitions[i] = (time_t) decode64(r_trans);
+ transitions[i] = (icaltime_t) decode64(r_trans);
} else {
- transitions[i] = (time_t) decode(r_trans);
+ transitions[i] = (icaltime_t) decode(r_trans);
}
r_trans += trans_size;
}
r_trans = temp;
}
- types = calloc(num_types+2, sizeof(ttinfo)); // +2 for TZ string
+ types = icalmemory_new_buffer((num_types+2) * sizeof(ttinfo)); // +2 for TZ string
if (types == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
@@ -602,7 +594,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
types[i].gmtoff = decode(a);
}
- znames = (char *)malloc(num_chars);
+ znames = (char *)icalmemory_new_buffer(num_chars);
if (znames == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
@@ -611,7 +603,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
/* We got all the information which we need */
- leaps = calloc(num_leaps, sizeof(leap));
+ leaps = icalmemory_new_buffer(num_leaps * sizeof(leap));
if (leaps == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
@@ -621,9 +613,9 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
EFREAD(c, (size_t)trans_size, 1, f);
if (trans_size == 8) {
- leaps[i].transition = (time_t)decode64(c);
+ leaps[i].transition = (icaltime_t)decode64(c);
} else {
- leaps[i].transition = (time_t)decode(c);
+ leaps[i].transition = (icaltime_t)decode(c);
}
EFREAD(c, 4, 1, f);
@@ -656,7 +648,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
/* Read the footer */
if (trans_size == 8 &&
- (footer[0] = fgetc(f)) == '\n' &&
+ (footer[0] = (char)fgetc(f)) == '\n' &&
fgets(footer+1, (int) sizeof(footer)-1, f) &&
footer[strlen(footer)-1] == '\n') {
tzstr = footer+1;
@@ -739,7 +731,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
/* Add tzid property */
size = strlen(icaltimezone_tzid_prefix()) + strlen(location) + 1;
- tzid = (char *)malloc(size);
+ tzid = (char *)icalmemory_new_buffer(size);
if (tzid == NULL) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
goto error;
@@ -756,7 +748,7 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
for (i = 0; i < num_trans; i++) {
int by_day = 0;
- time_t start;
+ icaltime_t start;
enum icalrecurrencetype_weekday dow;
prev_idx = idx;
@@ -915,34 +907,34 @@ icalcomponent *icaltzutil_fetch_timezone(const char *location)
fclose(f);
if (full_path)
- free(full_path);
+ icalmemory_free_buffer(full_path);
if (transitions)
- free(transitions);
+ icalmemory_free_buffer(transitions);
if (r_trans)
- free(r_trans);
+ icalmemory_free_buffer(r_trans);
if (trans_idx)
- free(trans_idx);
+ icalmemory_free_buffer(trans_idx);
if (types) {
for (i = 0; i < num_types; i++) {
if (types[i].zname) {
- free(types[i].zname);
+ icalmemory_free_buffer(types[i].zname);
}
}
- free(types);
+ icalmemory_free_buffer(types);
}
if (znames)
- free(znames);
+ icalmemory_free_buffer(znames);
if (leaps)
- free(leaps);
+ icalmemory_free_buffer(leaps);
if (tzid)
- free(tzid);
+ icalmemory_free_buffer(tzid);
return tz_comp;
}
diff --git a/src/libical/icaltz-util.h b/src/libical/icaltz-util.h
index 1f853a09..25879748 100644
--- a/src/libical/icaltz-util.h
+++ b/src/libical/icaltz-util.h
@@ -2,18 +2,9 @@
* Authors :
* Chenthill Palanisamy <pchenthill@novell.com>
*
- * Copyright 2007, Novell, Inc.
+ * SPDX-FileCopyrightText: 2007, Novell, Inc.
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifndef ICALTZUTIL_H
@@ -53,7 +44,9 @@ LIBICAL_ICAL_EXPORT void icaltzutil_set_zone_directory(const char *zonepath);
*
* @param location is a string containing the name of a location with a timezone file
* found under the zoneinfo data.
+ *
+ * @since 3.1 no longer publicly accessible
*/
-LIBICAL_ICAL_EXPORT icalcomponent *icaltzutil_fetch_timezone(const char *location);
+LIBICAL_ICAL_NO_EXPORT icalcomponent *icaltzutil_fetch_timezone(const char *location);
#endif
diff --git a/src/libical/icalvalue.c b/src/libical/icalvalue.c
index 81c48315..c41a69a3 100644
--- a/src/libical/icalvalue.c
+++ b/src/libical/icalvalue.c
@@ -2,18 +2,9 @@
FILE: icalvalue.c
CREATOR: eric 02 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
Contributions from:
Graham Davison <g.m.davison@computer.org>
@@ -42,7 +33,7 @@ LIBICAL_ICAL_EXPORT struct icalvalue_impl *icalvalue_new_impl(icalvalue_kind kin
if (!icalvalue_kind_is_valid(kind))
return NULL;
- if ((v = (struct icalvalue_impl *)malloc(sizeof(struct icalvalue_impl))) == 0) {
+ if ((v = (struct icalvalue_impl *)icalmemory_new_buffer(sizeof(struct icalvalue_impl))) == 0) {
icalerror_set_errno(ICAL_NEWFAILED_ERROR);
return 0;
}
@@ -174,7 +165,7 @@ icalvalue *icalvalue_new_clone(const icalvalue *old)
static char *icalmemory_strdup_and_dequote(const char *str)
{
const char *p;
- char *out = (char *)malloc(sizeof(char) * strlen(str) + 1);
+ char *out = (char *)icalmemory_new_buffer(sizeof(char) * strlen(str) + 1);
char *pout;
int wroteNull = 0;
@@ -311,7 +302,8 @@ static char *icalmemory_strdup_and_quote(const icalvalue *value, const char *unq
https://tools.ietf.org/html/rfc5545#section-3.8.1.2 */
if ((icalproperty_isa(value->parent) == ICAL_CATEGORIES_PROPERTY) ||
(icalproperty_isa(value->parent) == ICAL_RESOURCES_PROPERTY) ||
- (icalproperty_isa(value->parent) == ICAL_POLLPROPERTIES_PROPERTY)) {
+ (icalproperty_isa(value->parent) == ICAL_POLLPROPERTIES_PROPERTY) ||
+ (icalproperty_isa(value->parent) == ICAL_LOCATIONTYPE_PROPERTY)) {
icalmemory_append_char(&str, &str_p, &buf_sz, *p);
break;
}
@@ -365,23 +357,20 @@ static icalvalue *icalvalue_new_enum(icalvalue_kind kind, int x_type, const char
}
/**
- * Transforms a simple float number string into a double.
+ * Extracts a simple floating point number as a substring.
* The decimal separator (if any) of the double has to be '.'
* The code is locale *independent* and does *not* change the locale.
* It should be thread safe.
- * If you want a code that does the same job with a decimal separator
- * dependent on the current locale, then use strtof() from libc.
*/
-static int simple_str_to_double(const char *from, double *result, char **to)
+static int simple_str_to_doublestr(const char *from, char *result, char **to)
{
-#define TMP_NUM_SIZE 100
char *start = NULL, *end = NULL, *cur = (char *)from;
- char tmp_buf[TMP_NUM_SIZE + 1]; /*hack */
#if !defined(HAVE_GETNUMBERFORMAT)
struct lconv *loc_data = localeconv();
#endif
int i = 0;
+ double dtest;
/*sanity checks */
if (!from || !result) {
@@ -393,8 +382,7 @@ static int simple_str_to_double(const char *from, double *result, char **to)
cur++;
start = cur;
- /* copy the part that looks like a double into tmp_buf
- * so that we can call strtof() on it.
+ /* copy the part that looks like a double into result.
* during the copy, we give ourselves a chance to convert the '.'
* into the decimal separator of the current locale.
*/
@@ -406,7 +394,6 @@ static int simple_str_to_double(const char *from, double *result, char **to)
/*huh hoh, number is too big. getting out */
return 1;
}
- memset(tmp_buf, 0, TMP_NUM_SIZE + 1);
/* copy the float number string into tmp_buf, and take
* care to have the (optional) decimal separator be the one
@@ -417,18 +404,22 @@ static int simple_str_to_double(const char *from, double *result, char **to)
if (start[i] == '.' && loc_data && loc_data->decimal_point && loc_data->decimal_point[0]
&& loc_data->decimal_point[0] != '.') {
/*replace '.' by the digit separator of the current locale */
- tmp_buf[i] = loc_data->decimal_point[0];
+ result[i] = loc_data->decimal_point[0];
} else {
- tmp_buf[i] = start[i];
+ result[i] = start[i];
}
}
#else
- GetNumberFormat(LOCALE_SYSTEM_DEFAULT, 0, start, NULL, tmp_buf, TMP_NUM_SIZE);
+ GetNumberFormat(LOCALE_SYSTEM_DEFAULT, 0, start, NULL, result, TMP_NUM_SIZE);
#endif
if (to) {
*to = end;
}
- *result = atof(tmp_buf);
+
+ /* now try to convert to a floating point number, to check for validity only */
+ if (sscanf(result, "%lf", &dtest) != 1) {
+ return 1;
+ }
return 0;
}
@@ -569,7 +560,7 @@ static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
char *dequoted_str = icalmemory_strdup_and_dequote(str);
value = icalvalue_new_text(dequoted_str);
- free(dequoted_str);
+ icalmemory_free_buffer(dequoted_str);
break;
}
@@ -588,13 +579,14 @@ static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
case ICAL_GEO_VALUE:
{
char *cur = NULL;
- struct icalgeotype geo = { 0.0, 0.0 };
+ struct icalgeotype geo;
+ memset(geo.lat, 0, ICAL_GEO_LEN);
+ memset(geo.lon, 0, ICAL_GEO_LEN);
- if (simple_str_to_double(str, &geo.lat, &cur)) {
+ if (simple_str_to_doublestr(str, geo.lat, &cur)) {
goto geo_parsing_error;
}
-
- /*skip white spaces */
+ /* skip white spaces */
while (cur && isspace((int)*cur)) {
++cur;
}
@@ -606,12 +598,12 @@ static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
++cur;
- /*skip white spaces */
+ /* skip white spaces */
while (cur && isspace((int)*cur)) {
++cur;
}
- if (simple_str_to_double(cur, &geo.lon, &cur)) {
+ if (simple_str_to_doublestr(cur, geo.lon, &cur)) {
goto geo_parsing_error;
}
value = icalvalue_new_geo(geo);
@@ -640,7 +632,7 @@ static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
if (rt.freq != ICAL_NO_RECURRENCE) {
value = icalvalue_new_recur(rt);
}
- free(rt.rscale);
+ icalmemory_free_buffer(rt.rscale);
break;
}
@@ -727,7 +719,7 @@ static icalvalue *icalvalue_new_from_string_with_error(icalvalue_kind kind,
char *dequoted_str = icalmemory_strdup_and_dequote(str);
value = icalvalue_new_x(dequoted_str);
- free(dequoted_str);
+ icalmemory_free_buffer(dequoted_str);
}
break;
@@ -781,7 +773,7 @@ void icalvalue_free(icalvalue *v)
}
if (v->x_value != 0) {
- free(v->x_value);
+ icalmemory_free_buffer(v->x_value);
}
switch (v->kind) {
@@ -801,7 +793,7 @@ void icalvalue_free(icalvalue *v)
case ICAL_QUERY_VALUE:
{
if (v->data.v_string != 0) {
- free((void *)v->data.v_string);
+ icalmemory_free_buffer((void *)v->data.v_string);
v->data.v_string = 0;
}
break;
@@ -809,8 +801,8 @@ void icalvalue_free(icalvalue *v)
case ICAL_RECUR_VALUE:
{
if (v->data.v_recur != 0) {
- free(v->data.v_recur->rscale);
- free((void *)v->data.v_recur);
+ icalmemory_free_buffer(v->data.v_recur->rscale);
+ icalmemory_free_buffer((void *)v->data.v_recur);
v->data.v_recur = 0;
}
break;
@@ -827,7 +819,7 @@ void icalvalue_free(icalvalue *v)
v->parent = 0;
memset(&(v->data), 0, sizeof(v->data));
v->id[0] = 'X';
- free(v);
+ icalmemory_free_buffer(v);
}
int icalvalue_is_valid(const icalvalue *value)
@@ -904,10 +896,13 @@ static char *icalvalue_utcoffset_as_ical_string_r(const icalvalue *value)
m = (data - (h * 3600)) / 60;
s = (data - (h * 3600) - (m * 60));
+ h = MIN(abs(h), 23);
+ m = MIN(abs(m), 59);
+ s = MIN(abs(s), 59);
if (s != 0) {
- snprintf(str, 9, "%c%02d%02d%02d", sign, abs(h), abs(m), abs(s));
+ snprintf(str, 9, "%c%02d%02d%02d", sign, h, m, s);
} else {
- snprintf(str, 9, "%c%02d%02d", sign, abs(h), abs(m));
+ snprintf(str, 9, "%c%02d%02d", sign, h, m);
}
return str;
@@ -1075,7 +1070,7 @@ static char *icalvalue_float_as_ical_string_r(const icalvalue *value)
/* bypass current locale in order to make
sure snprintf uses a '.' as a separator
set locate to 'C' and keep old locale */
- old_locale = strdup(setlocale(LC_NUMERIC, NULL));
+ old_locale = icalmemory_strdup(setlocale(LC_NUMERIC, NULL));
(void)setlocale(LC_NUMERIC, "C");
str = (char *)icalmemory_new_buffer(40);
@@ -1084,7 +1079,7 @@ static char *icalvalue_float_as_ical_string_r(const icalvalue *value)
/* restore saved locale */
(void)setlocale(LC_NUMERIC, old_locale);
- free(old_locale);
+ icalmemory_free_buffer(old_locale);
return str;
}
@@ -1102,16 +1097,16 @@ static char *icalvalue_geo_as_ical_string_r(const icalvalue *value)
/* bypass current locale in order to make
* sure snprintf uses a '.' as a separator
* set locate to 'C' and keep old locale */
- old_locale = strdup(setlocale(LC_NUMERIC, NULL));
+ old_locale = icalmemory_strdup(setlocale(LC_NUMERIC, NULL));
(void)setlocale(LC_NUMERIC, "C");
str = (char *)icalmemory_new_buffer(80);
- snprintf(str, 80, "%f;%f", data.lat, data.lon);
+ snprintf(str, 80, "%s;%s", data.lat, data.lon);
/* restore saved locale */
(void)setlocale(LC_NUMERIC, old_locale);
- free(old_locale);
+ icalmemory_free_buffer(old_locale);
return str;
}
@@ -1393,8 +1388,8 @@ icalparameter_xliccomparetype icalvalue_compare(const icalvalue *a, const icalva
temp1 = icalvalue_as_ical_string_r(a);
temp2 = icalvalue_as_ical_string_r(b);
r = strcmp(temp1, temp2);
- free(temp1);
- free(temp2);
+ icalmemory_free_buffer(temp1);
+ icalmemory_free_buffer(temp2);
if (r > 0) {
return ICAL_XLICCOMPARETYPE_GREATER;
@@ -1500,12 +1495,12 @@ int icalvalue_encode_ical_string(const char *szText, char *szEncText, int nMaxBu
if ((int)strlen(ptr) >= nMaxBufferLen) {
icalvalue_free(value);
- free(ptr);
+ icalmemory_free_buffer(ptr);
return 0;
}
strcpy(szEncText, ptr);
- free(ptr);
+ icalmemory_free_buffer(ptr);
icalvalue_free((icalvalue *) value);
diff --git a/src/libical/icalvalue.h b/src/libical/icalvalue.h
index 382eee73..d6946dcc 100644
--- a/src/libical/icalvalue.h
+++ b/src/libical/icalvalue.h
@@ -2,18 +2,10 @@
FILE: icalvalue.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALVALUE_H
diff --git a/src/libical/icalvalue_cxx.cpp b/src/libical/icalvalue_cxx.cpp
index e8359667..f737bd4b 100644
--- a/src/libical/icalvalue_cxx.cpp
+++ b/src/libical/icalvalue_cxx.cpp
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalvalue_cxx.cpp
CREATOR: fnguyen 12/21/01
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/libical/icalvalue_cxx.h b/src/libical/icalvalue_cxx.h
index 95124d59..b922debf 100644
--- a/src/libical/icalvalue_cxx.h
+++ b/src/libical/icalvalue_cxx.h
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalvalue_cxx.h
CREATOR: fnguyen 12/13/01
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALVALUE_CXX_H
diff --git a/src/libical/icalvalueimpl.h b/src/libical/icalvalueimpl.h
index 570409bd..0cd2f65f 100644
--- a/src/libical/icalvalueimpl.h
+++ b/src/libical/icalvalueimpl.h
@@ -2,18 +2,9 @@
FILE: icalvalue.c
CREATOR: eric 02 May 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
Contributions from:
Graham Davison (g.m.davison@computer.org)
diff --git a/src/libical/icalversion.h.cmake b/src/libical/icalversion.h.cmake
index 83fa2f54..06ea6ab3 100644
--- a/src/libical/icalversion.h.cmake
+++ b/src/libical/icalversion.h.cmake
@@ -2,18 +2,10 @@
FILE: icalversion.h
CREATOR: eric 20 March 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICAL_VERSION_H
diff --git a/src/libical/icptrholder_cxx.h b/src/libical/icptrholder_cxx.h
index bd63fe5a..95b65e5c 100644
--- a/src/libical/icptrholder_cxx.h
+++ b/src/libical/icptrholder_cxx.h
@@ -25,18 +25,10 @@
* VComponentTmpPtr p;// VComponentTmpPtr is an instantiation of this template
* for (p=component.get_first_component; p!= 0; p=component.get_next_component) {
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifndef ICPTRHOLDER_CXX_H
@@ -106,13 +98,13 @@ public:
T *operator->() const
{
- assert(ptr);
+ icalassert(ptr);
return ptr;
}
T &operator*()
{
- assert(ptr);
+ icalassert(ptr);
return *ptr;
}
diff --git a/src/libical/libical_deprecated.h b/src/libical/libical_deprecated.h
index d1fa9dad..06fc28f1 100644
--- a/src/libical/libical_deprecated.h
+++ b/src/libical/libical_deprecated.h
@@ -1,3 +1,8 @@
+/**
+ SPDX-FileCopyrightText: Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
#ifndef LIBICAL_DEPRECATED_H
#define LIBICAL_DEPRECATED_H
diff --git a/src/libical/libical_ical_export.h b/src/libical/libical_ical_export.h
index 2a2cb030..a4d7f66f 100644
--- a/src/libical/libical_ical_export.h
+++ b/src/libical/libical_ical_export.h
@@ -1,3 +1,8 @@
+/**
+ SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
#ifndef LIBICAL_ICAL_EXPORT_H
#define LIBICAL_ICAL_EXPORT_H
diff --git a/src/libical/pvl.c b/src/libical/pvl.c
index 960941a7..0695a342 100644
--- a/src/libical/pvl.c
+++ b/src/libical/pvl.c
@@ -2,18 +2,10 @@
FILE: pvl.c
CREATOR: eric November, 1995
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -22,6 +14,8 @@
#include "pvl.h"
+#include "icalmemory.h"
+
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
@@ -80,7 +74,7 @@ pvl_list pvl_newlist()
{
struct pvl_list_t *L;
- if ((L = (struct pvl_list_t *)malloc(sizeof(struct pvl_list_t))) == 0) {
+ if ((L = (struct pvl_list_t *)icalmemory_new_buffer(sizeof(struct pvl_list_t))) == 0) {
errno = ENOMEM;
return 0;
}
@@ -102,7 +96,7 @@ void pvl_free(pvl_list l)
pvl_clear(l);
- free(L);
+ icalmemory_free_buffer(L);
}
/**
@@ -124,7 +118,7 @@ pvl_elem pvl_new_element(void *d, pvl_elem next, pvl_elem prior)
{
struct pvl_elem_t *E;
- if ((E = (struct pvl_elem_t *)malloc(sizeof(struct pvl_elem_t))) == 0) {
+ if ((E = (struct pvl_elem_t *)icalmemory_new_buffer(sizeof(struct pvl_elem_t))) == 0) {
errno = ENOMEM;
return 0;
}
@@ -275,7 +269,7 @@ void pvl_insert_ordered(pvl_list L, pvl_comparef f, void *d)
/* badness, choke */
#if !defined(lint)
- assert(0);
+ icalassert(0);
#endif
}
@@ -384,7 +378,7 @@ void *pvl_remove(pvl_list L, pvl_elem E)
E->next = 0;
E->d = 0;
- free(E);
+ icalmemory_free_buffer(E);
return data;
}
diff --git a/src/libical/pvl.h b/src/libical/pvl.h
index 50feef16..50369ef3 100644
--- a/src/libical/pvl.h
+++ b/src/libical/pvl.h
@@ -2,18 +2,10 @@
FILE: pvl.h
CREATOR: eric November, 1995
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICAL_PVL_H
diff --git a/src/libical/qsort_gen.c b/src/libical/qsort_gen.c
index 02f012ed..556eb683 100644
--- a/src/libical/qsort_gen.c
+++ b/src/libical/qsort_gen.c
@@ -1,16 +1,7 @@
/*======================================================================
FILE: qsort_gen.c
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The code in this file was initially authored as part of the PDCLib project
and placed in the public domain. The initial copyright notice was as follows:
diff --git a/src/libical/qsort_gen.h b/src/libical/qsort_gen.h
index 5f979532..32532127 100644
--- a/src/libical/qsort_gen.h
+++ b/src/libical/qsort_gen.h
@@ -1,18 +1,9 @@
/*======================================================================
FILE: qsort_gen.h
- (C) COPYRIGHT 2018, Markus Minichmayr <markus@tapkey.com>
+ SPDX-FileCopyrightText: 2018, Markus Minichmayr <markus@tapkey.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Markus Minichmayr.
======================================================================*/
@@ -31,7 +22,6 @@
/**
* @brief Sort an arbitrary list of items using the qsort algorithm.
- * @param context A pointer representing the list to be sorted. Won't be
* interpreted by this function but passed to the compar and swapr functions.
* @param nitems The number of items in the list.
* @param compar The comparator function. The function receives the pointer
diff --git a/src/libical/sspm.c b/src/libical/sspm.c
index 0174d23b..e05d22f7 100644
--- a/src/libical/sspm.c
+++ b/src/libical/sspm.c
@@ -2,29 +2,9 @@
FILE: sspm.c Parse Mime
CREATOR: eric 25 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
@@ -35,6 +15,8 @@
#include "sspm.h"
+#include "icalmemory.h"
+
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
@@ -136,7 +118,7 @@ static char *sspm_strdup(const char *str)
{
char *s;
- s = strdup(str);
+ s = icalmemory_strdup(str);
return s;
}
@@ -397,7 +379,7 @@ static struct sspm_action_map get_action(struct mime_impl *impl,
return sspm_action_map[i];
}
}
- assert(i < len); /*should return before now */
+ icalassert(i < len); /*should return before now */
return sspm_action_map[0];
}
@@ -426,11 +408,11 @@ static enum sspm_major_type sspm_find_major_content_type(char *type)
for (i = 0; major_content_type_map[i].type != SSPM_UNKNOWN_MAJOR_TYPE; i++) {
if (strncmp(ltype, major_content_type_map[i].str,
strlen(major_content_type_map[i].str)) == 0) {
- free(ltype);
+ icalmemory_free_buffer(ltype);
return major_content_type_map[i].type;
}
}
- free(ltype);
+ icalmemory_free_buffer(ltype);
return major_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
}
@@ -442,7 +424,7 @@ static enum sspm_minor_type sspm_find_minor_content_type(char *type)
char *p = strchr(ltype, '/');
if (p == 0) {
- free(ltype);
+ icalmemory_free_buffer(ltype);
return SSPM_UNKNOWN_MINOR_TYPE;
}
@@ -450,12 +432,12 @@ static enum sspm_minor_type sspm_find_minor_content_type(char *type)
for (i = 0; minor_content_type_map[i].type != SSPM_UNKNOWN_MINOR_TYPE; i++) {
if (strncmp(p, minor_content_type_map[i].str, strlen(minor_content_type_map[i].str)) == 0) {
- free(ltype);
+ icalmemory_free_buffer(ltype);
return minor_content_type_map[i].type;
}
}
- free(ltype);
+ icalmemory_free_buffer(ltype);
return minor_content_type_map[i].type; /* Should return SSPM_UNKNOWN_MINOR_TYPE */
}
@@ -523,7 +505,7 @@ static void sspm_build_header(struct sspm_header *header, char *line)
char *p = strchr(val, '/');
if (header->minor_text != 0) {
- free(header->minor_text);
+ icalmemory_free_buffer(header->minor_text);
}
if (p != 0) {
p++; /* Skip the '/' */
@@ -536,7 +518,7 @@ static void sspm_build_header(struct sspm_header *header, char *line)
}
if (boundary != 0) {
if (header->boundary != 0) {
- free(header->boundary);
+ icalmemory_free_buffer(header->boundary);
}
header->boundary = sspm_strdup(boundary);
}
@@ -559,7 +541,7 @@ static void sspm_build_header(struct sspm_header *header, char *line)
header->encoding = SSPM_UNKNOWN_ENCODING;
}
- free(lencoding);
+ icalmemory_free_buffer(lencoding);
header->def = 0;
@@ -567,13 +549,13 @@ static void sspm_build_header(struct sspm_header *header, char *line)
char *cid = sspm_value(line);
if (header->content_id != 0) {
- free(header->content_id);
+ icalmemory_free_buffer(header->content_id);
}
header->content_id = sspm_strdup(cid);
header->def = 0;
}
- free(val);
- free(prop);
+ icalmemory_free_buffer(val);
+ icalmemory_free_buffer(prop);
}
static char *sspm_get_next_line(struct mime_impl *impl)
@@ -603,7 +585,7 @@ static void sspm_set_error(struct sspm_header *header, enum sspm_error error, ch
header->error = error;
if (header->error_text != 0) {
- free(header->error_text);
+ icalmemory_free_buffer(header->error_text);
}
header->def = 0;
@@ -652,7 +634,7 @@ static void sspm_read_header(struct mime_impl *impl, struct sspm_header *header)
impl->state = IN_HEADER;
current_line++;
- assert(strlen(buf) < TMP_BUF_SIZE);
+ icalassert(strlen(buf) < TMP_BUF_SIZE);
strncpy(header_lines[current_line], buf, TMP_BUF_SIZE);
header_lines[current_line][TMP_BUF_SIZE - 1] = '\0';
@@ -684,7 +666,7 @@ static void sspm_read_header(struct mime_impl *impl, struct sspm_header *header)
buf_start++;
}
- assert(strlen(buf_start) + strlen(last_line) < TMP_BUF_SIZE);
+ icalassert(strlen(buf_start) + strlen(last_line) < TMP_BUF_SIZE);
strncat(last_line, buf_start, TMP_BUF_SIZE - strlen(last_line) - 1);
@@ -742,8 +724,8 @@ static void sspm_make_part(struct mime_impl *impl,
sspm_set_error(header, SSPM_UNEXPECTED_BOUNDARY_ERROR, line);
/* Read until the paired terminating boundary */
- if ((boundary = (char *)malloc(strlen(line) + 5)) == 0) {
- fprintf(stderr, "Out of memory");
+ if ((boundary = (char *)icalmemory_new_buffer(strlen(line) + 5)) == 0) {
+ icalerrprintf("Out of memory");
abort();
}
strcpy(boundary, line);
@@ -754,7 +736,7 @@ static void sspm_make_part(struct mime_impl *impl,
break;
}
}
- free(boundary);
+ icalmemory_free_buffer(boundary);
break;
}
@@ -780,8 +762,8 @@ static void sspm_make_part(struct mime_impl *impl,
sspm_set_error(parent_header, SSPM_WRONG_BOUNDARY_ERROR, msg);
/* Read until the paired terminating boundary */
- if ((boundary = (char *)malloc(strlen(line) + 5)) == 0) {
- fprintf(stderr, "Out of memory");
+ if ((boundary = (char *)icalmemory_new_buffer(strlen(line) + 5)) == 0) {
+ icalerrprintf("Out of memory");
abort();
}
strcpy(boundary, line);
@@ -791,7 +773,7 @@ static void sspm_make_part(struct mime_impl *impl,
break;
}
}
- free(boundary);
+ icalmemory_free_buffer(boundary);
}
} else {
char *data = 0;
@@ -799,8 +781,8 @@ static void sspm_make_part(struct mime_impl *impl,
*size = strlen(line);
- data = (char *)malloc(*size + 2);
- assert(data != 0);
+ data = (char *)icalmemory_new_buffer(*size + 2);
+ icalassert(data != 0);
if (header->encoding == SSPM_BASE64_ENCODING) {
rtrn = decode_base64(data, line, size);
} else if (header->encoding == SSPM_QUOTED_PRINTABLE_ENCODING) {
@@ -818,7 +800,7 @@ static void sspm_make_part(struct mime_impl *impl,
action.add_line(part, header, data, *size);
- free(data);
+ icalmemory_free_buffer(data);
}
}
@@ -880,7 +862,7 @@ static void *sspm_make_multipart_subpart(struct mime_impl *impl, struct sspm_hea
while ((line = sspm_get_next_line(impl)) != 0) {
if (sspm_is_mime_boundary(line)) {
- assert(parent_header != 0);
+ icalassert(parent_header != 0);
/* Check if it is the right boundary */
if (!sspm_is_mime_terminating_boundary(line) &&
@@ -899,8 +881,8 @@ static void *sspm_make_multipart_subpart(struct mime_impl *impl, struct sspm_hea
sspm_set_error(parent_header, SSPM_WRONG_BOUNDARY_ERROR, msg);
/* Read until the paired terminating boundary */
- if ((boundary = (char *)malloc(strlen(line) + 5)) == 0) {
- fprintf(stderr, "Out of memory");
+ if ((boundary = (char *)icalmemory_new_buffer(strlen(line) + 5)) == 0) {
+ icalerrprintf("Out of memory");
abort();
}
strcpy(boundary, line);
@@ -910,7 +892,7 @@ static void *sspm_make_multipart_subpart(struct mime_impl *impl, struct sspm_hea
break;
}
}
- free(boundary);
+ icalmemory_free_buffer(boundary);
return 0;
}
@@ -1024,22 +1006,22 @@ int sspm_parse_mime(struct sspm_part *parts,
static void sspm_free_header(struct sspm_header *header)
{
if (header->boundary != 0) {
- free(header->boundary);
+ icalmemory_free_buffer(header->boundary);
}
if (header->minor_text != 0) {
- free(header->minor_text);
+ icalmemory_free_buffer(header->minor_text);
}
if (header->charset != 0) {
- free(header->charset);
+ icalmemory_free_buffer(header->charset);
}
if (header->filename != 0) {
- free(header->filename);
+ icalmemory_free_buffer(header->filename);
}
if (header->content_id != 0) {
- free(header->content_id);
+ icalmemory_free_buffer(header->content_id);
}
if (header->error_text != 0) {
- free(header->error_text);
+ icalmemory_free_buffer(header->error_text);
}
}
@@ -1142,7 +1124,7 @@ char *decode_base64(char *dest, char *src, size_t *size)
cc = -1;
}
- assert(cc < 64);
+ icalassert(cc < 64);
/* If we've reached the end, fill the remaining slots in
the bucket and do a final conversion */
@@ -1226,7 +1208,7 @@ static void sspm_append_char(struct sspm_buffer *buf, char ch)
buf->buf_size = (buf->buf_size) * 2 + final_length + 1;
- new_buf = realloc(buf->buffer, buf->buf_size);
+ new_buf = icalmemory_resize_buffer(buf->buffer, buf->buf_size);
new_pos = (void *)((size_t) new_buf + data_length);
@@ -1255,7 +1237,7 @@ void sspm_append_string(struct sspm_buffer *buf, const char *string)
buf->buf_size = (buf->buf_size) * 2 + final_length;
- new_buf = realloc(buf->buffer, buf->buf_size);
+ new_buf = icalmemory_resize_buffer(buf->buffer, buf->buf_size);
new_pos = (void *)((size_t) new_buf + data_length);
@@ -1350,7 +1332,7 @@ static void sspm_write_base64(struct sspm_buffer *buf, char *inbuf, int size)
break;
default:
- assert(0);
+ icalassert(0);
}
for (i = 0; i < 4; i++) {
@@ -1385,7 +1367,7 @@ static void sspm_encode_base64(struct sspm_buffer *buf, char *data, size_t size)
inbuf[0] = inbuf[1] = inbuf[2] = 0;
}
- assert(lpos % 4 == 0);
+ icalassert(lpos % 4 == 0);
if (lpos == 72) {
sspm_append_string(buf, "\n");
@@ -1423,7 +1405,7 @@ static void sspm_write_header(struct sspm_buffer *buf, struct sspm_header *heade
minor = sspm_minor_type_string(header->minor);
if (header->minor == SSPM_UNKNOWN_MINOR_TYPE) {
- assert(header->minor_text != 0);
+ icalassert(header->minor_text != 0);
minor = header->minor_text;
}
@@ -1471,7 +1453,7 @@ static void sspm_write_part(struct sspm_buffer *buf, struct sspm_part *part, int
}
if (part->header.encoding == SSPM_BASE64_ENCODING) {
- assert(part->data_size != 0);
+ icalassert(part->data_size != 0);
sspm_encode_base64(buf, part->data, part->data_size);
} else if (part->header.encoding == SSPM_QUOTED_PRINTABLE_ENCODING) {
sspm_encode_quoted_printable(buf, part->data);
@@ -1499,7 +1481,7 @@ static void sspm_write_multipart_part(struct sspm_buffer *buf,
while (parts[*part_num].header.major != SSPM_NO_MAJOR_TYPE && level == parent_level + 1) {
- assert(header->boundary != NULL);
+ icalassert(header->boundary != NULL);
sspm_append_string(buf, header->boundary);
sspm_append_char(buf, '\n');
@@ -1529,7 +1511,7 @@ int sspm_write_mime(struct sspm_part *parts, size_t num_parts,
_unused(num_parts);
- buf.buffer = malloc(4096);
+ buf.buffer = icalmemory_new_buffer(4096);
buf.buffer[0] = '\0';
buf.pos = buf.buffer;
buf.buf_size = 10;
diff --git a/src/libical/sspm.h b/src/libical/sspm.h
index 6a98e812..0247babe 100644
--- a/src/libical/sspm.h
+++ b/src/libical/sspm.h
@@ -2,31 +2,11 @@
FILE: sspm.h Mime Parser
CREATOR: eric 25 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
-
- The Initial Developer of the Original Code is Eric Busboom
+ The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
#ifndef ICAL_SSPM_H
diff --git a/src/libical/vcomponent_cxx.cpp b/src/libical/vcomponent_cxx.cpp
index 79a67b26..0b42145c 100644
--- a/src/libical/vcomponent_cxx.cpp
+++ b/src/libical/vcomponent_cxx.cpp
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief Implementation of C++ Wrapper for icalcomponent.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifdef HAVE_CONFIG_H
diff --git a/src/libical/vcomponent_cxx.h b/src/libical/vcomponent_cxx.h
index 62c065c8..677d7568 100644
--- a/src/libical/vcomponent_cxx.h
+++ b/src/libical/vcomponent_cxx.h
@@ -3,18 +3,10 @@
* @author fnguyen (12/10/01)
* @brief C++ classes for the icalcomponent wrapper (VToDo VEvent, etc..).
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifndef ICAL_VCOMPONENT_CXX_H
diff --git a/src/libicalss/CMakeLists.txt b/src/libicalss/CMakeLists.txt
index c555eac1..b712e24d 100644
--- a/src/libicalss/CMakeLists.txt
+++ b/src/libicalss/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_definitions(-Dlibical_icalss_EXPORTS)
include_directories(
@@ -23,6 +26,7 @@ endif()
add_custom_target(
icalss-header ALL
DEPENDS ${CMAKE_BINARY_DIR}/src/libicalss/icalss.h
+ COMMENT "Target to generate the aggregate libicalss header"
)
########### next target ###############
@@ -83,6 +87,7 @@ add_custom_command(
-DBDB_FOUND=${BDB_FOUND}
-P ${CMAKE_CURRENT_SOURCE_DIR}/icalss_file.cmake
DEPENDS ${icalss_LIB_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/icalss_file.cmake
+ COMMENT "Generate the aggregate libicalss header"
)
add_library(icalss ${LIBRARY_TYPE} ${icalss_LIB_SRCS})
@@ -151,7 +156,10 @@ if(WITH_CXX_BINDINGS)
add_library(icalss_cxx-static ALIAS icalss_cxx)
endif()
- target_link_libraries(icalss_cxx icalss ical_cxx ${CMAKE_THREAD_LIBS_INIT})
+ target_link_libraries(icalss_cxx icalss ical_cxx)
+ if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(icalss_cxx ${CMAKE_THREAD_LIBS_INIT})
+ endif()
if(MSVC)
set_target_properties(icalss_cxx PROPERTIES PREFIX "lib")
diff --git a/src/libicalss/icalbdbset.c b/src/libicalss/icalbdbset.c
index 9af2674c..e8a4f206 100644
--- a/src/libicalss/icalbdbset.c
+++ b/src/libicalss/icalbdbset.c
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalbdbset.c
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -31,8 +23,16 @@
#define MAX_RETRY 5
+#if !defined(DB_VERSION_MAJOR)
+#define DB_VERSION_MAJOR 1 //assume ancient version
+#endif
+
static int _compare_ids(const char *compid, const char *matchid);
+#if DB_VERSION_MAJOR > 5
+static int _compare_keys(DB *dbp, const DBT *a, const DBT *b, size_t *locp);
+#else
static int _compare_keys(DB *dbp, const DBT *a, const DBT *b);
+#endif
/** Default options used when NULL is passed to icalset_new() **/
static icalbdbset_options icalbdbset_options_default =
@@ -75,7 +75,11 @@ int icalbdbset_init_dbenv(char *db_env_dir,
flags = (u_int32_t) (DB_INIT_LOCK | DB_INIT_TXN | DB_CREATE | DB_THREAD |
DB_RECOVER | DB_INIT_LOG | DB_INIT_MPOOL);
+#if defined(_WIN32) //krazy:exclude=cpp
+ ret = ICAL_DB_ENV->open(ICAL_DB_ENV, db_env_dir, flags, 0 /*ignored on Windows*/);
+#else
ret = ICAL_DB_ENV->open(ICAL_DB_ENV, db_env_dir, flags, S_IRUSR | S_IWUSR);
+#endif
if (ret) {
/*char *foo = db_strerror(ret); */
@@ -1598,7 +1602,11 @@ int icalbdbset_commit_transaction(DB_TXN *txnid)
return txnid->commit(txnid, 0);
}
+#if DB_VERSION_MAJOR > 5
+static int _compare_keys(DB *dbp, const DBT *a, const DBT *b, size_t *locp)
+#else
static int _compare_keys(DB *dbp, const DBT *a, const DBT *b)
+#endif
{
/*
* Returns:
@@ -1611,5 +1619,8 @@ static int _compare_keys(DB *dbp, const DBT *a, const DBT *b)
char *bc = (char *)b->data;
_unused(dbp);
+#if DB_VERSION_MAJOR > 5
+ locp = NULL;
+#endif
return strncmp(ac, bc, a->size);
}
diff --git a/src/libicalss/icalbdbset.h b/src/libicalss/icalbdbset.h
index 1fe2e2cf..079ae393 100644
--- a/src/libicalss/icalbdbset.h
+++ b/src/libicalss/icalbdbset.h
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalbdbset.h
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALBDBSET_H
diff --git a/src/libicalss/icalbdbset_cxx.h b/src/libicalss/icalbdbset_cxx.h
index 976d0d2f..1f676b89 100644
--- a/src/libicalss/icalbdbset_cxx.h
+++ b/src/libicalss/icalbdbset_cxx.h
@@ -3,18 +3,9 @@
* @author dml 12/12/01
* @brief Definition of C++ Wrapper for icalbdbset.c
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifndef ICALBDBSET_CXX_H
diff --git a/src/libicalss/icalbdbsetimpl.h b/src/libicalss/icalbdbsetimpl.h
index a5a60a47..a88df55e 100644
--- a/src/libicalss/icalbdbsetimpl.h
+++ b/src/libicalss/icalbdbsetimpl.h
@@ -1,18 +1,10 @@
/*======================================================================
FILE: icalbdbsetimpl.h
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALBDBSETIMPL_H
diff --git a/src/libicalss/icalcalendar.c b/src/libicalss/icalcalendar.c
index 5d50f121..61130efd 100644
--- a/src/libicalss/icalcalendar.c
+++ b/src/libicalss/icalcalendar.c
@@ -2,18 +2,10 @@
FILE: icalcalendar.c
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/libicalss/icalcalendar.h b/src/libicalss/icalcalendar.h
index ac424be0..4cf005cc 100644
--- a/src/libicalss/icalcalendar.h
+++ b/src/libicalss/icalcalendar.h
@@ -2,18 +2,9 @@
FILE: icalcalendar.h
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalclassify.c b/src/libicalss/icalclassify.c
index 00e72fed..7450d8d1 100644
--- a/src/libicalss/icalclassify.c
+++ b/src/libicalss/icalclassify.c
@@ -2,18 +2,10 @@
FILE: icalclassify.c
CREATOR: ebusboom 23 aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -49,7 +41,7 @@ char *icalclassify_lowercase(const char *str)
return 0;
}
- xnew = icalmemory_strdup(str);
+ xnew = strdup(str);
for (p = xnew; *p != 0; p++) {
*p = tolower((int)*p);
}
@@ -292,8 +284,8 @@ int icalssutil_is_rescheduled(icalcomponent *a, icalcomponent *b)
temp1 = icalproperty_as_ical_string_r(p1);
temp2 = icalproperty_as_ical_string_r(p2);
cmp = strcmp(temp1, temp2);
- free(temp1);
- free(temp2);
+ icalmemory_free_buffer(temp1);
+ icalmemory_free_buffer(temp2);
if (p1 && cmp != 0) {
return 1;
diff --git a/src/libicalss/icalclassify.h b/src/libicalss/icalclassify.h
index 04b1e237..1d39a057 100644
--- a/src/libicalss/icalclassify.h
+++ b/src/libicalss/icalclassify.h
@@ -2,18 +2,10 @@
FILE: icalclassify.h
CREATOR: eric 21 Aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
=========================================================================*/
#ifndef ICALCLASSIFY_H
diff --git a/src/libicalss/icalcluster.c b/src/libicalss/icalcluster.c
index ee926701..27861fe8 100644
--- a/src/libicalss/icalcluster.c
+++ b/src/libicalss/icalcluster.c
@@ -2,18 +2,10 @@
FILE: icalcluster.c
CREATOR: acampi 13 March 2002
- Copyright (C) 2002 Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2002 Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/**
diff --git a/src/libicalss/icalcluster.h b/src/libicalss/icalcluster.h
index 1514a440..31195bb0 100644
--- a/src/libicalss/icalcluster.h
+++ b/src/libicalss/icalcluster.h
@@ -2,18 +2,10 @@
FILE: icalcluster.h
CREATOR: acampi 13 March 2002
- Copyright (C) 2002 Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2002 Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALCLUSTER_H
diff --git a/src/libicalss/icalclusterimpl.h b/src/libicalss/icalclusterimpl.h
index e0cea3dd..642827fd 100644
--- a/src/libicalss/icalclusterimpl.h
+++ b/src/libicalss/icalclusterimpl.h
@@ -2,18 +2,10 @@
FILE: icalfilesetimpl.h
CREATOR: acampi 13 March 2002
- Copyright (C) 2002 Andrea Campi <a.campi@inet.it>
+ SPDX-FileCopyrightText: 2002 Andrea Campi <a.campi@inet.it>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALCLUSTERIMPL_H
diff --git a/src/libicalss/icaldirset.c b/src/libicalss/icaldirset.c
index 02c08667..eecf22e4 100644
--- a/src/libicalss/icaldirset.c
+++ b/src/libicalss/icaldirset.c
@@ -3,18 +3,9 @@
FILE: icaldirset.c
CREATOR: eric 28 November 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icaldirset.h b/src/libicalss/icaldirset.h
index d3c3e35e..edab10e2 100644
--- a/src/libicalss/icaldirset.h
+++ b/src/libicalss/icaldirset.h
@@ -2,18 +2,9 @@
FILE: icaldirset.h
CREATOR: eric 28 November 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icaldirsetimpl.h b/src/libicalss/icaldirsetimpl.h
index 800e987d..2c0f5ecf 100644
--- a/src/libicalss/icaldirsetimpl.h
+++ b/src/libicalss/icaldirsetimpl.h
@@ -2,18 +2,9 @@
FILE: icaldirsetimpl.h
CREATOR: eric 21 Aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalfileset.c b/src/libicalss/icalfileset.c
index 6085c23c..2778025c 100644
--- a/src/libicalss/icalfileset.c
+++ b/src/libicalss/icalfileset.c
@@ -2,18 +2,9 @@
FILE: icalfileset.c
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -27,6 +18,7 @@
#include "icalfilesetimpl.h"
#include "icalparser.h"
#include "icalvalue.h"
+#include "icalmemory.h"
#include <errno.h>
#include <stdlib.h>
@@ -397,11 +389,11 @@ icalerrorenum icalfileset_commit(icalset *set)
if (sz != (IO_SSIZE_T) strlen(str)) {
perror("write");
icalerror_set_errno(ICAL_FILE_ERROR);
- free(str);
+ icalmemory_free_buffer(str);
return ICAL_FILE_ERROR;
}
- free(str);
+ icalmemory_free_buffer(str);
write_size += sz;
}
diff --git a/src/libicalss/icalfileset.h b/src/libicalss/icalfileset.h
index 23060e34..04de522d 100644
--- a/src/libicalss/icalfileset.h
+++ b/src/libicalss/icalfileset.h
@@ -2,18 +2,9 @@
FILE: icalfileset.h
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalfilesetimpl.h b/src/libicalss/icalfilesetimpl.h
index 6d7ffeab..b2bb72e2 100644
--- a/src/libicalss/icalfilesetimpl.h
+++ b/src/libicalss/icalfilesetimpl.h
@@ -2,18 +2,9 @@
FILE: icalfilesetimpl.h
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalgauge.c b/src/libicalss/icalgauge.c
index 65d8b854..73390f85 100644
--- a/src/libicalss/icalgauge.c
+++ b/src/libicalss/icalgauge.c
@@ -2,18 +2,9 @@
FILE: icalgauge.c
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalgauge.h b/src/libicalss/icalgauge.h
index be6c7440..ee07952a 100644
--- a/src/libicalss/icalgauge.h
+++ b/src/libicalss/icalgauge.h
@@ -2,18 +2,9 @@
FILE: icalgauge.h
CREATOR: eric 23 December 1999
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalgaugeimpl.h b/src/libicalss/icalgaugeimpl.h
index 3b07240e..a9423162 100644
--- a/src/libicalss/icalgaugeimpl.h
+++ b/src/libicalss/icalgaugeimpl.h
@@ -2,18 +2,10 @@
FILE: icalgaugeimpl.h
CREATOR: eric 09 Aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALGAUGEIMPL_H
diff --git a/src/libicalss/icalmessage.c b/src/libicalss/icalmessage.c
index d9a7f2a9..779d41d9 100644
--- a/src/libicalss/icalmessage.c
+++ b/src/libicalss/icalmessage.c
@@ -2,18 +2,10 @@
FILE: icalmessage.c
CREATOR: ebusboom 07 Nov 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -22,7 +14,6 @@
#include "icalmessage.h"
#include "icalerror.h"
-#include "icalmemory.h"
#include "icalversion.h" /* for ICAL_PACKAGE, ICAL_VERSION */
#include <ctype.h>
@@ -46,7 +37,7 @@ static char *lowercase(const char *str)
return 0;
}
- n = icalmemory_strdup(str);
+ n = strdup(str);
for (p = n; *p != 0; p++) {
*p = tolower((int)*p);
diff --git a/src/libicalss/icalmessage.h b/src/libicalss/icalmessage.h
index 7ec629bf..20aee462 100644
--- a/src/libicalss/icalmessage.h
+++ b/src/libicalss/icalmessage.h
@@ -2,18 +2,10 @@
FILE: icalmessage.h
CREATOR: eric 07 Nov 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
=========================================================================*/
#ifndef ICALMESSAGE_H
diff --git a/src/libicalss/icalset.c b/src/libicalss/icalset.c
index 674e05b4..b98f233f 100644
--- a/src/libicalss/icalset.c
+++ b/src/libicalss/icalset.c
@@ -2,7 +2,7 @@
FILE: icalset.c
CREATOR: eric 17 Jul 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
Icalset is the "base class" for representations of a collection of
iCal components. Derived classes (actually delegates) include:
@@ -12,16 +12,7 @@
icalheapset Store components on the heap
icalmysqlset Store components in a mysql database.
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalset.h b/src/libicalss/icalset.h
index 23e677d8..00011e35 100644
--- a/src/libicalss/icalset.h
+++ b/src/libicalss/icalset.h
@@ -14,18 +14,9 @@
/*
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/libicalss/icalspanlist.c b/src/libicalss/icalspanlist.c
index a0f40ef6..027777c8 100644
--- a/src/libicalss/icalspanlist.c
+++ b/src/libicalss/icalspanlist.c
@@ -2,18 +2,10 @@
FILE: icalspanlist.c
CREATOR: ebusboom 23 aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -189,22 +181,22 @@ icalspanlist *icalspanlist_new(icalset *set, struct icaltimetype start, struct i
return sl;
}
-void icalspanlist_free(icalspanlist *s)
+void icalspanlist_free(icalspanlist *sl)
{
struct icaltime_span *span;
- if (s == NULL)
+ if (sl == NULL)
return;
- while ((span = pvl_pop(s->spans)) != 0) {
+ while ((span = pvl_pop(sl->spans)) != 0) {
free(span);
}
- pvl_free(s->spans);
+ pvl_free(sl->spans);
- s->spans = 0;
+ sl->spans = 0;
- free(s);
+ free(sl);
}
void icalspanlist_dump(icalspanlist *sl)
@@ -215,8 +207,8 @@ void icalspanlist_dump(icalspanlist *sl)
for (itr = pvl_head(sl->spans); itr != 0; itr = pvl_next(itr)) {
struct icaltime_span *s = (struct icaltime_span *)pvl_data(itr);
if (s) {
- printf("#%02d %d start: %s", ++i, s->is_busy, ctime(&s->start));
- printf(" end : %s", ctime(&s->end));
+ printf("#%02d %d start: %s", ++i, s->is_busy, icalctime(&s->start));
+ printf(" end : %s", icalctime(&s->end));
}
}
}
@@ -229,7 +221,7 @@ struct icalperiodtype icalspanlist_next_free_time(icalspanlist *sl, struct icalt
struct icalperiodtype period;
struct icaltime_span *s;
- time_t rangett = icaltime_as_timet(t);
+ icaltime_t rangett = icaltime_as_timet(t);
period.start = icaltime_null_time();
period.end = icaltime_null_time();
@@ -290,17 +282,17 @@ struct icalperiodtype icalspanlist_next_free_time(icalspanlist *sl, struct icalt
int *icalspanlist_as_freebusy_matrix(icalspanlist *sl, int delta_t)
{
pvl_elem itr;
- time_t spanduration_secs;
+ icaltime_t spanduration_secs;
int *matrix;
- time_t matrix_slots;
- time_t sl_start, sl_end;
+ icaltime_t matrix_slots;
+ icaltime_t sl_start, sl_end;
icalerror_check_arg_rz((sl != 0), "spanlist");
if (!delta_t)
delta_t = 3600;
- /* calculate the start and end time as time_t **/
+ /* calculate the start and end time as icaltime_t **/
sl_start = icaltime_as_timet_with_zone(sl->start, icaltimezone_get_utc_timezone());
sl_end = icaltime_as_timet_with_zone(sl->end, icaltimezone_get_utc_timezone());
@@ -333,9 +325,9 @@ int *icalspanlist_as_freebusy_matrix(icalspanlist *sl, int delta_t)
struct icaltime_span *s = (struct icaltime_span *)pvl_data(itr);
if (s && s->is_busy == 1) {
- time_t offset_start = s->start / delta_t - sl_start / delta_t;
- time_t offset_end = (s->end - 1) / delta_t - sl_start / delta_t + 1;
- time_t i;
+ icaltime_t offset_start = s->start / delta_t - sl_start / delta_t;
+ icaltime_t offset_end = (s->end - 1) / delta_t - sl_start / delta_t + 1;
+ icaltime_t i;
if (offset_end >= matrix_slots)
offset_end = matrix_slots - 1;
diff --git a/src/libicalss/icalspanlist.h b/src/libicalss/icalspanlist.h
index c5b44cd1..edd43605 100644
--- a/src/libicalss/icalspanlist.h
+++ b/src/libicalss/icalspanlist.h
@@ -2,18 +2,10 @@
FILE: icalspanlist.h
CREATOR: eric 21 Aug 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
=========================================================================*/
#ifndef ICALSPANLIST_H
#define ICALSPANLIST_H
@@ -44,11 +36,11 @@ LIBICAL_ICALSS_EXPORT icalspanlist *icalspanlist_new(icalset *set,
struct icaltimetype end);
/** @brief Destructor.
- * @param s A valid icalspanlist
+ * @param sl A valid icalspanlist
*
* Frees the memory associated with the spanlist.
*/
-LIBICAL_ICALSS_EXPORT void icalspanlist_free(icalspanlist *spl);
+LIBICAL_ICALSS_EXPORT void icalspanlist_free(icalspanlist *sl);
/** @brief Finds the next free time span in a spanlist.
*
@@ -64,7 +56,7 @@ LIBICAL_ICALSS_EXPORT struct icalperiodtype icalspanlist_next_free_time(icalspan
/** @brief (Debug) print out spanlist to STDOUT.
* @param sl A valid icalspanlist.
*/
-LIBICAL_ICALSS_EXPORT void icalspanlist_dump(icalspanlist *s);
+LIBICAL_ICALSS_EXPORT void icalspanlist_dump(icalspanlist *sl);
/** @brief Returns a VFREEBUSY component for a spanlist.
*
@@ -87,7 +79,7 @@ LIBICAL_ICALSS_EXPORT icalcomponent *icalspanlist_as_vfreebusy(icalspanlist *sl,
/** @brief Returns an hour-by-hour array of free/busy times over a
* given period.
*
- * @param sl A valid icalspanlist
+ * @param span A valid icalspanlist
* @param delta_t The time slice to divide by, in seconds. Default 3600.
*
* @return A pointer to an array of integers containing the number of
diff --git a/src/libicalss/icalspanlist_cxx.cpp b/src/libicalss/icalspanlist_cxx.cpp
index 4f72eb50..00967518 100644
--- a/src/libicalss/icalspanlist_cxx.cpp
+++ b/src/libicalss/icalspanlist_cxx.cpp
@@ -4,18 +4,10 @@
* @brief C++ class wrapping the icalspanlist data structure
*
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#include "icalspanlist_cxx.h"
diff --git a/src/libicalss/icalspanlist_cxx.h b/src/libicalss/icalspanlist_cxx.h
index 1698133e..775a6d9f 100644
--- a/src/libicalss/icalspanlist_cxx.h
+++ b/src/libicalss/icalspanlist_cxx.h
@@ -3,18 +3,9 @@
* @author Critical Path
* @brief C++ class wrapping the icalspanlist data structure
*
- * (C) COPYRIGHT 2001, Critical Path
+ * SPDX-FileCopyrightText: 2001, Critical Path
*
- * This library is free software; you can redistribute it and/or modify
- * it under the terms of either:
- *
- * The LGPL as published by the Free Software Foundation, version
- * 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
- *
- * Or:
- *
- * The Mozilla Public License Version 2.0. You may obtain a copy of
- * the License at https://www.mozilla.org/MPL/
+ * SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
*/
#ifndef ICALSPANLIST_CXX_H
diff --git a/src/libicalss/icalss_file.cmake b/src/libicalss/icalss_file.cmake
index df105627..8983e380 100644
--- a/src/libicalss/icalss_file.cmake
+++ b/src/libicalss/icalss_file.cmake
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
# ORDERING OF HEADERS IS SIGNIFICANT. Don't change this ordering.
# It is required to make the combined header icalss.h properly.
set(COMBINEDHEADERSICALSS
diff --git a/src/libicalss/icalsslexer.l b/src/libicalss/icalsslexer.l
index bb5b5c09..b06fe35a 100644
--- a/src/libicalss/icalsslexer.l
+++ b/src/libicalss/icalsslexer.l
@@ -4,18 +4,9 @@
FILE: icalsslexer.l
CREATOR: eric 8 Aug 2000
-(C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This program is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
@@ -24,24 +15,28 @@
#include "icalssyacc.h"
#include "icalgaugeimpl.h"
+#include "icalmemory.h"
#include "assert.h"
YYSTYPE sslval;
-const char* input_buffer;
-const char* input_buffer_p;
+const char *input_buffer;
+const char *input_buffer_p;
-int icalss_input(char* buf, int max_size)
+int icalss_input(const char *buf, int max_size)
{
int n;
int l;
l = strlen(input_buffer_p);
- if (max_size<l) n = max_size;
- else n = l;
+ if (max_size < l) {
+ n = max_size;
+ } else {
+ n = l;
+ }
- if (n > 0){
- memcpy(buf, input_buffer_p, n);
+ if (n > 0) {
+ memcpy((void *)buf, input_buffer_p, n);
input_buffer_p += n;
return n;
} else {
diff --git a/src/libicalss/icalssyacc.h b/src/libicalss/icalssyacc.h
index f97cc4a7..e8592097 100644
--- a/src/libicalss/icalssyacc.h
+++ b/src/libicalss/icalssyacc.h
@@ -2,8 +2,8 @@
/* Skeleton interface for Bison's Yacc-like parsers in C
- Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
- Free Software Foundation, Inc.
+ SPDX-FileCopyrightText: 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
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
@@ -97,4 +97,3 @@ typedef union YYSTYPE
#endif
extern YYSTYPE sslval;
-
diff --git a/src/libicalss/icalssyacc.y b/src/libicalss/icalssyacc.y
index ae40f119..6d38adcb 100644
--- a/src/libicalss/icalssyacc.y
+++ b/src/libicalss/icalssyacc.y
@@ -3,18 +3,9 @@
/* FILE: icalssyacc.y */
/* CREATOR: eric 08 Aug 2000 */
/* */
-/* (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com> */
+/* SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com> */
/* */
-/* This program is free software; you can redistribute it and/or modify */
-/* it under the terms of either: */
-/* */
-/* The LGPL as published by the Free Software Foundation, version */
-/* 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html */
-/* */
-/* Or: */
-/* */
-/* The Mozilla Public License Version 2.0. You may obtain a copy of */
-/* the License at https://www.mozilla.org/MPL/ */
+/* SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0 */
/* */
/* The Original Code is eric. The Initial Developer of the Original */
/* Code is Eric Busboom */
@@ -36,13 +27,14 @@ extern struct icalgauge_impl *icalss_yy_gauge;
#define yyerror sserror
-void sserror(char *s);
+void sserror(const char *s);
+int yylex(void);
-static void ssyacc_add_where(struct icalgauge_impl* impl, char* prop,
- icalgaugecompare compare , char* value);
-static void ssyacc_add_select(struct icalgauge_impl* impl, char* str1);
-static void ssyacc_add_from(struct icalgauge_impl* impl, char* str1);
-static void set_logic(struct icalgauge_impl* impl,icalgaugelogic l);
+static void ssyacc_add_where(struct icalgauge_impl *impl, char *prop,
+ icalgaugecompare compare, const char *value);
+static void ssyacc_add_select(struct icalgauge_impl *impl, char *str1);
+static void ssyacc_add_from(struct icalgauge_impl *impl, char *str1);
+static void set_logic(struct icalgauge_impl *impl, icalgaugelogic l);
/* Don't know why I need this.... */
@@ -58,7 +50,6 @@ int sslex(void);
char* v_string;
}
-
%token <v_string> STRING
%token SELECT FROM WHERE COMMA QUOTE EQUALS NOTEQUALS LESS GREATER LESSEQUALS
%token GREATEREQUALS AND OR EOL END IS NOT SQLNULL
@@ -102,22 +93,21 @@ where_list:
| where_list OR where_clause {set_logic(icalss_yy_gauge,ICALGAUGELOGIC_OR);}
;
-
%%
-static void ssyacc_add_where(struct icalgauge_impl* impl, char* str1,
- icalgaugecompare compare , char* value_str)
+static void ssyacc_add_where(struct icalgauge_impl *impl, char *str1,
+ icalgaugecompare compare, const char *value_str)
{
-
struct icalgauge_where *where;
- char *compstr, *propstr, *c, *s,*l;
+ char *compstr, *propstr, *c, *l;
+ const char *s;
- if ( (where = malloc(sizeof(struct icalgauge_where))) ==0){
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return;
+ if ((where = malloc(sizeof(struct icalgauge_where))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
}
- memset(where,0,sizeof(struct icalgauge_where));
+ memset(where, 0, sizeof(struct icalgauge_where));
where->logic = ICALGAUGELOGIC_NONE;
where->compare = ICALGAUGECOMPARE_NONE;
where->comp = ICAL_NO_COMPONENT;
@@ -125,71 +115,64 @@ static void ssyacc_add_where(struct icalgauge_impl* impl, char* str1,
/* remove enclosing quotes */
s = value_str;
- if(*s == '\''){
- s++;
+ if (*s == '\'') {
+ s++;
}
- l = s+strlen(s)-1;
- if(*l == '\''){
- *l=0;
+ l = (char *)(s + strlen(s) - 1);
+ if (*l == '\'') {
+ *l = 0;
}
where->value = strdup(s);
/* Is there a period in str1 ? If so, the string specified both a */
/* component and a property */
- if( (c = strrchr(str1,'.')) != 0){
- compstr = str1;
- propstr = c+1;
- *c = '\0';
+ if ((c = strrchr(str1, '.')) != 0 ) {
+ compstr = str1;
+ propstr = c + 1;
+ *c = '\0';
} else {
- compstr = 0;
- propstr = str1;
+ compstr = 0;
+ propstr = str1;
}
-
/* Handle the case where a component was specified */
- if(compstr != 0){
- where->comp = icalenum_string_to_component_kind(compstr);
+ if (compstr != 0) {
+ where->comp = icalenum_string_to_component_kind(compstr);
} else {
- where->comp = ICAL_NO_COMPONENT;
+ where->comp = ICAL_NO_COMPONENT;
}
-
where->prop = icalenum_string_to_property_kind(propstr);
-
where->compare = compare;
-
- if(where->value == 0){
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- free(where->value);
- return;
+ if (where->value == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ free(where->value);
+ return;
}
- pvl_push(impl->where,where);
+ pvl_push(impl->where, where);
}
-static void set_logic(struct icalgauge_impl* impl,icalgaugelogic l)
+static void set_logic(struct icalgauge_impl *impl, icalgaugelogic l)
{
pvl_elem e = pvl_tail(impl->where);
struct icalgauge_where *where = pvl_data(e);
where->logic = l;
-
}
-
-
-static void ssyacc_add_select(struct icalgauge_impl* impl, char* str1)
+static void ssyacc_add_select(struct icalgauge_impl *impl, char *str1)
{
char *c, *compstr, *propstr;
struct icalgauge_where *where;
/* Uses only the prop and comp fields of the where structure */
- if ( (where = malloc(sizeof(struct icalgauge_where))) ==0){
- icalerror_set_errno(ICAL_NEWFAILED_ERROR);
- return;
+ if ((where = malloc(sizeof(struct icalgauge_where))) == 0) {
+ icalerror_set_errno(ICAL_NEWFAILED_ERROR);
+ return;
}
- memset(where,0,sizeof(struct icalgauge_where));
+ memset(where, 0, sizeof(struct icalgauge_where));
where->logic = ICALGAUGELOGIC_NONE;
where->compare = ICALGAUGECOMPARE_NONE;
where->comp = ICAL_NO_COMPONENT;
@@ -197,57 +180,53 @@ static void ssyacc_add_select(struct icalgauge_impl* impl, char* str1)
/* Is there a period in str1 ? If so, the string specified both a */
/* component and a property */
- if( (c = strrchr(str1,'.')) != 0){
- compstr = str1;
- propstr = c+1;
- *c = '\0';
+ if ((c = strrchr(str1, '.')) != 0) {
+ compstr = str1;
+ propstr = c + 1;
+ *c = '\0';
} else {
- compstr = 0;
- propstr = str1;
+ compstr = 0;
+ propstr = str1;
}
-
/* Handle the case where a component was specified */
- if(compstr != 0){
- where->comp = icalenum_string_to_component_kind(compstr);
+ if (compstr != 0) {
+ where->comp = icalenum_string_to_component_kind(compstr);
} else {
- where->comp = ICAL_NO_COMPONENT;
+ where->comp = ICAL_NO_COMPONENT;
}
-
/* If the property was '*', then accept all properties */
- if(strcmp("*",propstr) == 0) {
- where->prop = ICAL_ANY_PROPERTY;
+ if (strcmp("*", propstr) == 0) {
+ where->prop = ICAL_ANY_PROPERTY;
} else {
- where->prop = icalenum_string_to_property_kind(propstr);
+ where->prop = icalenum_string_to_property_kind(propstr);
}
-
- if(where->prop == ICAL_NO_PROPERTY){
- free(where);
- icalerror_set_errno(ICAL_BADARG_ERROR);
- return;
+ if (where->prop == ICAL_NO_PROPERTY) {
+ free(where);
+ icalerror_set_errno(ICAL_BADARG_ERROR);
+ return;
}
- pvl_push(impl->select,where);
+ pvl_push(impl->select, where);
}
-static void ssyacc_add_from(struct icalgauge_impl* impl, char* str1)
+static void ssyacc_add_from(struct icalgauge_impl *impl, char *str1)
{
icalcomponent_kind ckind;
ckind = icalenum_string_to_component_kind(str1);
- if(ckind == ICAL_NO_COMPONENT){
- assert(0);
+ if (ckind == ICAL_NO_COMPONENT) {
+ assert(0);
}
- pvl_push(impl->from,(void*)ckind);
-
+ pvl_push(impl->from, (void*)ckind);
}
-
-void sserror(char *s){
- fprintf(stderr,"Parse error \'%s\'\n", s);
- icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
+void sserror(const char *s)
+{
+ fprintf(stderr,"Parse error \'%s\'\n", s);
+ icalerror_set_errno(ICAL_MALFORMEDDATA_ERROR);
}
diff --git a/src/libicalss/libical_icalss_export.h b/src/libicalss/libical_icalss_export.h
index 9341ad35..e099c6be 100644
--- a/src/libicalss/libical_icalss_export.h
+++ b/src/libicalss/libical_icalss_export.h
@@ -1,3 +1,8 @@
+/**
+ SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
+
#ifndef LIBICAL_ICALSS_EXPORT_H
#define LIBICAL_ICALSS_EXPORT_H
diff --git a/src/libicalvcal/CMakeLists.txt b/src/libicalvcal/CMakeLists.txt
index 80b98ee0..d9caeaf6 100644
--- a/src/libicalvcal/CMakeLists.txt
+++ b/src/libicalvcal/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
add_definitions(-Dlibical_vcal_EXPORTS)
include_directories(
diff --git a/src/libicalvcal/README.TXT b/src/libicalvcal/README.txt
index 35e1f9b3..734c30a4 100644
--- a/src/libicalvcal/README.TXT
+++ b/src/libicalvcal/README.txt
@@ -1,951 +1,959 @@
-NOTE: If you used the earlier APIs released by Versit
-then you will want to look at the document "migrate.doc"
-included with this package. It contains a discussion of
-the differences between the old API and this one.
-
-----------------------------------------------------------------
-
-The vCard/vCalendar C interface is implemented in the set
-of files as follows:
-
-vcc.y, yacc source, and vcc.c, the yacc output you will use
-implements the core parser
-
-vobject.c implements an API that insulates the caller from
-the parser and changes in the vCard/vCalendar BNF
-
-port.h defines compilation environment dependent stuff
-
-vcc.h and vobject.h are header files for their .c counterparts
-
-vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
-which you may find useful.
-
-test.c is a standalone test driver that exercises some of
-the features of the APIs provided. Invoke test.exe on a
-VCARD/VCALENDAR input text file and you will see the pretty
-print output of the internal representation (this pretty print
-output should give you a good idea of how the internal
-representation looks like -- there is one such output in the
-following too). Also, a file with the .out suffix is generated
-to show that the internal representation can be written back
-in the original text format.
-
------------------------------------------------------------------
-
-
- VObject for VCard/VCalendar
-
-Table of Contents
-=================
-1. VObject
-2. Internal Representations of VCard/VCalendar
-3. Iterating Through VObject's Properties or Values
-4. Pretty Printing a VObject Tree
-5. Building A VObject Representation of A VCard/VCalendar
-6. Converting A VObject Representation Into Its Textual Representation
-7. Miscellaneous Notes On VObject APIs usages
-8. Brief descriptions of each APIs
-9. Additional Programming Notes.
-
-This document is mainly about the VObject and its APIs. The main
-use of a VObject is to represent a VCard or a VCalendar inside
-a program. However, its use is not limited to aforemention as it
-can represent an arbitrary information that makes up of a tree or
-forest of properties/values.
-
-1. VObject
- =======
-A VObject can have a name (id) and a list of associated properties and
-a value. Each property is itself a VObject.
-
-2. Internal Representations of VCard/VCalendar
- ===========================================
-A list of VCard or a VCalendar is represented by a list of VObjects.
-The name (id) of the VObjects in the list is either VCCardProp or
-VCCalProp. Each of these VObjects can have a list of properties.
-Since a property is represented as a VObject, each of these properties
-can have a name, a list of properties, and a value.
-
-For example, the input file "vobject.vcf":
-
-BEGIN:VCARD
-N:Alden;Roland
-FN:Roland H. Alden
-ORG:AT&T;Versit Project Office
-TITLE:Consultant
-EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-EMAIL;INTERNET:ralden@sfgate.com
-EMAIL;MCIMail:242-2200
-LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111
-LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-Suite 2208=0A=
-One Pine Street=0A=
-San Francisco, CA 94111=0A=
-U.S.A.
-TEL;WORK;PREF;MSG:+1 415 296 9106
-TEL;WORK;FAX:+1 415 296 9016
-TEL;MSG;CELL:+1 415 608 5981
-ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-SOUND:ROW-LAND H ALL-DIN
-LOGO;GIF;BASE64:
- R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- QjExMSEhIRAQEO///87v9973/73n95zW71K13jGl1nvG50Kt3iGc1gCMzq3e94zO
- 7xCU1nO952O15wAAACwAAAAApgBOAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv
- /8CgcEj8QTaeywWTyWCUno2kSK0KI5tLc8vtNi+WiHVMlj0mFK96nalsxOW4fPSw
- cNj4tQc+7xcjGh4WExJTJYUTFkp3eU0eEH6RkpOUlTARhRoWm5ydFpCWoS0QEqAu
- ARKaHRcVjV0borEoFl0cSre4Sq67FA+yvwAeTU8XHZ7HmxS6u2wVfMCVpAE3pJoW
- ylrMptDcOqSF4OHg3eQ5pInInb7lcc86mNbLzBXsZbRfUOn6ucyNHvVWJHCpQFDf
- MWwEEzLqx2YCQCqF3OnItClJNmYcJD7cSAKTuI/gtnEcOQKkyVIk6/+ds5CkFcMM
- 61LiENikwi1jBnNyuvUSjwWZOS5uIZarqNFcNl32XMMB6I06GgoJ+bZp1ZKeDl8E
- +MC1K1cBIhZ4HUu2LAsCZdOWRQDt20lxIlccSHsgrNq7Xc/ixcsWmNu34WKyYJCW
- gQjCe9XqTZy2L4pv04gg2sSKSc8OLgTcBSuWsdkVaD2TdXyiQxebFyjo1Gnx6tJm
- LuaqrdtZtNfFtruSNmF5IKujwIsmJbjwtRqNJhrcNVw79wcRAgogmE4ArIjQzj/s
- JvHAGCFDQR4UqigPK4sBe62XwO51OwADiMcqUG+iOdcFAL+hW20BfAoEexlwAnu6
- mZDAXQ1EVh//WfhxJB5gIbHgwFgOTOiVAgOuVQKAfKFg3weGwSBYFZMp4hpDGKyA
- 3lgJKECWgiMQyBVpW+0V4oJjNfhCNkR1IgWEb21QlRK9GdfFCgeOZYBsXgm4noYj
- GEBhAQHYh0J8XenoQnFGdrkUciJY6FUAK15ogozakcBhliKsyZWHDMZQ0wWC/Aim
- DB6h01KRr/lXQgFxAqDcWDACgCZpUnrVQJtjwTnWjS6MWAYqqfDnSaEkJOlVXQBo
- 2pWTMUJ53WgAuPncCR9q6VQMAYjZlXWJmknCoSUM2p4BC+SaKwG88hoZlvfFMM4f
- hQh5TXkv+RklWYtC91mopJIAKFkJlDAW/wF25ShnLbeo5gmQ+1FGkJdrKCuCi2OR
- BuwHBcwqKgABrMtVAgpem61XkLbAJ7n8uiIpvGVhO4KpH1QLbbpqLheZvQCkGoNL
- thSzSTg2UGVBBzbtaxwKsYrmgLvRAlCmWgwMAADD66rKAgR3XlGspcdkZYK8ibU7
- asgEl+XAyB8I7PCqMWiWncGGimpfAgO4ypXSPpOVLwsRCDJxRD2AoyeRRv5kApO5
- fXwzwvfOKLKtaTWtbQxccmGLTZy8xYlVSvXbhbk0M2YzrYfJJ0K8m+V9NgxpyC04
- UycI/aiuiH9Y8NftDUwWp1Wm5UABnAUKwwRsPFGBt4Oc9PZvGvNLwf8JOZt8Arpe
- eY23yDovwIDiBX74NAsPVLDJj3Hh4JEExsKcjrlKf9DsCVx3ZfLqAKBuG1s/A90C
- z2KjYHjjyPOdG1spz6BBUr+BcUxUb1nDCTa/VZD2Uv+YkLPAKJC9dNEh7628WgqI
- ybzlaA+ufxMa6bxC6ciLUQLcx5UGIAAsAkDA6wQkOxrcY39yo4cQMNWCAPTKV1R4
- wPkgaBxzOc8FtMiF1NoGoXBRJjgoPApmPsjCFlbMdzCM4TFy50IXxI2DPcHAv2rY
- gghsEIeu8CAPW6ABIPYEFkOsAeaMyIz0JfGJUExBBGRIRX0IMYovWCIT1eBELNpA
- i1vcgta8iANPCIQOghzQABl30J0tXqBla4wjFLFQxZzAUY42CIAd5OYBCuKxB2c4
- I0b28EcrQKADgmSKB9RYyDhA4BqCxIBqrtjIMTwoFeCjYSU3KZMQAAA7
-
-BEGIN:VCALENDAR
-DCREATED:19960523T100522
-PRODID:-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
-VERSION:0.3
-BEGIN:VEVENT
-START:19960523T120000
-END:19960523T130000
-SUBTYPE:PHONE CALL
-SUMMARY:VERSIT PDI PR Teleconference/Interview
-DESCRIPTION:VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland
-END:VEVENT
-BEGIN:VEVENT
-START:19960523T113000
-END:19960523T115500
-SUBTYPE:LUNCH
-SUMMARY:Eat in the cafeteria today
-END:VEVENT
-END:VCALENDAR
-
-END:VCARD
-
-
-will conceptually be represented as
- vcard
- VCNameProp
- VCFamilyNameProp=Alden
- VCGivenNameProp=Roland
- VCFullNameProp=Roland H.Alden
- ....
-
-note that
- EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
-will be represented as:
- VCEmailAddress=sf!rincon!ralden@alden.attmail.com
- VCWork
- VCPreferred
- VCInternet
-where the lower level properties are properties of the property
-VCEmailAddress.
-
-Groupings are flattened out in the VObject representation such
-that:
- a.b:blah
- a.c:blahblah
-are represented as:
- b=blah
- VCGrouping=a
- c=blahblah
- VCGrouping=a
-i.e. one can read the above as:
- the property "b" has value "blah" and property "VCGrouping"
- with the value "a".
- the property "c" has value "blahblah" and property "VCGrouping"
- with the value "a".
-likewise, multi-level groupings are flatten similarly. e.g.
- a.b.c:blah
- a.b.e:blahblah
--->
- c=blah
- VCGrouping=b
- VCGrouping=a
- e=blahblah
- VCGrouping=b
- VCGrouping=a
-which read:
- the property "c" has value "blah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
- the property "e" has value "blahblah" and property "VCGrouping"
- with the value "b" which has property "VCGrouping"
- with value "a".
-
-3. Iterating Through VObject's Properties or Values
- ================================================
-The following is a skeletal form of iterating through
-all properties of a vobject, o:
-
- // assume the object of interest, o, is of type VObject
- VObjectIterator i;
- initPropIterator(&i,o);
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- // ... do something with "each" property
- }
-
-Use the API vObjectName() to access a VObject's name.
-Use the API vObjectValueType() to determine if a VObject has
- a value. For VCard/VCalendar application, you
- should not need this function as practically
- all values are either of type VCVT_USTRINGZ or
- VCVT_RAW (i.e set by setVObjectUStringZValue and
- setVObjectAnyValue APIs respectively), and the
- value returned by calls to vObjectUStringZValue
- and vObjectAnyValue are 0 if a VObject has no
- value. (There is a minor exception where VObject with
- VCDataSizeProp has value that is set by
- setVObjectLongValue).
-Use the APIs vObject???Value() to access a VObject's value.
- where ??? is the expected type.
-Use the APIs setvObject???Value() to set or modify a VObject's value.
- where ??? is the expected type.
-Use the API isAPropertyOf() to query if a name match the name of
- a property of a VObject. Since isAPropertyOf() return
- the matching property, we can use that to retrieve
- a property and subsequently the value of the property.
-
-4. Pretty Printing a VObject Tree
- ==============================
-VObject tree can be pretty printed with the printVObject() function.
-The output of pretty printing a VObject representation of the input
-test file "vobject.vcf" is shown below. Note that the indentation
-indicates the tree hirerarchy where the immediate children nodes
-of a parent node is all at the same indentation level and the
-immediate children nodes are the immediate properties of the
-associated parent nodes. In the following, {N,FN,ORG,TITLE,...}
-are immediate properties of VCARD. {F and G} are properties of N
-with value {"Alden" and "Roland"} respectively; FN has no property
-but has the value "Roland H. Alden"; EMAIL has value and
-the properties WORK, PREF, and INTERNET.
-
-
-VCARD
- N
- F="Alden"
- G="Roland"
- FN="Roland H. Alden"
- ORG
- ORGNAME="AT&T"
- OUN="Versit Project Office"
- TITLE="Consultant"
- EMAIL="sf!rincon!ralden@alden.attmail.com"
- WORK
- PREF
- INTERNET
- EMAIL="ralden@sfgate.com"
- INTERNET
- EMAIL="242-2200"
- MCIMail
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111"
- DOM
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- LABEL="Roland H. Alden
- Suite 2208
- One Pine Street
- San Francisco, CA 94111
- U.S.A."
- POSTAL
- PARCEL
- HOME
- WORK
- QP
- TEL="+1 415 296 9106"
- WORK
- PREF
- MSG
- TEL="+1 415 296 9016"
- WORK
- FAX
- TEL="+1 415 608 5981"
- MSG
- CELL
- ADR
- EXT ADD="Suite 2208"
- STREET="One Pine Street"
- L="San Francisco"
- R="CA"
- PC="94111"
- C="U.S.A."
- SOUND="ROW-LAND H ALL-DIN"
- LOGO=[raw data]
- GIF
- BASE64
- DataSize=1482
-VCALENDAR
- DCREATED="19960523T100522"
- PRODID="-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN"
- VERSION="0.3"
- VEVENT
- START="19960523T120000"
- END="19960523T130000"
- SUBTYPE="PHONE CALL"
- SUMMARY="VERSIT PDI PR Teleconference/Interview"
- DESCRIPTION="VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland"
- VEVENT
- START="19960523T113000"
- END="19960523T115500"
- SUBTYPE="LUNCH"
- SUMMARY="Eat in the cafeteria today"
-
-5. Building A VObject Representation of A VCard/VCalendar
- ======================================================
-The parser in vcc.y converts an input file with one or more
-VCard/VCalendar that is in their textual representation
-into their corresponding VObject representation.
-
-VObject representation of a VCard/VCalendar can also be built
-directly with calls to the VObject building APIs. e.g.
-
- VObject *prop;
- VObject *vcard = newVObject(VCCardProp);
- prop = addProp(vcard,VCNameProp);
- addPropValue(prop,VCFamilyNameProp,"Alden");
- addPropValue(prop,VCGivenNameProp,"Roland");
- addPropValue(vcard,VCFullNameProp,"Roland H. Alden");
- ....
-
-6. Converting A VObject Representation Into Its Textual Representation
- ===================================================================
-The VObject representation can be converted back to its textual
-representation via the call to writeVObject() or writeMemVObject()
-API. e.g.
- a. to write to a file:
- // assume vcard is of type VObject
- FILE *fp = fopen("alden.vcf","w");
- writeVObject(fp,vcard);
- a. to write to memory, and let the API allocate the required memory.
- char* clipboard = writeVObject(0,0,vcard);
- ... do something to clipboard
- free(clipboard);
- b. to write to a user allocated buffer:
- char clipboard[16384];
- int len = 16384;
- char *buf = writeVObject(clipboard,&len,vcard);
- ... buf will be equal to clipboard if the write
- is successful otherwise 0.
-
-In the case of writing to memory, the memory buffer can be either
-allocated by the API or the user. If the user allocate the
-memory for the buffer, then the length of the buffer needs to be
-communicated to the API via a variable. The variable passed as
-the length argument will be overwritten with the actual size
-of the text output. A 0 return value from writeMemVObject()
-indicates an error which could be caused by overflowing the
-size of the buffer or lack of heap memory.
-
-7. Miscellaneous Notes On VObject APIs usages
- ==========================================
-a. vcc.h -- contains basic interfaces to the parser:
- VObject* Parse_MIME(const char *input, unsigned long len);
- VObject* Parse_MIME_FromFile(FILE *file);
- -- both of this return a null-terminated list of
- VObject that is either a VCARD or VCALENDAR.
- To iterate through this list, do
- VObject *t, *v;
- v = Parse_Mime_FromFile(fp);
- while (v) {
- // ... do something to v.
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- note that call to cleanVObject will release
- resource used to represent the VObject.
-
-b. vobject.h -- contains basic interfaces to the VObject APIs.
- see the header for more details.
- The structure of VObject is purposely (hiddened) not exposed
- to the user. Every access has to be done via
- the APIs. This way, if we need to change the
- structure or implementation, the client need not
- recompile as long as the interfaces remain the
- same.
-
-c. values of a property is determined by the property definition
- itself. The vobject APIs does not attempt to enforce
- any of such definition. It is the consumer's responsibility
- to know what value is expected from a property. E.g.
- most properties have unicode string value, so to access
- the value of these type of properties, you will use
- the vObjectUStringZValue() to read the value and
- setVObjectUStringZValue() to set or modify the value.
- Refer to the VCard and VCalendar specifications for
- the definition of each property.
-
-d. properties name (id) are case insensitive.
-
-8. Brief descriptions of each APIs
- ===============================
- * the predefined properties' names (id) are listed under vobject.h
- each is of the form VC*Prop. e.g.
- #define VC7bitProp "7BIT"
- #define VCAAlarmProp "AALARM"
- ....
-
- * consumer of a VObject can only define pointers to VObject.
-
- * a variable of type VObjectIterator, say "i", can be used to iterate
- through a VObject's properties, say "o". The APIs related to
- VObjectIterator are:
- void initPropIterator(VObjectIterator *i, VObject *o);
- -- e.g. usage
- initPropIterator(&i,o);
- int moreIteration(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) { ... }
- VObject* nextVObject(VObjectIterator *i);
- -- e.g. usage
- while (moreIteration(&i)) {
- VObject *each = nextVObject(&i);
- }
-
- * VObject can be chained together to form a list. e.g. of such
- use is in the parser where the return value of the parser is
- a link list of VObject. A link list of VObject can be
- built by:
- void addList(VObject **o, VObject *p);
- and iterated by
- VObject* nextVObjectInList(VObject *o);
- -- next VObjectInList return 0 if the list
- is exhausted.
-
- * the following APIs are mainly used to construct a VObject tree:
- VObject* newVObject(const char *id);
- -- used extensively internally by VObject APIs but when
- used externally, its use is mainly limited to the
- construction of top level object (e.g. an object
- with VCCardProp or VCCalendarProp id).
-
- void deleteVObject(VObject *p);
- -- to deallocate single VObject, for most user, use
- cleanVObject(VObject *o) instead for freeing all
- resources associated with the VObject.
-
- char* dupStr(const char *s, unsigned int size);
- -- duplicate a string s. If size is 0, the string is
- assume to be a null-terminated.
-
- void deleteStr(const char *p);
- -- used to deallocate a string allocated by dupStr();
-
- void setVObjectName(VObject *o, const char* id);
- -- set the id of VObject o. This function is not
- normally used by the user. The setting of id
- is normally done as part of other APIs (e.g.
- addProp()).
-
- void setVObjectStringZValue(VObject *o, const char *s);
- -- set a string value of a VObject.
-
- void setVObjectUStringZValue(VObject *o, const wchar_t *s);
- -- set a Unicode string value of a VObject.
-
- void setVObjectIntegerValue(VObject *o, unsigned int i);
- -- set an integer value of a VObject.
-
- void setVObjectLongValue(VObject *o, unsigned long l);
- -- set an long integer value of a VObject.
-
- void setVObjectAnyValue(VObject *o, void *t);
- -- set any value of a VObject. The value type is
- unspecified.
-
- VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
- -- set a raw data (stream of bytes) value of a VObject
- whose size is size. The internal VObject representation
- is
- this object = val
- VCDataSizeProp=size
- i.e. the value val will be attached to the VObject prop
- and a property of VCDataSize whose value is size
- is also added to the object.
-
- void setVObjectVObjectValue(VObject *o, VObject *p);
- -- set a VObject as the value of another VObject.
-
- const char* vObjectName(VObject *o);
- -- retrieve the VObject's Name (i.e. id).
-
- const char* vObjectStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated string.
-
- const wchar_t* vObjectUStringZValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- null-terminated unicode string.
-
- unsigned int vObjectIntegerValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- integer.
-
- unsigned long vObjectLongValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- long integer.
-
- void* vObjectAnyValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- any value.
-
- VObject* vObjectVObjectValue(VObject *o);
- -- retrieve the VObject's value interpreted as
- a VObject.
-
- VObject* addVObjectProp(VObject *o, VObject *p);
- -- add a VObject p as a property of VObject o.
- (not normally used externally for building a
- VObject).
-
- VObject* addProp(VObject *o, const char *id);
- -- add a property whose name is id to VObject o.
-
- VObject* addPropValue(VObject *o, const char *id, const char *v);
- -- add a property whose name is id and whose value
- is a null-terminated string to VObject o.
-
- VObject* addPropSizedValue(VObject *o, const char *id,
- const char *v, unsigned int size);
- -- add a property whose name is id and whose value
- is a stream of bytes of size size, to VObject o.
-
- VObject* addGroup(VObject *o, const char *g);
- -- add a group g to VObject o.
- e.g. if g is a.b.c, you will have
- o
- c
- VCGroupingProp=b
- VCGroupingProp=a
- and the object c is returned.
-
- VObject* isAPropertyOf(VObject *o, const char *id);
- -- query if a property by the name id is in o and
- return the VObject that represent that property.
-
- void printVObject(VObject *o);
- -- pretty print VObject o to stdout (for debugging use).
-
- void writeVObject(FILE *fp, VObject *o);
- -- convert VObject o to its textual representation and
- write it to file.
-
- char* writeMemVObject(char *s, int *len, VObject *o);
- -- convert VObject o to its textual representation and
- write it to memory. If s is 0, then memory required
- to hold the textual representation will be allocated
- by this API. If a variable len is passed, len will
- be overwritten with the byte size of the textual
- representation. If s is non-zero, then s has to
- be a user allocated buffer whose size has be passed
- in len as a variable. Memory allocated by the API
- has to be freed with call to free. The return value
- of this API is either the user supplied buffer,
- the memory allocated by the API, or 0 (in case of
- failure).
-
- void cleanStrTbl();
- -- this function has to be called when all
- VObject has been destroyed.
-
- void cleanVObject(VObject *o);
- -- release all resources used by VObject o.
-
- wchar_t* fakeUnicode(const char *ps, int *bytes);
- -- convert char* to wchar_t*.
-
- extern int uStrLen(const wchar_t *u);
- -- length of unicode u.
-
- char *fakeCString(const wchar_t *u);
- -- convert wchar_t to CString (blindly assumes that
- this could be done).
-
-9. Additional Programming Notes
- ============================
-In the following notes, please refers to the listing
-of Example.vcf and its VObject Representation
-(shown at the end of this section).
-
-* Handling the Return Value of the VCard/VCalendar Parser
- The example input text file contains two root VObjects
- (a VCalendar and a VCard). The output of the VCard/VCalendar
- parser is a null-terminated list of VObjects. For this
- particular input file, the list will have two VObjects.
- The following shows a template for iterating through the
- output of the Parser:
-
- VObject *t, *v;
- v = Parse_Mime_fromFileName("example.vcf");
- while (v) {
- // currently, v will either be a VCard or a VCalendar
- // do whatever your application need to do to
- // v here ...
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
-
-* Iterating Through a VCard/VCalendar VObject
- From the VObject APIs point of view, a VCard VObject
- is the same as a VCalendar VObject. However, the application
- needs to know what are in a VCard or a VCalendar.
- For example, A VCalendar VObject can have VCDCreatedProp,
- a VCGEOLocationProp, etc, and one or more VCEventProp and
- or VCTodoProp. The VCEventProp and VCTodoProp can have
- many properties of their own, which in turn could have
- more properties (e.g. VCDAlarmProp can be a VCEventProp
- VObject's property, and VCRunTimeProp can be a
- VCDAlarmProp VObject's property. Because a VObject tree
- can be arbitrarily complex, in general, to process all
- properties and values of a VObject tree, a recursive walk
- is desirable. An example recursive VObject tree walk
- can be found in the vobject.c source lines for printVObject*
- and writeVObject* APIs. Depending on what the application need
- to do with a VCard or a VCalendar, a recursive walk
- of the VObject tree may or may not be desirable. An example
- template of a non-recursive walk is shown below:
-
- void processVCardVCalendar(char *inputFile)
- {
- VObject *t, *v;
- v = Parse_Mime_fromFileName(inputFile);
- while (v) {
- char *n = vObjectName(v);
- if (strcmp(n,VCCardProp) == 0) {
- do_VCard(v);
- }
- else if (strcmp(n,VCCalendarProp) == 0) {
- do_VCalendar(v);
- }
- else {
- // don't know how to handle anything else!
- }
- t = v;
- v = nextVObjectInList(v);
- cleanVObject(t);
- }
- }
-
- void do_VCard(VObject *vcard)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primary purpose of this example is to
- // show how to iterate through a VCard VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCNameProp)==0) {
- do_name(eachProp);
- }
- else if (strcmp(n,VCEmailProp)==0) {
- do_email(eachProp);
- }
- else if (strcmp(n,VCLabelProp)==0) {
- do_label(eachProp);
- }
- else if ....
- }
- }
-
- void do_VCalendar(VObject *vcal)
- {
- VObjectIterator t;
- initPropIterator(&t,vcard);
- while (moreIteration(&t)) {
- VObject *eachProp = nextVObject(&t);
- // The primary purpose of this example is to
- // show how to iterate through a VCalendar VObject,
- // it is not meant to be efficient at all.
- char *n = vObjectName(eachProp);
- if (strcmp(n,VCDCreatedProp)==0) {
- do_DCreated(eachProp);
- }
- else if (strcmp(n,VCVersionProp)==0) {
- do_Version(eachProp);
- }
- else if (strcmp(n,VCTodoProp)==0) {
- do_Todo(eachProp);
- }
- else if (strcmp(n,VCEventProp)==0) {
- do_Event(eachProp);
- }
- else if ....
- }
- }
-
- void do_Todo(VObject *vtodo) { ... }
-
- void do_Event(VObject *vevent) { ... }
-
- ...
-
-* Property's Values and Properties
- The VObject APIs do not attempt to check for the
- correctness of the values of a property. Nor do they
- will prevent the user from attaching a non-VCard/VCalendar
- standard property to a VCard/VCalendar property. Take
- the example of line [11] of the example, "O.K" is not
- a valid value of VCStatusProp. It is up to the application
- to accept or reject the value of a property.
-
-* Output of printVObject
- PrintVObject pretty prints a VObject tree in human
- readable form. See the listing at the end of the file
- for an example output of printVObject on the example
- input file "Example.vcf".
-
- Note that binary data are not shown in the output of
- printVObject. Instead, a note is made ([raw data]) to
- indicate that there exists such a binary data.
-
-* Note on Binary Data
- When the value of a property is a binary data, it is only
- useful to know the size of the binary data.
-
- In the case of the VCard/VCalendar parser, it chooses
- to represent the size information as a separate property
- called VCDataSizeProp whose value is the size of the binary
- data. The APIs sequence to construct the VObject subtree
- of line [44] of Example.vcf is
-
- // VObject *vcard;
- VObject *p1 = addProp(vcard,VCLogoProp);
- (void) addProp(p1,VCGIFProp);
- (void) addProp(p1,VCBASE64Prop);
- VObject *p2 = addProp(p1,VCDataSizeProp);
- (void) setVObjectLongValue(p2,1482);
- setVObjectAnyValue(vcard,...pointer to binary data);
-
- Note the presence of VCBase64Prop will cause the
- writeVObject API to output the binary data as BASE64 text.
- For VCard/VCalendar application, having the VCBase64Prop
- property is practically always necessary for property with
- binary data as its value.
-
-* Note on Quoted-Printable String
- String value with embedded newline are written out as
- quoted-prinatable string. It is therefore important
- to mark a property with a string value that has
- one or more embedded newlines, with the VCQutedPrintableProp
- property. e.g.
-
- // VObject *root;
- char *msg="To be\nor\nnot to be";
- VObject *p = addPropValue(root,VCDescriptionProp,msg);
- // the following is how you mark a property with
- // a property. In this case, the marker is
- // VCQuotedPrintableProp
- addProp(p,VCQuotedPrintableProp);
-
-* Note on Unicode
- Although, the current parser takes ASCII text file only,
- string values are all stored as Unicode in the VObject tree.
- For now, when using the VObject APIs to construct a
- VObject tree, one should always convert ASCII string value
- to a Unicode string value:
-
- // VObject *root;
- VObject *p = addProp(root,VCSomeProp);
- setVObjectUStringZValue(p,fakeUnicode(someASCIIStringZvalue));
-
- An API is provided to simplify the above process:
-
- addPropValue(root,VCSomeProp,someASCIIStringZValue);
-
- Note that someASCIISTringZValue is automatically converted to
- Unicode by addPropValue API, where as, the former code
- sequence do an explicit call to fakeUnicode.
-
- To read back the value, one should use the vObjectUStringZValue
- API not vObjectStringZValue API. The value returned by the
- vObjectUStringZValue API is a Unicode string. If the application
- do not know how to handle Unicode string, it can use the
- fakeCString API to convert it back to ASCII string (as long
- as the conversion is meaningful).
-
- Note that fakeCString return a heap allocated memory. It is
- important to call deleteStr on fakeCString return value if
- it is not longer required (or there will be memory leak).
-
- NOTE: Unfortunately, at the point when this document is written,
- there is still no consensus on how Unicode is to be handled
- in the textual representation of VCard/VCalendar. So, there
- is no version of writeVObject and the parser to output and
- input Unicode textual representation of VCard/VCalendar.
-
-
-Example.vcf
------------
-line
-number Input Text (example.vcf)
------- ----------
-1 BEGIN:VCALENDAR
-2 DCREATED:19961102T100522
-3 GEO:0,0
-4 VERSION:1.0
-5 BEGIN:VEVENT
-6 DTSTART:19961103T000000
-7 DTEND:20000101T000000
-8 DESCRIPTION;QUOTED-PRINTABLE:To be =0A=
-9 or =0A=
-10 not to be
-11 STATUS:O.K.
-12 X-ACTION:No action required
-13 DALARM:19961103T114500;5;3;Enjoy
-14 MALARM:19970101T120000;;;johny@nowhere.com;Call Mom.
-15 END:VEVENT
-16
-17 BEGIN:VTODO
-18 DUE:19960614T0173000
-19 DESCRIPTION:Relex.
-20 END:VTODO
-21
-22 END:VCALENDAR
-23
-24 BEGIN:VCARD
-25 N:Alden;Roland
-26 FN:Roland H. Alden
-27 ORG:AT&T;Versit Project Office
-28 TITLE:Consultant
-29 EMAIL;WORK;PREF;INTERNET:ralden@ralden.com
-30 LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-31 Suite 2208=0A=
-32 One Pine Street=0A=
-33 San Francisco, CA 94111
-34 LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
-35 Suite 2208=0A=
-36 One Pine Street=0A=
-37 San Francisco, CA 94111=0A=
-38 U.S.A.
-39 TEL;WORK;PREF;MSG:+1 415 296 9106
-40 TEL;WORK;FAX:+1 415 296 9016
-41 TEL;MSG;CELL:+1 415 608 5981
-42 ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
-43 SOUND:ROW-LAND H ALL-DIN
-44 LOGO;GIF;BASE64:
-45 R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
- ... 30 lines of BASE64 data not shown here.
-76 END:VCARD
-
-
-VObject Representation of Example.vcf:
--------------------------------------
-line
-in
-text
-file VObject Tree as Printed by printVObject API
----- -------------------------------------------
-1 VCALENDAR
-2 DCREATED="19961102T100522"
-3 GEO="0,0"
-4 VERSION="1.0"
-5 VEVENT
-6 DTSTART="19961103T000000"
-7 DTEND="20000101T000000"
-8 DESCRIPTION="To be
-9 or
-10 not to be"
-8 QUOTED-PRINTABLE
-11 STATUS="O.K."
-12 X-ACTION="No action required"
-13 DALARM
-13 RUNTIME="19961103T114500"
-13 SNOOZETIME="5"
-13 REPEATCOUNT="3"
-13 DISPLAYSTRING="Enjoy"
-14 MALARM
-14 RUNTIME="19970101T120000"
-14 EMAIL="johny@nowhere.com"
-14 NOTE="Call Mom"
-17 VTODO
-18 DUE="19960614T0173000"
-19 DESCRIPTION="Relex."
-24 VCARD
-25 N
-25 F="Alden"
-25 G="Roland"
-26 FN="Roland H. Alden"
-27 ORG
-27 ORGNAME="AT&T"
-27 OUN="Versit Project Office"
-28 TITLE="Consultant"
-29 EMAIL="ralden@alden.com"
-29 WORK
-29 PREF
-29 INTERNET
-30 LABEL="Roland H. Alden
-31 Suite 2208
-32 One Pine Street
-33 San Francisco, CA 94111"
-30 DOM
-30 POSTAL
-30 PARCEL
-30 HOME
-30 WORK
-30 QUOTED-PRINTABLE
-34 LABEL="Roland H. Alden
-35 Suite 2208
-36 One Pine Street
-37 San Francisco, CA 94111
-38 U.S.A."
-34 POSTAL
-34 PARCEL
-34 HOME
-34 WORK
-34 QUOTED-PRINTABLE
-39 TEL="+1 415 296 9106"
-39 WORK
-39 PREF
-39 MSG
-40 TEL="+1 415 296 9016"
-40 WORK
-40 FAX
-41 TEL="+1 415 608 5981"
-41 MSG
-41 CELL
-42 ADR
-42 EXT ADD="Suite 2208"
-42 STREET="One Pine Street"
-42 L="San Francisco"
-42 R="CA"
-42 PC="94111"
-42 C="U.S.A."
-43 SOUND="ROW-LAND H ALL-DIN"
-44 LOGO=[raw data]
-44 GIF
-44 BASE64
-44 DATASIZE=1482
-
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
+Business Machines Corporation and Siemens Rolm Communications Inc.
+
+SPDX-License-Identifier: LicenseRef-APPLEMIT
+
+The software is provided with RESTRICTED RIGHTS. Use, duplication, or
+disclosure by the government are subject to restrictions set forth in
+DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
+
+NOTE: If you used the earlier APIs released by Versit
+then you will want to look at the document "migrate.doc"
+included with this package. It contains a discussion of
+the differences between the old API and this one.
+
+----------------------------------------------------------------
+
+The vCard/vCalendar C interface is implemented in the set
+of files as follows:
+
+vcc.y, yacc source, and vcc.c, the yacc output you will use
+implements the core parser
+
+vobject.c implements an API that insulates the caller from
+the parser and changes in the vCard/vCalendar BNF
+
+port.h defines compilation environment dependent stuff
+
+vcc.h and vobject.h are header files for their .c counterparts
+
+vcaltmp.h and vcaltmp.c implement vCalendar "macro" functions
+which you may find useful.
+
+test.c is a standalone test driver that exercises some of
+the features of the APIs provided. Invoke test.exe on a
+VCARD/VCALENDAR input text file and you will see the pretty
+print output of the internal representation (this pretty print
+output should give you a good idea of how the internal
+representation looks like -- there is one such output in the
+following too). Also, a file with the .out suffix is generated
+to show that the internal representation can be written back
+in the original text format.
+
+-----------------------------------------------------------------
+
+
+ VObject for VCard/VCalendar
+
+Table of Contents
+=================
+1. VObject
+2. Internal Representations of VCard/VCalendar
+3. Iterating Through VObject's Properties or Values
+4. Pretty Printing a VObject Tree
+5. Building A VObject Representation of A VCard/VCalendar
+6. Converting A VObject Representation Into Its Textual Representation
+7. Miscellaneous Notes On VObject APIs usages
+8. Brief descriptions of each APIs
+9. Additional Programming Notes.
+
+This document is mainly about the VObject and its APIs. The main
+use of a VObject is to represent a VCard or a VCalendar inside
+a program. However, its use is not limited to aforemention as it
+can represent an arbitrary information that makes up of a tree or
+forest of properties/values.
+
+1. VObject
+ =======
+A VObject can have a name (id) and a list of associated properties and
+a value. Each property is itself a VObject.
+
+2. Internal Representations of VCard/VCalendar
+ ===========================================
+A list of VCard or a VCalendar is represented by a list of VObjects.
+The name (id) of the VObjects in the list is either VCCardProp or
+VCCalProp. Each of these VObjects can have a list of properties.
+Since a property is represented as a VObject, each of these properties
+can have a name, a list of properties, and a value.
+
+For example, the input file "vobject.vcf":
+
+BEGIN:VCARD
+N:Alden;Roland
+FN:Roland H. Alden
+ORG:AT&T;Versit Project Office
+TITLE:Consultant
+EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
+EMAIL;INTERNET:ralden@sfgate.com
+EMAIL;MCIMail:242-2200
+LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+Suite 2208=0A=
+One Pine Street=0A=
+San Francisco, CA 94111
+LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+Suite 2208=0A=
+One Pine Street=0A=
+San Francisco, CA 94111=0A=
+U.S.A.
+TEL;WORK;PREF;MSG:+1 415 296 9106
+TEL;WORK;FAX:+1 415 296 9016
+TEL;MSG;CELL:+1 415 608 5981
+ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
+SOUND:ROW-LAND H ALL-DIN
+LOGO;GIF;BASE64:
+ R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
+ QjExMSEhIRAQEO///87v9973/73n95zW71K13jGl1nvG50Kt3iGc1gCMzq3e94zO
+ 7xCU1nO952O15wAAACwAAAAApgBOAAAF/yAgjmRpnmiqrmzrvnAsz3Rt33iu73zv
+ /8CgcEj8QTaeywWTyWCUno2kSK0KI5tLc8vtNi+WiHVMlj0mFK96nalsxOW4fPSw
+ cNj4tQc+7xcjGh4WExJTJYUTFkp3eU0eEH6RkpOUlTARhRoWm5ydFpCWoS0QEqAu
+ ARKaHRcVjV0borEoFl0cSre4Sq67FA+yvwAeTU8XHZ7HmxS6u2wVfMCVpAE3pJoW
+ ylrMptDcOqSF4OHg3eQ5pInInb7lcc86mNbLzBXsZbRfUOn6ucyNHvVWJHCpQFDf
+ MWwEEzLqx2YCQCqF3OnItClJNmYcJD7cSAKTuI/gtnEcOQKkyVIk6/+ds5CkFcMM
+ 61LiENikwi1jBnNyuvUSjwWZOS5uIZarqNFcNl32XMMB6I06GgoJ+bZp1ZKeDl8E
+ +MC1K1cBIhZ4HUu2LAsCZdOWRQDt20lxIlccSHsgrNq7Xc/ixcsWmNu34WKyYJCW
+ gQjCe9XqTZy2L4pv04gg2sSKSc8OLgTcBSuWsdkVaD2TdXyiQxebFyjo1Gnx6tJm
+ LuaqrdtZtNfFtruSNmF5IKujwIsmJbjwtRqNJhrcNVw79wcRAgogmE4ArIjQzj/s
+ JvHAGCFDQR4UqigPK4sBe62XwO51OwADiMcqUG+iOdcFAL+hW20BfAoEexlwAnu6
+ mZDAXQ1EVh//WfhxJB5gIbHgwFgOTOiVAgOuVQKAfKFg3weGwSBYFZMp4hpDGKyA
+ 3lgJKECWgiMQyBVpW+0V4oJjNfhCNkR1IgWEb21QlRK9GdfFCgeOZYBsXgm4noYj
+ GEBhAQHYh0J8XenoQnFGdrkUciJY6FUAK15ogozakcBhliKsyZWHDMZQ0wWC/Aim
+ DB6h01KRr/lXQgFxAqDcWDACgCZpUnrVQJtjwTnWjS6MWAYqqfDnSaEkJOlVXQBo
+ 2pWTMUJ53WgAuPncCR9q6VQMAYjZlXWJmknCoSUM2p4BC+SaKwG88hoZlvfFMM4f
+ hQh5TXkv+RklWYtC91mopJIAKFkJlDAW/wF25ShnLbeo5gmQ+1FGkJdrKCuCi2OR
+ BuwHBcwqKgABrMtVAgpem61XkLbAJ7n8uiIpvGVhO4KpH1QLbbpqLheZvQCkGoNL
+ thSzSTg2UGVBBzbtaxwKsYrmgLvRAlCmWgwMAADD66rKAgR3XlGspcdkZYK8ibU7
+ asgEl+XAyB8I7PCqMWiWncGGimpfAgO4ypXSPpOVLwsRCDJxRD2AoyeRRv5kApO5
+ fXwzwvfOKLKtaTWtbQxccmGLTZy8xYlVSvXbhbk0M2YzrYfJJ0K8m+V9NgxpyC04
+ UycI/aiuiH9Y8NftDUwWp1Wm5UABnAUKwwRsPFGBt4Oc9PZvGvNLwf8JOZt8Arpe
+ eY23yDovwIDiBX74NAsPVLDJj3Hh4JEExsKcjrlKf9DsCVx3ZfLqAKBuG1s/A90C
+ z2KjYHjjyPOdG1spz6BBUr+BcUxUb1nDCTa/VZD2Uv+YkLPAKJC9dNEh7628WgqI
+ ybzlaA+ufxMa6bxC6ciLUQLcx5UGIAAsAkDA6wQkOxrcY39yo4cQMNWCAPTKV1R4
+ wPkgaBxzOc8FtMiF1NoGoXBRJjgoPApmPsjCFlbMdzCM4TFy50IXxI2DPcHAv2rY
+ gghsEIeu8CAPW6ABIPYEFkOsAeaMyIz0JfGJUExBBGRIRX0IMYovWCIT1eBELNpA
+ i1vcgta8iANPCIQOghzQABl30J0tXqBla4wjFLFQxZzAUY42CIAd5OYBCuKxB2c4
+ I0b28EcrQKADgmSKB9RYyDhA4BqCxIBqrtjIMTwoFeCjYSU3KZMQAAA7
+
+BEGIN:VCALENDAR
+DCREATED:19960523T100522
+PRODID:-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN
+VERSION:0.3
+BEGIN:VEVENT
+START:19960523T120000
+END:19960523T130000
+SUBTYPE:PHONE CALL
+SUMMARY:VERSIT PDI PR Teleconference/Interview
+DESCRIPTION:VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland
+END:VEVENT
+BEGIN:VEVENT
+START:19960523T113000
+END:19960523T115500
+SUBTYPE:LUNCH
+SUMMARY:Eat in the cafeteria today
+END:VEVENT
+END:VCALENDAR
+
+END:VCARD
+
+
+will conceptually be represented as
+ vcard
+ VCNameProp
+ VCFamilyNameProp=Alden
+ VCGivenNameProp=Roland
+ VCFullNameProp=Roland H.Alden
+ ....
+
+note that
+ EMAIL;WORK;PREF;INTERNET:sf!rincon!ralden@alden.attmail.com
+will be represented as:
+ VCEmailAddress=sf!rincon!ralden@alden.attmail.com
+ VCWork
+ VCPreferred
+ VCInternet
+where the lower level properties are properties of the property
+VCEmailAddress.
+
+Groupings are flattened out in the VObject representation such
+that:
+ a.b:blah
+ a.c:blahblah
+are represented as:
+ b=blah
+ VCGrouping=a
+ c=blahblah
+ VCGrouping=a
+i.e. one can read the above as:
+ the property "b" has value "blah" and property "VCGrouping"
+ with the value "a".
+ the property "c" has value "blahblah" and property "VCGrouping"
+ with the value "a".
+likewise, multi-level groupings are flatten similarly. e.g.
+ a.b.c:blah
+ a.b.e:blahblah
+-->
+ c=blah
+ VCGrouping=b
+ VCGrouping=a
+ e=blahblah
+ VCGrouping=b
+ VCGrouping=a
+which read:
+ the property "c" has value "blah" and property "VCGrouping"
+ with the value "b" which has property "VCGrouping"
+ with value "a".
+ the property "e" has value "blahblah" and property "VCGrouping"
+ with the value "b" which has property "VCGrouping"
+ with value "a".
+
+3. Iterating Through VObject's Properties or Values
+ ================================================
+The following is a skeletal form of iterating through
+all properties of a vobject, o:
+
+ // assume the object of interest, o, is of type VObject
+ VObjectIterator i;
+ initPropIterator(&i,o);
+ while (moreIteration(&i)) {
+ VObject *each = nextVObject(&i);
+ // ... do something with "each" property
+ }
+
+Use the API vObjectName() to access a VObject's name.
+Use the API vObjectValueType() to determine if a VObject has
+ a value. For VCard/VCalendar application, you
+ should not need this function as practically
+ all values are either of type VCVT_USTRINGZ or
+ VCVT_RAW (i.e set by setVObjectUStringZValue and
+ setVObjectAnyValue APIs respectively), and the
+ value returned by calls to vObjectUStringZValue
+ and vObjectAnyValue are 0 if a VObject has no
+ value. (There is a minor exception where VObject with
+ VCDataSizeProp has value that is set by
+ setVObjectLongValue).
+Use the APIs vObject???Value() to access a VObject's value.
+ where ??? is the expected type.
+Use the APIs setvObject???Value() to set or modify a VObject's value.
+ where ??? is the expected type.
+Use the API isAPropertyOf() to query if a name match the name of
+ a property of a VObject. Since isAPropertyOf() return
+ the matching property, we can use that to retrieve
+ a property and subsequently the value of the property.
+
+4. Pretty Printing a VObject Tree
+ ==============================
+VObject tree can be pretty printed with the printVObject() function.
+The output of pretty printing a VObject representation of the input
+test file "vobject.vcf" is shown below. Note that the indentation
+indicates the tree hirerarchy where the immediate children nodes
+of a parent node is all at the same indentation level and the
+immediate children nodes are the immediate properties of the
+associated parent nodes. In the following, {N,FN,ORG,TITLE,...}
+are immediate properties of VCARD. {F and G} are properties of N
+with value {"Alden" and "Roland"} respectively; FN has no property
+but has the value "Roland H. Alden"; EMAIL has value and
+the properties WORK, PREF, and INTERNET.
+
+
+VCARD
+ N
+ F="Alden"
+ G="Roland"
+ FN="Roland H. Alden"
+ ORG
+ ORGNAME="AT&T"
+ OUN="Versit Project Office"
+ TITLE="Consultant"
+ EMAIL="sf!rincon!ralden@alden.attmail.com"
+ WORK
+ PREF
+ INTERNET
+ EMAIL="ralden@sfgate.com"
+ INTERNET
+ EMAIL="242-2200"
+ MCIMail
+ LABEL="Roland H. Alden
+ Suite 2208
+ One Pine Street
+ San Francisco, CA 94111"
+ DOM
+ POSTAL
+ PARCEL
+ HOME
+ WORK
+ QP
+ LABEL="Roland H. Alden
+ Suite 2208
+ One Pine Street
+ San Francisco, CA 94111
+ U.S.A."
+ POSTAL
+ PARCEL
+ HOME
+ WORK
+ QP
+ TEL="+1 415 296 9106"
+ WORK
+ PREF
+ MSG
+ TEL="+1 415 296 9016"
+ WORK
+ FAX
+ TEL="+1 415 608 5981"
+ MSG
+ CELL
+ ADR
+ EXT ADD="Suite 2208"
+ STREET="One Pine Street"
+ L="San Francisco"
+ R="CA"
+ PC="94111"
+ C="U.S.A."
+ SOUND="ROW-LAND H ALL-DIN"
+ LOGO=[raw data]
+ GIF
+ BASE64
+ DataSize=1482
+VCALENDAR
+ DCREATED="19960523T100522"
+ PRODID="-//Alden Roland/Hand Crafted In North Carolina//NONSGML Made By Hand//EN"
+ VERSION="0.3"
+ VEVENT
+ START="19960523T120000"
+ END="19960523T130000"
+ SUBTYPE="PHONE CALL"
+ SUMMARY="VERSIT PDI PR Teleconference/Interview"
+ DESCRIPTION="VERSIT PDI PR Teleconference/Interview With Tom Streeter and Alden Roland"
+ VEVENT
+ START="19960523T113000"
+ END="19960523T115500"
+ SUBTYPE="LUNCH"
+ SUMMARY="Eat in the cafeteria today"
+
+5. Building A VObject Representation of A VCard/VCalendar
+ ======================================================
+The parser in vcc.y converts an input file with one or more
+VCard/VCalendar that is in their textual representation
+into their corresponding VObject representation.
+
+VObject representation of a VCard/VCalendar can also be built
+directly with calls to the VObject building APIs. e.g.
+
+ VObject *prop;
+ VObject *vcard = newVObject(VCCardProp);
+ prop = addProp(vcard,VCNameProp);
+ addPropValue(prop,VCFamilyNameProp,"Alden");
+ addPropValue(prop,VCGivenNameProp,"Roland");
+ addPropValue(vcard,VCFullNameProp,"Roland H. Alden");
+ ....
+
+6. Converting A VObject Representation Into Its Textual Representation
+ ===================================================================
+The VObject representation can be converted back to its textual
+representation via the call to writeVObject() or writeMemVObject()
+API. e.g.
+ a. to write to a file:
+ // assume vcard is of type VObject
+ FILE *fp = fopen("alden.vcf","w");
+ writeVObject(fp,vcard);
+ a. to write to memory, and let the API allocate the required memory.
+ char* clipboard = writeVObject(0,0,vcard);
+ ... do something to clipboard
+ free(clipboard);
+ b. to write to a user allocated buffer:
+ char clipboard[16384];
+ int len = 16384;
+ char *buf = writeVObject(clipboard,&len,vcard);
+ ... buf will be equal to clipboard if the write
+ is successful otherwise 0.
+
+In the case of writing to memory, the memory buffer can be either
+allocated by the API or the user. If the user allocate the
+memory for the buffer, then the length of the buffer needs to be
+communicated to the API via a variable. The variable passed as
+the length argument will be overwritten with the actual size
+of the text output. A 0 return value from writeMemVObject()
+indicates an error which could be caused by overflowing the
+size of the buffer or lack of heap memory.
+
+7. Miscellaneous Notes On VObject APIs usages
+ ==========================================
+a. vcc.h -- contains basic interfaces to the parser:
+ VObject* Parse_MIME(const char *input, unsigned long len);
+ VObject* Parse_MIME_FromFile(FILE *file);
+ -- both of this return a null-terminated list of
+ VObject that is either a VCARD or VCALENDAR.
+ To iterate through this list, do
+ VObject *t, *v;
+ v = Parse_Mime_FromFile(fp);
+ while (v) {
+ // ... do something to v.
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+ note that call to cleanVObject will release
+ resource used to represent the VObject.
+
+b. vobject.h -- contains basic interfaces to the VObject APIs.
+ see the header for more details.
+ The structure of VObject is purposely (hiddened) not exposed
+ to the user. Every access has to be done via
+ the APIs. This way, if we need to change the
+ structure or implementation, the client need not
+ recompile as long as the interfaces remain the
+ same.
+
+c. values of a property is determined by the property definition
+ itself. The vobject APIs does not attempt to enforce
+ any of such definition. It is the consumer's responsibility
+ to know what value is expected from a property. E.g.
+ most properties have unicode string value, so to access
+ the value of these type of properties, you will use
+ the vObjectUStringZValue() to read the value and
+ setVObjectUStringZValue() to set or modify the value.
+ Refer to the VCard and VCalendar specifications for
+ the definition of each property.
+
+d. properties name (id) are case insensitive.
+
+8. Brief descriptions of each APIs
+ ===============================
+ * the predefined properties' names (id) are listed under vobject.h
+ each is of the form VC*Prop. e.g.
+ #define VC7bitProp "7BIT"
+ #define VCAAlarmProp "AALARM"
+ ....
+
+ * consumer of a VObject can only define pointers to VObject.
+
+ * a variable of type VObjectIterator, say "i", can be used to iterate
+ through a VObject's properties, say "o". The APIs related to
+ VObjectIterator are:
+ void initPropIterator(VObjectIterator *i, VObject *o);
+ -- e.g. usage
+ initPropIterator(&i,o);
+ int moreIteration(VObjectIterator *i);
+ -- e.g. usage
+ while (moreIteration(&i)) { ... }
+ VObject* nextVObject(VObjectIterator *i);
+ -- e.g. usage
+ while (moreIteration(&i)) {
+ VObject *each = nextVObject(&i);
+ }
+
+ * VObject can be chained together to form a list. e.g. of such
+ use is in the parser where the return value of the parser is
+ a link list of VObject. A link list of VObject can be
+ built by:
+ void addList(VObject **o, VObject *p);
+ and iterated by
+ VObject* nextVObjectInList(VObject *o);
+ -- next VObjectInList return 0 if the list
+ is exhausted.
+
+ * the following APIs are mainly used to construct a VObject tree:
+ VObject* newVObject(const char *id);
+ -- used extensively internally by VObject APIs but when
+ used externally, its use is mainly limited to the
+ construction of top level object (e.g. an object
+ with VCCardProp or VCCalendarProp id).
+
+ void deleteVObject(VObject *p);
+ -- to deallocate single VObject, for most user, use
+ cleanVObject(VObject *o) instead for freeing all
+ resources associated with the VObject.
+
+ char* dupStr(const char *s, unsigned int size);
+ -- duplicate a string s. If size is 0, the string is
+ assume to be a null-terminated.
+
+ void deleteStr(const char *p);
+ -- used to deallocate a string allocated by dupStr();
+
+ void setVObjectName(VObject *o, const char* id);
+ -- set the id of VObject o. This function is not
+ normally used by the user. The setting of id
+ is normally done as part of other APIs (e.g.
+ addProp()).
+
+ void setVObjectStringZValue(VObject *o, const char *s);
+ -- set a string value of a VObject.
+
+ void setVObjectUStringZValue(VObject *o, const wchar_t *s);
+ -- set a Unicode string value of a VObject.
+
+ void setVObjectIntegerValue(VObject *o, unsigned int i);
+ -- set an integer value of a VObject.
+
+ void setVObjectLongValue(VObject *o, unsigned long l);
+ -- set an long integer value of a VObject.
+
+ void setVObjectAnyValue(VObject *o, void *t);
+ -- set any value of a VObject. The value type is
+ unspecified.
+
+ VObject* setValueWithSize(VObject *prop, void *val, unsigned int size);
+ -- set a raw data (stream of bytes) value of a VObject
+ whose size is size. The internal VObject representation
+ is
+ this object = val
+ VCDataSizeProp=size
+ i.e. the value val will be attached to the VObject prop
+ and a property of VCDataSize whose value is size
+ is also added to the object.
+
+ void setVObjectVObjectValue(VObject *o, VObject *p);
+ -- set a VObject as the value of another VObject.
+
+ const char* vObjectName(VObject *o);
+ -- retrieve the VObject's Name (i.e. id).
+
+ const char* vObjectStringZValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ null-terminated string.
+
+ const wchar_t* vObjectUStringZValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ null-terminated unicode string.
+
+ unsigned int vObjectIntegerValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ integer.
+
+ unsigned long vObjectLongValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ long integer.
+
+ void* vObjectAnyValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ any value.
+
+ VObject* vObjectVObjectValue(VObject *o);
+ -- retrieve the VObject's value interpreted as
+ a VObject.
+
+ VObject* addVObjectProp(VObject *o, VObject *p);
+ -- add a VObject p as a property of VObject o.
+ (not normally used externally for building a
+ VObject).
+
+ VObject* addProp(VObject *o, const char *id);
+ -- add a property whose name is id to VObject o.
+
+ VObject* addPropValue(VObject *o, const char *id, const char *v);
+ -- add a property whose name is id and whose value
+ is a null-terminated string to VObject o.
+
+ VObject* addPropSizedValue(VObject *o, const char *id,
+ const char *v, unsigned int size);
+ -- add a property whose name is id and whose value
+ is a stream of bytes of size size, to VObject o.
+
+ VObject* addGroup(VObject *o, const char *g);
+ -- add a group g to VObject o.
+ e.g. if g is a.b.c, you will have
+ o
+ c
+ VCGroupingProp=b
+ VCGroupingProp=a
+ and the object c is returned.
+
+ VObject* isAPropertyOf(VObject *o, const char *id);
+ -- query if a property by the name id is in o and
+ return the VObject that represent that property.
+
+ void printVObject(VObject *o);
+ -- pretty print VObject o to stdout (for debugging use).
+
+ void writeVObject(FILE *fp, VObject *o);
+ -- convert VObject o to its textual representation and
+ write it to file.
+
+ char* writeMemVObject(char *s, int *len, VObject *o);
+ -- convert VObject o to its textual representation and
+ write it to memory. If s is 0, then memory required
+ to hold the textual representation will be allocated
+ by this API. If a variable len is passed, len will
+ be overwritten with the byte size of the textual
+ representation. If s is non-zero, then s has to
+ be a user allocated buffer whose size has be passed
+ in len as a variable. Memory allocated by the API
+ has to be freed with call to free. The return value
+ of this API is either the user supplied buffer,
+ the memory allocated by the API, or 0 (in case of
+ failure).
+
+ void cleanStrTbl();
+ -- this function has to be called when all
+ VObject has been destroyed.
+
+ void cleanVObject(VObject *o);
+ -- release all resources used by VObject o.
+
+ wchar_t* fakeUnicode(const char *ps, int *bytes);
+ -- convert char* to wchar_t*.
+
+ extern int uStrLen(const wchar_t *u);
+ -- length of unicode u.
+
+ char *fakeCString(const wchar_t *u);
+ -- convert wchar_t to CString (blindly assumes that
+ this could be done).
+
+9. Additional Programming Notes
+ ============================
+In the following notes, please refers to the listing
+of Example.vcf and its VObject Representation
+(shown at the end of this section).
+
+* Handling the Return Value of the VCard/VCalendar Parser
+ The example input text file contains two root VObjects
+ (a VCalendar and a VCard). The output of the VCard/VCalendar
+ parser is a null-terminated list of VObjects. For this
+ particular input file, the list will have two VObjects.
+ The following shows a template for iterating through the
+ output of the Parser:
+
+ VObject *t, *v;
+ v = Parse_Mime_fromFileName("example.vcf");
+ while (v) {
+ // currently, v will either be a VCard or a VCalendar
+ // do whatever your application need to do to
+ // v here ...
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+
+* Iterating Through a VCard/VCalendar VObject
+ From the VObject APIs point of view, a VCard VObject
+ is the same as a VCalendar VObject. However, the application
+ needs to know what are in a VCard or a VCalendar.
+ For example, A VCalendar VObject can have VCDCreatedProp,
+ a VCGEOLocationProp, etc, and one or more VCEventProp and
+ or VCTodoProp. The VCEventProp and VCTodoProp can have
+ many properties of their own, which in turn could have
+ more properties (e.g. VCDAlarmProp can be a VCEventProp
+ VObject's property, and VCRunTimeProp can be a
+ VCDAlarmProp VObject's property. Because a VObject tree
+ can be arbitrarily complex, in general, to process all
+ properties and values of a VObject tree, a recursive walk
+ is desirable. An example recursive VObject tree walk
+ can be found in the vobject.c source lines for printVObject*
+ and writeVObject* APIs. Depending on what the application need
+ to do with a VCard or a VCalendar, a recursive walk
+ of the VObject tree may or may not be desirable. An example
+ template of a non-recursive walk is shown below:
+
+ void processVCardVCalendar(char *inputFile)
+ {
+ VObject *t, *v;
+ v = Parse_Mime_fromFileName(inputFile);
+ while (v) {
+ char *n = vObjectName(v);
+ if (strcmp(n,VCCardProp) == 0) {
+ do_VCard(v);
+ }
+ else if (strcmp(n,VCCalendarProp) == 0) {
+ do_VCalendar(v);
+ }
+ else {
+ // don't know how to handle anything else!
+ }
+ t = v;
+ v = nextVObjectInList(v);
+ cleanVObject(t);
+ }
+ }
+
+ void do_VCard(VObject *vcard)
+ {
+ VObjectIterator t;
+ initPropIterator(&t,vcard);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ // The primary purpose of this example is to
+ // show how to iterate through a VCard VObject,
+ // it is not meant to be efficient at all.
+ char *n = vObjectName(eachProp);
+ if (strcmp(n,VCNameProp)==0) {
+ do_name(eachProp);
+ }
+ else if (strcmp(n,VCEmailProp)==0) {
+ do_email(eachProp);
+ }
+ else if (strcmp(n,VCLabelProp)==0) {
+ do_label(eachProp);
+ }
+ else if ....
+ }
+ }
+
+ void do_VCalendar(VObject *vcal)
+ {
+ VObjectIterator t;
+ initPropIterator(&t,vcard);
+ while (moreIteration(&t)) {
+ VObject *eachProp = nextVObject(&t);
+ // The primary purpose of this example is to
+ // show how to iterate through a VCalendar VObject,
+ // it is not meant to be efficient at all.
+ char *n = vObjectName(eachProp);
+ if (strcmp(n,VCDCreatedProp)==0) {
+ do_DCreated(eachProp);
+ }
+ else if (strcmp(n,VCVersionProp)==0) {
+ do_Version(eachProp);
+ }
+ else if (strcmp(n,VCTodoProp)==0) {
+ do_Todo(eachProp);
+ }
+ else if (strcmp(n,VCEventProp)==0) {
+ do_Event(eachProp);
+ }
+ else if ....
+ }
+ }
+
+ void do_Todo(VObject *vtodo) { ... }
+
+ void do_Event(VObject *vevent) { ... }
+
+ ...
+
+* Property's Values and Properties
+ The VObject APIs do not attempt to check for the
+ correctness of the values of a property. Nor do they
+ will prevent the user from attaching a non-VCard/VCalendar
+ standard property to a VCard/VCalendar property. Take
+ the example of line [11] of the example, "O.K" is not
+ a valid value of VCStatusProp. It is up to the application
+ to accept or reject the value of a property.
+
+* Output of printVObject
+ PrintVObject pretty prints a VObject tree in human
+ readable form. See the listing at the end of the file
+ for an example output of printVObject on the example
+ input file "Example.vcf".
+
+ Note that binary data are not shown in the output of
+ printVObject. Instead, a note is made ([raw data]) to
+ indicate that there exists such a binary data.
+
+* Note on Binary Data
+ When the value of a property is a binary data, it is only
+ useful to know the size of the binary data.
+
+ In the case of the VCard/VCalendar parser, it chooses
+ to represent the size information as a separate property
+ called VCDataSizeProp whose value is the size of the binary
+ data. The APIs sequence to construct the VObject subtree
+ of line [44] of Example.vcf is
+
+ // VObject *vcard;
+ VObject *p1 = addProp(vcard,VCLogoProp);
+ (void) addProp(p1,VCGIFProp);
+ (void) addProp(p1,VCBASE64Prop);
+ VObject *p2 = addProp(p1,VCDataSizeProp);
+ (void) setVObjectLongValue(p2,1482);
+ setVObjectAnyValue(vcard,...pointer to binary data);
+
+ Note the presence of VCBase64Prop will cause the
+ writeVObject API to output the binary data as BASE64 text.
+ For VCard/VCalendar application, having the VCBase64Prop
+ property is practically always necessary for property with
+ binary data as its value.
+
+* Note on Quoted-Printable String
+ String value with embedded newline are written out as
+ quoted-prinatable string. It is therefore important
+ to mark a property with a string value that has
+ one or more embedded newlines, with the VCQutedPrintableProp
+ property. e.g.
+
+ // VObject *root;
+ char *msg="To be\nor\nnot to be";
+ VObject *p = addPropValue(root,VCDescriptionProp,msg);
+ // the following is how you mark a property with
+ // a property. In this case, the marker is
+ // VCQuotedPrintableProp
+ addProp(p,VCQuotedPrintableProp);
+
+* Note on Unicode
+ Although, the current parser takes ASCII text file only,
+ string values are all stored as Unicode in the VObject tree.
+ For now, when using the VObject APIs to construct a
+ VObject tree, one should always convert ASCII string value
+ to a Unicode string value:
+
+ // VObject *root;
+ VObject *p = addProp(root,VCSomeProp);
+ setVObjectUStringZValue(p,fakeUnicode(someASCIIStringZvalue));
+
+ An API is provided to simplify the above process:
+
+ addPropValue(root,VCSomeProp,someASCIIStringZValue);
+
+ Note that someASCIISTringZValue is automatically converted to
+ Unicode by addPropValue API, where as, the former code
+ sequence do an explicit call to fakeUnicode.
+
+ To read back the value, one should use the vObjectUStringZValue
+ API not vObjectStringZValue API. The value returned by the
+ vObjectUStringZValue API is a Unicode string. If the application
+ do not know how to handle Unicode string, it can use the
+ fakeCString API to convert it back to ASCII string (as long
+ as the conversion is meaningful).
+
+ Note that fakeCString return a heap allocated memory. It is
+ important to call deleteStr on fakeCString return value if
+ it is not longer required (or there will be memory leak).
+
+ NOTE: Unfortunately, at the point when this document is written,
+ there is still no consensus on how Unicode is to be handled
+ in the textual representation of VCard/VCalendar. So, there
+ is no version of writeVObject and the parser to output and
+ input Unicode textual representation of VCard/VCalendar.
+
+
+Example.vcf
+-----------
+line
+number Input Text (example.vcf)
+------ ----------
+1 BEGIN:VCALENDAR
+2 DCREATED:19961102T100522
+3 GEO:0,0
+4 VERSION:1.0
+5 BEGIN:VEVENT
+6 DTSTART:19961103T000000
+7 DTEND:20000101T000000
+8 DESCRIPTION;QUOTED-PRINTABLE:To be =0A=
+9 or =0A=
+10 not to be
+11 STATUS:O.K.
+12 X-ACTION:No action required
+13 DALARM:19961103T114500;5;3;Enjoy
+14 MALARM:19970101T120000;;;johny@nowhere.com;Call Mom.
+15 END:VEVENT
+16
+17 BEGIN:VTODO
+18 DUE:19960614T0173000
+19 DESCRIPTION:Relex.
+20 END:VTODO
+21
+22 END:VCALENDAR
+23
+24 BEGIN:VCARD
+25 N:Alden;Roland
+26 FN:Roland H. Alden
+27 ORG:AT&T;Versit Project Office
+28 TITLE:Consultant
+29 EMAIL;WORK;PREF;INTERNET:ralden@ralden.com
+30 LABEL;DOM;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+31 Suite 2208=0A=
+32 One Pine Street=0A=
+33 San Francisco, CA 94111
+34 LABEL;POSTAL;PARCEL;HOME;WORK;QUOTED-PRINTABLE:Roland H. Alden=0A=
+35 Suite 2208=0A=
+36 One Pine Street=0A=
+37 San Francisco, CA 94111=0A=
+38 U.S.A.
+39 TEL;WORK;PREF;MSG:+1 415 296 9106
+40 TEL;WORK;FAX:+1 415 296 9016
+41 TEL;MSG;CELL:+1 415 608 5981
+42 ADR:;Suite 2208;One Pine Street;San Francisco;CA;94111;U.S.A.
+43 SOUND:ROW-LAND H ALL-DIN
+44 LOGO;GIF;BASE64:
+45 R0lGODdhpgBOAMQAAP///+/v797e3s7Ozr29va2trZycnIyMjHt7e2NjY1JSUkJC
+ ... 30 lines of BASE64 data not shown here.
+76 END:VCARD
+
+
+VObject Representation of Example.vcf:
+-------------------------------------
+line
+in
+text
+file VObject Tree as Printed by printVObject API
+---- -------------------------------------------
+1 VCALENDAR
+2 DCREATED="19961102T100522"
+3 GEO="0,0"
+4 VERSION="1.0"
+5 VEVENT
+6 DTSTART="19961103T000000"
+7 DTEND="20000101T000000"
+8 DESCRIPTION="To be
+9 or
+10 not to be"
+8 QUOTED-PRINTABLE
+11 STATUS="O.K."
+12 X-ACTION="No action required"
+13 DALARM
+13 RUNTIME="19961103T114500"
+13 SNOOZETIME="5"
+13 REPEATCOUNT="3"
+13 DISPLAYSTRING="Enjoy"
+14 MALARM
+14 RUNTIME="19970101T120000"
+14 EMAIL="johny@nowhere.com"
+14 NOTE="Call Mom"
+17 VTODO
+18 DUE="19960614T0173000"
+19 DESCRIPTION="Relex."
+24 VCARD
+25 N
+25 F="Alden"
+25 G="Roland"
+26 FN="Roland H. Alden"
+27 ORG
+27 ORGNAME="AT&T"
+27 OUN="Versit Project Office"
+28 TITLE="Consultant"
+29 EMAIL="ralden@alden.com"
+29 WORK
+29 PREF
+29 INTERNET
+30 LABEL="Roland H. Alden
+31 Suite 2208
+32 One Pine Street
+33 San Francisco, CA 94111"
+30 DOM
+30 POSTAL
+30 PARCEL
+30 HOME
+30 WORK
+30 QUOTED-PRINTABLE
+34 LABEL="Roland H. Alden
+35 Suite 2208
+36 One Pine Street
+37 San Francisco, CA 94111
+38 U.S.A."
+34 POSTAL
+34 PARCEL
+34 HOME
+34 WORK
+34 QUOTED-PRINTABLE
+39 TEL="+1 415 296 9106"
+39 WORK
+39 PREF
+39 MSG
+40 TEL="+1 415 296 9016"
+40 WORK
+40 FAX
+41 TEL="+1 415 608 5981"
+41 MSG
+41 CELL
+42 ADR
+42 EXT ADD="Suite 2208"
+42 STREET="One Pine Street"
+42 L="San Francisco"
+42 R="CA"
+42 PC="94111"
+42 C="U.S.A."
+43 SOUND="ROW-LAND H ALL-DIN"
+44 LOGO=[raw data]
+44 GIF
+44 BASE64
+44 DATASIZE=1482
diff --git a/src/libicalvcal/icalvcal.c b/src/libicalvcal/icalvcal.c
index a4389603..01c32c6f 100644
--- a/src/libicalvcal/icalvcal.c
+++ b/src/libicalvcal/icalvcal.c
@@ -2,18 +2,9 @@
FILE: icalvcal.c
CREATOR: eric 25 May 00
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original code is icalvcal.c
@@ -118,11 +109,11 @@ static const char *get_string_value(VObject *object, int *free_string)
static void convert_floating_time_to_utc(struct icaltimetype *itt)
{
struct tm tmp_tm, utc_tm;
- time_t t;
+ icaltime_t t;
/* We assume the floating time is using the current Unix timezone.
- So we convert to a time_t using mktime(), and then back to a struct tm
- using gmtime, so it is the UTC time. */
+ So we convert to a icaltime_t using icalmktime(), and then back to a struct tm
+ using icalgmtime_r, so it is the UTC time. */
tmp_tm.tm_year = itt->year - 1900;
tmp_tm.tm_mon = itt->month - 1;
tmp_tm.tm_mday = itt->day;
@@ -131,11 +122,11 @@ static void convert_floating_time_to_utc(struct icaltimetype *itt)
tmp_tm.tm_sec = itt->second;
tmp_tm.tm_isdst = -1;
- /* Convert to a time_t. */
- t = mktime(&tmp_tm);
+ /* Convert to a icaltime_t. */
+ t = icalmktime(&tmp_tm);
/* Now convert back to a struct tm, but with a UTC time. */
- if (!gmtime_r(&t, &utc_tm)) {
+ if (!icalgmtime_r(&t, &utc_tm)) {
*itt = itt->is_date ? icaltime_null_date () : icaltime_null_time ();
return;
}
diff --git a/src/libicalvcal/icalvcal.h b/src/libicalvcal/icalvcal.h
index 4986d20d..17a8d9b6 100644
--- a/src/libicalvcal/icalvcal.h
+++ b/src/libicalvcal/icalvcal.h
@@ -2,18 +2,10 @@
FILE: icalvcal.h
CREATOR: eric 25 May 00
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef ICALVCAL_H
diff --git a/src/libicalvcal/libical_vcal_export.h b/src/libicalvcal/libical_vcal_export.h
index 0c744759..3404c28e 100644
--- a/src/libicalvcal/libical_vcal_export.h
+++ b/src/libicalvcal/libical_vcal_export.h
@@ -1,4 +1,9 @@
+/**
+ SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+*/
#ifndef LIBICAL_VCAL_EXPORT_H
+
#define LIBICAL_VCAL_EXPORT_H
#if !defined(S_SPLINT_S)
diff --git a/src/libicalvcal/vcaltmp.c b/src/libicalvcal/vcaltmp.c
index 2562665d..4cbabeed 100644
--- a/src/libicalvcal/vcaltmp.c
+++ b/src/libicalvcal/vcaltmp.c
@@ -14,36 +14,10 @@ Note on APIs:
*/
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
@@ -76,7 +50,6 @@ VObject* vcsCreateVCal(
return vcal;
}
-
VObject* vcsAddEvent(
VObject *vcal,
char *start_date_time,
@@ -111,7 +84,6 @@ VObject* vcsAddEvent(
return vevent;
}
-
VObject* vcsAddTodo(
VObject *vcal,
char *start_date_time,
@@ -146,7 +118,6 @@ VObject* vcsAddTodo(
return vtodo;
}
-
VObject* vcsAddAAlarm(
VObject *vevent,
char *run_time,
@@ -165,7 +136,6 @@ VObject* vcsAddAAlarm(
return aalarm;
}
-
VObject* vcsAddMAlarm(
VObject *vevent,
char *run_time,
@@ -186,7 +156,6 @@ VObject* vcsAddMAlarm(
return malarm;
}
-
VObject* vcsAddDAlarm(
VObject *vevent,
char *run_time,
@@ -205,7 +174,6 @@ VObject* vcsAddDAlarm(
return dalarm;
}
-
VObject* vcsAddPAlarm(
VObject *vevent,
char *run_time,
@@ -224,7 +192,6 @@ VObject* vcsAddPAlarm(
return palarm;
}
-
#ifdef _TEST
#if 0
@@ -333,5 +300,4 @@ void main() {
#endif
-
/* end of source file vcaltmp.c */
diff --git a/src/libicalvcal/vcaltmp.h b/src/libicalvcal/vcaltmp.h
index 4c1fe11e..69f9e82b 100644
--- a/src/libicalvcal/vcaltmp.h
+++ b/src/libicalvcal/vcaltmp.h
@@ -1,34 +1,8 @@
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
diff --git a/src/libicalvcal/vcc.c b/src/libicalvcal/vcc.c
index 6fe0a55e..41daa87a 100644
--- a/src/libicalvcal/vcc.c
+++ b/src/libicalvcal/vcc.c
@@ -100,36 +100,10 @@
#line 2 "vcc.y"
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
@@ -147,7 +121,6 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
* be fixed in vcc.y and this file regenerated.
*/
-
/* debugging utilities */
#ifdef __DEBUG
#define DBG_(x) printf x
@@ -191,7 +164,6 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
#define yyrule mime_rule
#define YYPREFIX "mime_"
-
#ifndef _NO_LINE_FOLDING
#define _SUPPORT_LINE_FOLDING 1
#endif
@@ -220,7 +192,6 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
#define MAXLEVEL 10 /* max # of nested objects parseable */
/* (includes outermost) */
-
/**** Global Variables ****/
int mime_lineNum, mime_numErrors; /* yyerror() can use these */
static VObject* vObjList;
@@ -229,7 +200,6 @@ static VObject *curObj;
static VObject* ObjStack[MAXLEVEL];
static int ObjStackTop;
-
/* A helpful utility for the rest of the app. */
#if defined(__CPLUSPLUS__)
extern "C" {
@@ -579,7 +549,6 @@ static int pushVObject(const char *prop)
return 1; /*TRUE*/
}
-
/* This pops the recently built vCard off the stack and returns it. */
static VObject* popVObject()
{
@@ -594,7 +563,6 @@ static VObject* popVObject()
return oldObj;
}
-
static void enterValues(const char *value)
{
if (fieldedProp && *fieldedProp) {
@@ -656,7 +624,6 @@ static void enterAttr(const char *s1, const char *s2)
deleteStr(s1); deleteStr(s2);
}
-
#define MAX_LEX_LOOKAHEAD_0 32
#define MAX_LEX_LOOKAHEAD 64
#define MAX_LEX_MODE_STACK_SIZE 10
@@ -744,7 +711,7 @@ static int lexGeta_(int i)
}
static void lexSkipLookahead() {
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=((char) EOF)) {
/* don't skip EOF. */
lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
lexBuf.len--;
@@ -779,7 +746,7 @@ static int lexLookahead() {
static int lexGetc() {
int c = lexLookahead();
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=((char) EOF)) {
/* EOF will remain in lookahead buffer */
lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
lexBuf.len--;
@@ -829,7 +796,7 @@ static char* lexGetWord() {
lexSkipWhite();
lexClearToken();
c = lexLookahead();
- while (c != EOF && !strchr("\t\n ;:=",c)) {
+ while (c != ((char) EOF) && !strchr("\t\n ;:=",c)) {
lexAppendc(c);
lexSkipLookahead();
c = lexLookahead();
@@ -841,7 +808,7 @@ static char* lexGetWord() {
static void lexPushLookaheadc(int c) {
int putptr;
/* can't putback EOF, because it never leaves lookahead buffer */
- if (c == EOF) return;
+ if (((char) c) == ((char) EOF)) return;
putptr = (int)lexBuf.getPtr - 1;
if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
lexBuf.getPtr = (unsigned long)putptr;
@@ -863,7 +830,7 @@ static char* lexLookaheadWord() {
while (len < (MAX_LEX_LOOKAHEAD_0)) {
c = lexGetc();
len++;
- if (c == EOF || strchr("\t\n ;:=", c)) {
+ if (c == ((char) EOF) || strchr("\t\n ;:=", c)) {
lexAppendc(0);
/* restore lookahead buf. */
lexBuf.len += len;
@@ -920,7 +887,7 @@ static char* lexGet1Value() {
lexSkipWhite();
c = lexLookahead();
lexClearToken();
- while (c != EOF && c != ';') {
+ while (c != ((char) EOF) && c != ';') {
if (c == '\n') {
int a;
lexSkipLookahead();
@@ -942,11 +909,10 @@ static char* lexGet1Value() {
}
lexAppendc(0);
handleMoreRFC822LineBreak(c);
- return c==EOF?0:lexStr();
+ return c==((char) EOF)?0:lexStr();
}
#endif
-
static int match_begin_name(int end) {
char *n = lexLookaheadWord();
int token = ID;
@@ -961,7 +927,6 @@ static int match_begin_name(int end) {
return 0;
}
-
#ifdef INCLUDEMFC
void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile)
#else
@@ -983,14 +948,18 @@ void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
lexBuf.maxToken = MAXTOKEN;
lexBuf.strs = (char*)malloc(MAXTOKEN);
lexBuf.strsLen = 0;
-
}
static void finiLex() {
+ VObject* vobj, *topobj = 0;
+ while(vobj = popVObject(), vobj) {
+ topobj = vobj;
+ }
+ if(topobj)
+ cleanVObject(topobj);
free(lexBuf.strs);
}
-
/* This parses and converts the base64 format for binary encoding into
* a decoded buffer (allocated with new). See RFC 1521.
*/
@@ -1036,9 +1005,9 @@ static char * lexGetDataFromBase64()
else if (oldBytes) free(oldBytes);
/* error recovery: skip until 2 adjacent newlines. */
DBG_(("db: invalid character 0x%x '%c'\n", c,c));
- if (c != EOF) {
+ if (c != ((char) EOF)) {
c = lexGetc();
- while (c != EOF) {
+ while (c != ((char) EOF)) {
if (c == '\n' && lexLookahead() == '\n') {
++mime_lineNum;
break;
@@ -1256,7 +1225,7 @@ int yylex() {
++mime_lineNum;
continue;
}
- case EOF: return 0;
+ case ((char) EOF): return 0;
break;
default: {
lexPushLookaheadc(c);
@@ -1286,7 +1255,6 @@ int yylex() {
return 0;
}
-
/***************************************************************************/
/*** Public Functions ****/
/***************************************************************************/
@@ -1298,9 +1266,12 @@ static VObject* Parse_MIMEHelper()
mime_lineNum = 1;
vObjList = 0;
curObj = 0;
+ curProp = 0;
- if (yyparse() != 0)
+ if (yyparse() != 0) {
+ finiLex();
return 0;
+ }
finiLex();
return vObjList;
@@ -1312,7 +1283,6 @@ VObject* Parse_MIME(const char *input, unsigned long len)
return Parse_MIMEHelper();
}
-
#ifdef INCLUDEMFC
VObject* Parse_MIME_FromFile(CFile *file)
@@ -1361,7 +1331,6 @@ VObject* Parse_MIME_FromFileName(const char *fname)
#endif
-
static MimeErrorHandler mimeErrorHandler;
void registerMimeErrorHandler(MimeErrorHandler me)
@@ -1658,7 +1627,6 @@ case 23:
#line 306 "vcc.y"
{
enterAttr(yystack.l_mark[-2].str,yystack.l_mark[0].str);
-
}
break;
case 25:
diff --git a/src/libicalvcal/vcc.h b/src/libicalvcal/vcc.h
index 5baf3115..d3a1f163 100644
--- a/src/libicalvcal/vcc.h
+++ b/src/libicalvcal/vcc.h
@@ -1,34 +1,8 @@
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
diff --git a/src/libicalvcal/vcc.y b/src/libicalvcal/vcc.y
index 97c50ec7..b4c81760 100644
--- a/src/libicalvcal/vcc.y
+++ b/src/libicalvcal/vcc.y
@@ -1,36 +1,10 @@
%{
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
@@ -572,7 +546,7 @@ static int lexGeta_(int i)
}
static void lexSkipLookahead() {
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=((char) EOF)) {
/* don't skip EOF. */
lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
lexBuf.len--;
@@ -607,7 +581,7 @@ static int lexLookahead() {
static int lexGetc() {
int c = lexLookahead();
- if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=EOF) {
+ if (lexBuf.len > 0 && lexBuf.buf[lexBuf.getPtr]!=((char) EOF)) {
/* EOF will remain in lookahead buffer */
lexBuf.getPtr = (lexBuf.getPtr + 1) % MAX_LEX_LOOKAHEAD;
lexBuf.len--;
@@ -657,7 +631,7 @@ static char* lexGetWord() {
lexSkipWhite();
lexClearToken();
c = lexLookahead();
- while (c != EOF && !strchr("\t\n ;:=",c)) {
+ while (c != ((char) EOF) && !strchr("\t\n ;:=",c)) {
lexAppendc(c);
lexSkipLookahead();
c = lexLookahead();
@@ -669,7 +643,7 @@ static char* lexGetWord() {
static void lexPushLookaheadc(int c) {
int putptr;
/* can't putback EOF, because it never leaves lookahead buffer */
- if (c == EOF) return;
+ if (((char) c) == ((char) EOF)) return;
putptr = (int)lexBuf.getPtr - 1;
if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD;
lexBuf.getPtr = (unsigned long)putptr;
@@ -691,7 +665,7 @@ static char* lexLookaheadWord() {
while (len < (MAX_LEX_LOOKAHEAD_0)) {
c = lexGetc();
len++;
- if (c == EOF || strchr("\t\n ;:=", c)) {
+ if (c == ((char) EOF) || strchr("\t\n ;:=", c)) {
lexAppendc(0);
/* restore lookahead buf. */
lexBuf.len += len;
@@ -748,7 +722,7 @@ static char* lexGet1Value() {
lexSkipWhite();
c = lexLookahead();
lexClearToken();
- while (c != EOF && c != ';') {
+ while (c != ((char) EOF) && c != ';') {
if (c == '\n') {
int a;
lexSkipLookahead();
@@ -770,7 +744,7 @@ static char* lexGet1Value() {
}
lexAppendc(0);
handleMoreRFC822LineBreak(c);
- return c==EOF?0:lexStr();
+ return c==((char) EOF)?0:lexStr();
}
#endif
@@ -815,6 +789,10 @@ void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile)
}
static void finiLex() {
+ VObject* vobj;
+ while(vobj = popVObject(), vobj) {
+ cleanVObject(vobj);
+ }
free(lexBuf.strs);
}
@@ -864,9 +842,9 @@ static char * lexGetDataFromBase64()
else if (oldBytes) free(oldBytes);
/* error recovery: skip until 2 adjacent newlines. */
DBG_(("db: invalid character 0x%x '%c'\n", c,c));
- if (c != EOF) {
+ if (c != ((char) EOF)) {
c = lexGetc();
- while (c != EOF) {
+ while (c != ((char) EOF)) {
if (c == '\n' && lexLookahead() == '\n') {
++mime_lineNum;
break;
@@ -1084,7 +1062,7 @@ int yylex() {
++mime_lineNum;
continue;
}
- case EOF: return 0;
+ case ((char) EOF): return 0;
break;
default: {
lexPushLookaheadc(c);
@@ -1126,9 +1104,12 @@ static VObject* Parse_MIMEHelper()
mime_lineNum = 1;
vObjList = 0;
curObj = 0;
+ curProp = 0;
- if (yyparse() != 0)
+ if (yyparse() != 0) {
+ finiLex();
return 0;
+ }
finiLex();
return vObjList;
diff --git a/src/libicalvcal/vobject.c b/src/libicalvcal/vobject.c
index 10d0cf5a..9b2484fe 100644
--- a/src/libicalvcal/vobject.c
+++ b/src/libicalvcal/vobject.c
@@ -1,34 +1,8 @@
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
@@ -84,8 +58,6 @@ struct StrItem {
const char** fieldedProp;
-
-
/*----------------------------------------------------------------------
The following functions involve with memory allocation:
newVObject
@@ -144,7 +116,6 @@ void deleteStr(const char *p)
free((void*)p);
}
-
static StrItem* newStrItem(const char *s, StrItem *next)
{
StrItem *p = (StrItem*)malloc(sizeof(StrItem));
@@ -160,7 +131,6 @@ static void deleteStrItem(StrItem *p)
free((void*)p);
}
-
/*----------------------------------------------------------------------
The following function provide accesses to VObject's value.
----------------------------------------------------------------------*/
@@ -259,7 +229,6 @@ int vObjectValueType(VObject *o)
return (int)VALUE_TYPE(o);
}
-
/*----------------------------------------------------------------------
The following functions can be used to build VObject.
----------------------------------------------------------------------*/
@@ -457,8 +426,6 @@ VObject* addPropSizedValue(VObject *o, const char *p, const char *v,
return addPropSizedValue_(o,p,dupStr(v,size),size);
}
-
-
/*----------------------------------------------------------------------
The following pretty print a VObject
----------------------------------------------------------------------*/
@@ -698,7 +665,6 @@ void cleanStrTbl()
}
}
-
struct PreDefProp {
const char *name;
const char *alias;
@@ -937,7 +903,6 @@ static const struct PreDefProp propNames[] = {
{ 0,0,0,0 }
};
-
static const struct PreDefProp* lookupPropInfo(const char* str)
{
/* brute force for now, could use a hash table here. */
@@ -951,7 +916,6 @@ static const struct PreDefProp* lookupPropInfo(const char* str)
return 0;
}
-
const char* lookupProp_(const char* str)
{
int i;
@@ -965,7 +929,6 @@ const char* lookupProp_(const char* str)
return lookupStr(str);
}
-
const char* lookupProp(const char* str)
{
int i;
@@ -981,7 +944,6 @@ const char* lookupProp(const char* str)
return lookupStr(str);
}
-
/*----------------------------------------------------------------------
APIs to Output text form.
----------------------------------------------------------------------*/
@@ -1116,7 +1078,6 @@ static void initMemOFile(OFile *fp, char *s, int len)
fp->fail = 0;
}
-
static int writeBase64(OFile *fp, unsigned char *s, long len)
{
long cur = 0;
@@ -1190,8 +1151,6 @@ static void writeQPString(OFile *fp, const char *s)
}
}
-
-
static void writeVObject_(OFile *fp, VObject *o);
static void writeValue(OFile *fp, VObject *o, unsigned long size,int quote)
diff --git a/src/libicalvcal/vobject.h b/src/libicalvcal/vobject.h
index 7541be58..72cbc58f 100644
--- a/src/libicalvcal/vobject.h
+++ b/src/libicalvcal/vobject.h
@@ -1,34 +1,8 @@
/***************************************************************************
-(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
+SPDX-FileCopyrightText: 1996 Apple Computer, Inc., AT&T Corp., International
Business Machines Corporation and Siemens Rolm Communications Inc.
-For purposes of this license notice, the term Licensors shall mean,
-collectively, Apple Computer, Inc., AT&T Corp., International
-Business Machines Corporation and Siemens Rolm Communications Inc.
-The term Licensor shall mean any of the Licensors.
-
-Subject to acceptance of the following conditions, permission is hereby
-granted by Licensors without the need for written agreement and without
-license or royalty fees, to use, copy, modify and distribute this
-software for any purpose.
-
-The above copyright notice and the following four paragraphs must be
-reproduced in all copies of this software and any software including
-this software.
-
-THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS AND NO LICENSOR SHALL HAVE
-ANY OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR
-MODIFICATIONS.
-
-IN NO EVENT SHALL ANY LICENSOR BE LIABLE TO ANY PARTY FOR DIRECT,
-INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
-OF THE USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGE.
-
-EACH LICENSOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO ANY WARRANTY OF NONINFRINGEMENT OR THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.
+SPDX-License-Identifier: LicenseRef-APPLEMIT
The software is provided with RESTRICTED RIGHTS. Use, duplication, or
disclosure by the government are subject to restrictions set forth in
diff --git a/src/php/Makefile b/src/php/Makefile
index f371a382..7eab507e 100644
--- a/src/php/Makefile
+++ b/src/php/Makefile
@@ -1,13 +1,16 @@
+# SPDX-FileCopyrightText: Copyright Contributors to the libical project
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
all: LibicalWrap.so
LibicalWrap.so: LibicalWrap.o
- gcc -shared -L/usr/lib -rdynamic LibicalWrap.o ../libical/.libs/libical.a ../libicalss/.libs/libicalss.a -o LibicalWrap.so
+ gcc -shared -L/usr/lib -rdynamic LibicalWrap.o ../libical/.libs/libical.a ../libicalss/.libs/libicalss.a -o LibicalWrap.so
LibicalWrap.o: LibicalWrap.c
gcc -fpic -I/usr/include/php4/TSRM/ -I/usr/include/php4/ -I/usr/include/php4/Zend -I/usr/include/php4/main -c LibicalWrap.c -o LibicalWrap.o
LibicalWrap.c: LibicalWrap.i
- swig -php -o LibicalWrap.c LibicalWrap.i
+ swig -php -o LibicalWrap.c LibicalWrap.i
clean:
rm LibicalWrap.so LibicalWrap.o LibicalWrap.c
diff --git a/src/php/README b/src/php/README.txt
index 15088204..15088204 100644
--- a/src/php/README
+++ b/src/php/README.txt
diff --git a/src/php/test.php b/src/php/test.php
index 98ee7c8d..648e1dcd 100644
--- a/src/php/test.php
+++ b/src/php/test.php
@@ -1,5 +1,8 @@
<?php
+// SPDX-FileCopyrightText: Copyright Contributors to the libical project
+// SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
// '../../../../' is a dirty hack to be able to store LibicalWrap.so in my
// homedir instead of in the machine-global directory
diff --git a/src/python/Attendee.py b/src/python/Attendee.py
index ed6fde46..349433f1 100644
--- a/src/python/Attendee.py
+++ b/src/python/Attendee.py
@@ -3,31 +3,19 @@
# FILE: Property.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import *
diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt
index a5a593c3..24b9ba71 100644
--- a/src/python/CMakeLists.txt
+++ b/src/python/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
include_directories(
${CMAKE_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/src/libical
@@ -21,4 +24,3 @@ set_target_properties(LibicalWrap PROPERTIES
install(TARGETS LibicalWrap DESTINATION lib)
########### install files ###############
-
diff --git a/src/python/ChangeLog b/src/python/ChangeLog
index 1912df17..4cc5e099 100644
--- a/src/python/ChangeLog
+++ b/src/python/ChangeLog
@@ -3,19 +3,19 @@
* Component.py Added Calendar class.
* Componeny.py Changed all component constructor so they cannot
- take string arguments. Now, only NewComponent() can turn an iCal
- string into a component.
+ take string arguments. Now, only NewComponent() can turn an iCal
+ string into a component.
2001-04-02 Eric Busboom <eric@civicknowledge.com>
* Component.py removed arguments from the Event constructor, since
- I presume that the Component derived classes will always be
- constructed with no arguments.
+ I presume that the Component derived classes will always be
+ constructed with no arguments.
* Property.py Split out Attendee, Organizer, Time, Duration and
- Period into their own files. Moved remaining classes to Derived
- Properties.pm
+ Period into their own files. Moved remaining classes to Derived
+ Properties.pm
2001-03-13 Eric Busboom <eric@civicknowledge.com>
@@ -42,10 +42,10 @@
2001-03-05 Eric Busboom <eric@civicknowledge.com>
* Property.py Added a lot of exception code to signal failure to
- create a Property.
+ create a Property.
* DerivedProperties.py Added derived property classes for RDATE
- and TRIGGER, two properties that can have one of two value types.
+ and TRIGGER, two properties that can have one of two value types.
2001-03-04 Eric Busboom <eric@civicknowledge.com>
@@ -53,7 +53,7 @@
* Property.pm Added Property.ConstructorFailedError exception
* Component.pm fixed bug in Collection.__setslice__. "," used
- instead of ":"
+ instead of ":"
2001-03-04 Patrick Lewis <plewis@inetarena.com>
@@ -80,23 +80,23 @@
* Property Added __del__
* Component Component.properties() now caches properties that it
- constructs, so two calls to properties() to that get the same
- icalproperty will also get the same Property.
+ constructs, so two calls to properties() to that get the same
+ icalproperty will also get the same Property.
* Property Added Property.__cmp__ to test equality of properties
- based on ical string values
+ based on ical string values
2001-02-27 Eric Busboom <eric@civicknowledge.com>
* Property Added Property.ref() to set/get the reference to the
- Property's internal icalproperty
+ Property's internal icalproperty
* Property Property._update_value now changes the icalproperty
- value if a reference has been set.
+ value if a reference has been set.
* Component re-instituted Component.properties(). The routine now
- adds a 'ref' key to the dict that holds the python pointer
- string. The C hex value of the pointer is in the 'pid' key
+ adds a 'ref' key to the dict that holds the python pointer
+ string. The C hex value of the pointer is in the 'pid' key
2001-02-27 Patrick Lewis <plewis@inetarena.com>
@@ -117,10 +117,10 @@
* Libical.py Added test routine for time, time_test()
* Libical.py Remove end of line chars ('\r\n" ) from
- Property._str__. Caller should add these lines itself
+ Property._str__. Caller should add these lines itself
* Liical.py CHanges Time._update_values to set time VALUE type
- based on use of is_date, rather than length of string.
+ based on use of is_date, rather than length of string.
* Libical.py Removed call to _update_value in TIme::timezone
diff --git a/src/python/Collection.py b/src/python/Collection.py
index 15ae8b7e..1e911dc9 100644
--- a/src/python/Collection.py
+++ b/src/python/Collection.py
@@ -3,19 +3,13 @@
# FILE: Collection.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from types import *
diff --git a/src/python/Component.py b/src/python/Component.py
index 598e4977..91043905 100644
--- a/src/python/Component.py
+++ b/src/python/Component.py
@@ -3,30 +3,10 @@
# FILE: Component.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
-#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
-#
-# Or:
-#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
-
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
-#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-#
-# Or:
-#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#======================================================================
from LibicalWrap import *
diff --git a/src/python/DerivedProperties.py b/src/python/DerivedProperties.py
index 3a64f96f..879163d5 100644
--- a/src/python/DerivedProperties.py
+++ b/src/python/DerivedProperties.py
@@ -3,19 +3,13 @@
# FILE: DerivedProperties.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from Property import Property
diff --git a/src/python/Duration.py b/src/python/Duration.py
index 8997f59d..95260e03 100644
--- a/src/python/Duration.py
+++ b/src/python/Duration.py
@@ -3,19 +3,13 @@
# FILE: Duration.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#===============================================================
from LibicalWrap import *
diff --git a/src/python/Error.py b/src/python/Error.py
index 47fa0e7a..9104344b 100644
--- a/src/python/Error.py
+++ b/src/python/Error.py
@@ -2,31 +2,19 @@
# FILE: Error.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#===========================================================
class LibicalError(Exception):
diff --git a/src/python/Gauge.py b/src/python/Gauge.py
index 44954006..abfa1c77 100644
--- a/src/python/Gauge.py
+++ b/src/python/Gauge.py
@@ -3,19 +3,13 @@
# FILE: Gauge.py
# CREATOR: mtearle
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import *
diff --git a/src/python/Libical.py b/src/python/Libical.py
index 20a2b975..ff4d7e18 100644
--- a/src/python/Libical.py
+++ b/src/python/Libical.py
@@ -3,19 +3,13 @@
# FILE: Libical.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import ICAL_PACKAGE, ICAL_VERSION
diff --git a/src/python/LibicalWrap.i b/src/python/LibicalWrap.i
index 070a6d5b..a0970428 100644
--- a/src/python/LibicalWrap.i
+++ b/src/python/LibicalWrap.i
@@ -2,17 +2,9 @@
/*======================================================================
FILE: ical.i
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- https://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
diff --git a/src/python/LibicalWrap_icaltime.i b/src/python/LibicalWrap_icaltime.i
index f82a7706..ada94293 100644
--- a/src/python/LibicalWrap_icaltime.i
+++ b/src/python/LibicalWrap_icaltime.i
@@ -2,17 +2,9 @@
/*======================================================================
FILE: LibicalWrap_icaltime.i
- (C) COPYRIGHT 2010 Glenn Washburn
+ SPDX-FileCopyrightText: 2010 Glenn Washburn
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- https://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Glenn Washburn (crass@berlios.de)
@@ -193,4 +185,3 @@ _swig_set_properties(icaltimetype, icaltimetype_props)
%}
// TODO: Add icaltime_span_* to icaltime_spantype
-
diff --git a/src/python/LibicalWrap_icaltimezone.i b/src/python/LibicalWrap_icaltimezone.i
index 320369cd..68f25219 100644
--- a/src/python/LibicalWrap_icaltimezone.i
+++ b/src/python/LibicalWrap_icaltimezone.i
@@ -2,17 +2,9 @@
/*======================================================================
FILE: LibicalWrap_icaltimezone.i
- (C) COPYRIGHT 2010 Glenn Washburn
+ SPDX-FileCopyrightText: 2010 Glenn Washburn
- The contents of this file are subject to the Mozilla Public License
- Version 1.0 (the "License"); you may not use this file except in
- compliance with the License. You may obtain a copy of the License at
- https://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and
- limitations under the License.
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Glenn Washburn (crass@berlios.de)
diff --git a/src/python/Period.py b/src/python/Period.py
index 60c2f304..c5ed6b20 100644
--- a/src/python/Period.py
+++ b/src/python/Period.py
@@ -3,19 +3,13 @@
# FILE: Period.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#===========================================================
from LibicalWrap import *
diff --git a/src/python/Property.py b/src/python/Property.py
index 430b37aa..4d060e14 100644
--- a/src/python/Property.py
+++ b/src/python/Property.py
@@ -3,19 +3,13 @@
# FILE: Property.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import *
diff --git a/src/python/Store.py b/src/python/Store.py
index 8c6662a2..de47289a 100644
--- a/src/python/Store.py
+++ b/src/python/Store.py
@@ -3,19 +3,13 @@
# FILE: Store.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import *
diff --git a/src/python/Time.py b/src/python/Time.py
index f94770ce..1d20b8bd 100644
--- a/src/python/Time.py
+++ b/src/python/Time.py
@@ -3,19 +3,13 @@
# FILE: Time.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from LibicalWrap import *
diff --git a/src/python/__init__.py b/src/python/__init__.py
index 0f399441..1fdaee4b 100644
--- a/src/python/__init__.py
+++ b/src/python/__init__.py
@@ -3,19 +3,13 @@
# FILE: __init__.py
# CREATOR: glenn
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
from Libical import *
diff --git a/src/python/test.py b/src/python/test.py
index 2de1fe61..cb4e83ad 100644
--- a/src/python/test.py
+++ b/src/python/test.py
@@ -3,19 +3,13 @@
# FILE: test.py
# CREATOR: eric
#
-# (C) COPYRIGHT 2001, Eric Busboom <eric@civicknowledge.com>
-# (C) COPYRIGHT 2001, Patrick Lewis <plewis@inetarena.com>
+# SPDX-FileCopyrightText: 2001, Eric Busboom <eric@civicknowledge.com>
+# SPDX-FileCopyrightText: 2001, Patrick Lewis <plewis@inetarena.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#======================================================================
import LibicalWrap
diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt
index 9e008c86..fa0bcf9b 100644
--- a/src/test/CMakeLists.txt
+++ b/src/test/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
include_directories(
${CMAKE_BINARY_DIR}
${CMAKE_SOURCE_DIR}/src
@@ -20,6 +23,7 @@ set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR})
set(TEST_DATADIR "\"${CMAKE_SOURCE_DIR}/test-data\"")
add_definitions(-DTEST_DATADIR=${TEST_DATADIR} -DTEST_ZONEDIR="${CMAKE_SOURCE_DIR}/zoneinfo")
+# Set properties for the test
macro(setprops _name)
if(UNIX)
set_tests_properties(${_name} PROPERTIES
@@ -61,7 +65,9 @@ macro(buildme _name _srcs)
target_link_libraries(${_name} ical_cxx icalss_cxx)
endif()
- target_link_libraries(${_name} ${CMAKE_THREAD_LIBS_INIT})
+ if(DEFINED CMAKE_THREAD_LIBS_INIT)
+ target_link_libraries(${_name} ${CMAKE_THREAD_LIBS_INIT})
+ endif()
if(ICU_FOUND)
target_link_libraries(${_name} ${ICU_LIBRARIES})
endif()
@@ -70,6 +76,7 @@ macro(buildme _name _srcs)
endif()
endmacro()
+# Build the test and add the test, making sure the test properties are set
macro(testme _name _srcs)
buildme(${_name} "${_srcs}")
add_test(NAME ${_name} COMMAND ${_name})
@@ -96,6 +103,8 @@ set(regression_SRCS
regression-utils.c
regression-recur.c
regression-storage.c
+ test-malloc.c
+ test-malloc.h
)
if(WITH_CXX_BINDINGS)
list(APPEND regression_SRCS regression-cxx.cpp)
@@ -108,10 +117,10 @@ set(parser_SRCS icaltestparser.c)
buildme(parser "${parser_SRCS}")
file(GLOB TEST_FILES ${CMAKE_SOURCE_DIR}/test-data/*.ics)
-foreach(TEST_FILE ${TEST_FILES})
- get_filename_component(TEST_NAME ${TEST_FILE} NAME_WE)
- add_test(NAME parser-${TEST_NAME} COMMAND parser ${TEST_FILE})
- setprops(parser-${TEST_NAME})
+foreach(test_file ${TEST_FILES})
+ get_filename_component(test_name ${test_file} NAME_WE)
+ add_test(NAME parser-${test_name} COMMAND parser ${test_file})
+ setprops(parser-${test_name})
endforeach()
########### next target ###############
@@ -177,7 +186,8 @@ if(NOT ${CMAKE_VERSION} VERSION_LESS 3.14)
set(CMAKE_COMPARE_FILES_IGNORE_EOL TRUE)
endif()
if(NOT WIN32 OR CMAKE_COMPARE_FILES_IGNORE_EOL)
- if(NOT CYGWIN AND NOT USE_32BIT_TIME_T) #ignore_eol doesn't work on Cygwin. tests for years greater than 2037 will fail
+ #ignore_eol doesn't work on Cygwin. testing years greater than 2037 will fail
+ if(NOT CYGWIN AND NOT USE_32BIT_TIME_T)
set(icalrecurtest_SRCS icalrecur_test.c)
add_executable(icalrecurtest ${icalrecurtest_SRCS})
target_link_libraries(icalrecurtest ical icalss icalvcal)
diff --git a/src/test/builtin_timezones.c b/src/test/builtin_timezones.c
index 3ceb462d..334b683a 100644
--- a/src/test/builtin_timezones.c
+++ b/src/test/builtin_timezones.c
@@ -2,18 +2,10 @@
FILE: builtin_timezones.c
CREATOR: Milan Crha 26 November 2014
- (C) COPYRIGHT 2014 Milan Crha <mcrha@redhat.com>
+ SPDX-FileCopyrightText: 2014 Milan Crha <mcrha@redhat.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/test/copycluster.c b/src/test/copycluster.c
index 282d0fc4..05961252 100644
--- a/src/test/copycluster.c
+++ b/src/test/copycluster.c
@@ -2,18 +2,9 @@
FILE: copycluster.c
CREATOR: eric 15 January 2000
- (C) COPYRIGHT 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/test/icalattach-leak.c b/src/test/icalattach-leak.c
index d91aa398..3740742c 100644
--- a/src/test/icalattach-leak.c
+++ b/src/test/icalattach-leak.c
@@ -1,18 +1,9 @@
/*======================================================================
FILE: icalattach-leak.c
- Copyright (C) 2019 Red Hat, Inc. <www.redhat.com>
+ SPDX-FileCopyrightText: 2019 Red Hat, Inc. <www.redhat.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Milan Crha
======================================================================*/
@@ -23,9 +14,7 @@
#include <stdio.h>
-#define LIBICAL_GLIB_UNSTABLE_API
#include "libical-glib/libical-glib.h"
-#undef LIBICAL_GLIB_UNSTABLE_API
static GSList *get_attachments(ICalComponent *comp)
{
diff --git a/src/test/icalrecur_test.c b/src/test/icalrecur_test.c
index 3b1f0ceb..a236848d 100644
--- a/src/test/icalrecur_test.c
+++ b/src/test/icalrecur_test.c
@@ -2,18 +2,10 @@
FILE: icalrecur_test.c
CREATOR: Ken Murchison 26 September 2014
- (C) COPYRIGHT 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
/*
@@ -670,7 +662,7 @@ int main(int argc, char *argv[])
}
icalrecur_iterator_free(ritr);
- free(rrule.rscale);
+ icalmemory_free_buffer(rrule.rscale);
}
fclose(fp);
diff --git a/src/test/icaltestparser.c b/src/test/icaltestparser.c
index c301a74f..c3a27abf 100644
--- a/src/test/icaltestparser.c
+++ b/src/test/icaltestparser.c
@@ -2,18 +2,9 @@
FILE: icaltestparser.c
CREATOR: eric 20 June 1999
- (C) COPYRIGHT 1999 The Software Studio <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 The Software Studio <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
======================================================================*/
diff --git a/src/test/icaltm_test.c b/src/test/icaltm_test.c
index 141d49e4..b3ccad34 100644
--- a/src/test/icaltm_test.c
+++ b/src/test/icaltm_test.c
@@ -1,18 +1,9 @@
/*======================================================================
FILE: icaltm_test.c
- Copyright (C) 2017 Red Hat, Inc. <www.redhat.com>
+ SPDX-FileCopyrightText: 2017 Red Hat, Inc. <www.redhat.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Milan Crha
======================================================================*/
diff --git a/src/test/libical-glib/CMakeLists.txt b/src/test/libical-glib/CMakeLists.txt
index 4d239dba..2f88b115 100644
--- a/src/test/libical-glib/CMakeLists.txt
+++ b/src/test/libical-glib/CMakeLists.txt
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Milan Crha <mcrha@redhat.com>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
find_program(PYTHON3 python3)
set_package_properties(PYTHON3 PROPERTIES TYPE REQUIRED PURPOSE "Required by the libical build system.")
add_feature_info("libical-glib testing" PYTHON3 "python3 is required to run the regression tests")
@@ -19,9 +22,22 @@ list(APPEND TEST_FILES
)
if(PYTHON3)
+ set(GI_TYPELIB_PATH_STR "${CMAKE_BINARY_DIR}/src/libical-glib")
+ if(DEFINED GI_TYPELIB_PATH)
+ if($ENV{GI_TYPELIB_PATH})
+ set(GI_TYPELIB_PATH_STR "${GI_TYPELIB_PATH_STR}:$ENV{GI_TYPELIB_PATH}")
+ endif()
+ endif()
+ set(LD_LIBRARY_PATH_STR "${LIBRARY_OUTPUT_PATH}")
+ if(DEFINED LD_LIBRARY_PATH)
+ if($ENV{LD_LIBRARY_PATH})
+ set(LD_LIBRARY_PATH_STR "${LD_LIBRARY_PATH_STR}:$ENV{LD_LIBRARY_PATH}")
+ endif()
+ endif()
+
list(APPEND test_env
- "GI_TYPELIB_PATH=${CMAKE_BINARY_DIR}/src/libical-glib;$ENV{GI_TYPELIB_PATH}"
- "LD_LIBRARY_PATH=${LIBRARY_OUTPUT_PATH};$ENV{LD_LIBRARY_PATH}"
+ "GI_TYPELIB_PATH=${GI_TYPELIB_PATH_STR}"
+ "LD_LIBRARY_PATH=${LD_LIBRARY_PATH_STR}"
"ZONEINFO_DIRECTORY=${CMAKE_SOURCE_DIR}/zoneinfo"
)
diff --git a/src/test/libical-glib/array.py b/src/test/libical-glib/array.py
index 77d9550a..da3b26b2 100755..100644
--- a/src/test/libical-glib/array.py
+++ b/src/test/libical-glib/array.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/attach.py b/src/test/libical-glib/attach.py
index 4a5492ac..7bcb5583 100755..100644
--- a/src/test/libical-glib/attach.py
+++ b/src/test/libical-glib/attach.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/component.py b/src/test/libical-glib/component.py
index cbdb097e..13d6b104 100755..100644
--- a/src/test/libical-glib/component.py
+++ b/src/test/libical-glib/component.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
@@ -183,25 +177,21 @@ def main():
#Traverse with external API.
iter = parent.begin_component(ICalGLib.ComponentKind.VEVENT_COMPONENT);
child_component = iter.deref();
- child_component.set_owner(parent);
for i in range(0, count):
prefix = "test"
index = i+2;
assert(child_component.get_summary() == prefix + str(index));
if (i != count-1):
child_component = iter.next();
- child_component.set_owner(parent);
iter = parent.end_component(ICalGLib.ComponentKind.VEVENT_COMPONENT);
child_component = iter.prior();
- child_component.set_owner(parent);
for i in range(0, count):
prefix = "test"
index = count + 1 - i;
assert(child_component.get_summary() == prefix + str(index));
if (i != count - 1):
child_component = iter.prior();
- child_component.set_owner(parent);
#Traverse and remove with external API.
iter = parent.begin_component(ICalGLib.ComponentKind.VEVENT_COMPONENT);
diff --git a/src/test/libical-glib/comprehensive.py b/src/test/libical-glib/comprehensive.py
index 94fdfb6f..4f3fe629 100755..100644
--- a/src/test/libical-glib/comprehensive.py
+++ b/src/test/libical-glib/comprehensive.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/duration.py b/src/test/libical-glib/duration.py
index 114970ad..b6a1ac78 100755..100644
--- a/src/test/libical-glib/duration.py
+++ b/src/test/libical-glib/duration.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/error.py b/src/test/libical-glib/error.py
index e501a984..e64de32a 100755..100644
--- a/src/test/libical-glib/error.py
+++ b/src/test/libical-glib/error.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/misc.py b/src/test/libical-glib/misc.py
index d10648b8..2cb59d44 100755..100644
--- a/src/test/libical-glib/misc.py
+++ b/src/test/libical-glib/misc.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2019 Red Hat Inc. <www.redhat.com>
+# SPDX-FileCopyrightText: 2019 Red Hat Inc. <www.redhat.com>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/parameter.py b/src/test/libical-glib/parameter.py
index 5a0c6230..33cea40a 100755..100644
--- a/src/test/libical-glib/parameter.py
+++ b/src/test/libical-glib/parameter.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/period.py b/src/test/libical-glib/period.py
index bcc49706..1791a34d 100755..100644
--- a/src/test/libical-glib/period.py
+++ b/src/test/libical-glib/period.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/property.py b/src/test/libical-glib/property.py
index 23de9b5d..ee78467e 100755..100644
--- a/src/test/libical-glib/property.py
+++ b/src/test/libical-glib/property.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/recurrence.py b/src/test/libical-glib/recurrence.py
index c136224b..d00910ff 100755..100644
--- a/src/test/libical-glib/recurrence.py
+++ b/src/test/libical-glib/recurrence.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/timezone.py b/src/test/libical-glib/timezone.py
index ec027a1b..88fb6b01 100755..100644
--- a/src/test/libical-glib/timezone.py
+++ b/src/test/libical-glib/timezone.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/libical-glib/value.py b/src/test/libical-glib/value.py
index 7be64644..0cebbb7b 100755..100644
--- a/src/test/libical-glib/value.py
+++ b/src/test/libical-glib/value.py
@@ -3,18 +3,12 @@
###############################################################################
#
-# Copyright (C) 2015 William Yu <williamyu@gnome.org>
+# SPDX-FileCopyrightText: 2015 William Yu <williamyu@gnome.org>
#
-# This library is free software; you can redistribute it and/or modify
-# it under the terms of either:
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
#
-# The LGPL as published by the Free Software Foundation, version
-# 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.txt
#
-# Or:
#
-# The Mozilla Public License Version 2.0. You may obtain a copy of
-# the License at https://www.mozilla.org/MPL/
#
###############################################################################
diff --git a/src/test/process.c b/src/test/process.c
index db609b27..f2816154 100644
--- a/src/test/process.c
+++ b/src/test/process.c
@@ -2,18 +2,10 @@
FILE: process.c
CREATOR: eric 11 February 2000
- (C) COPYRIGHT 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/test/recur.c b/src/test/recur.c
index 01552802..014ede09 100644
--- a/src/test/recur.c
+++ b/src/test/recur.c
@@ -2,7 +2,7 @@
FILE: recur.c
CREATOR: ebusboom 8jun00
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
DESCRIPTION:
@@ -10,16 +10,8 @@
./recur ../../test-data/recur.txt
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -45,8 +37,8 @@ static void recur_callback(icalcomponent *comp, struct icaltime_span *span, void
{
_unused(comp);
_unused(data);
- printf("cb: %s", ctime(&span->start));
- printf(" %s\n", ctime(&span->end));
+ printf("cb: %s", icalctime(&span->start));
+ printf(" %s\n", icalctime(&span->end));
}
int main(int argc, char *argv[])
@@ -57,7 +49,7 @@ int main(int argc, char *argv[])
icalproperty *desc, *dtstart, *rrule;
struct icalrecurrencetype recur;
icalrecur_iterator *ritr;
- time_t tt;
+ icaltime_t tt;
const char *file;
icalerror_set_error_state(ICAL_PARSE_ERROR, ICAL_ERROR_NONFATAL);
@@ -114,7 +106,7 @@ int main(int argc, char *argv[])
tt = icaltime_as_timet(start);
- printf("#### %s\n", ctime(&tt));
+ printf("#### %s\n", icalctime(&tt));
icalrecur_iterator_free(ritr);
@@ -123,7 +115,7 @@ int main(int argc, char *argv[])
!icaltime_is_null_time(next);
next = icalrecur_iterator_next(ritr)) {
tt = icaltime_as_timet(next);
- printf(" %s", ctime(&tt));
+ printf(" %s", icalctime(&tt));
}
icalrecur_iterator_free(ritr);
diff --git a/src/test/regression-classify.c b/src/test/regression-classify.c
index 7e5d4aa7..a5f3af0c 100644
--- a/src/test/regression-classify.c
+++ b/src/test/regression-classify.c
@@ -1,18 +1,10 @@
/*======================================================================
FILE: regression-classify.c
- Copyright (C) 2002 Paul Lindner <lindner@users.sf.net>
+ SPDX-FileCopyrightText: 2002 Paul Lindner <lindner@users.sf.net>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
diff --git a/src/test/regression-component.c b/src/test/regression-component.c
index 3e147e9e..388c53a4 100644
--- a/src/test/regression-component.c
+++ b/src/test/regression-component.c
@@ -1,18 +1,9 @@
/*======================================================================
FILE: regression-component.c
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
======================================================================*/
@@ -310,9 +301,9 @@ static void print_span(int c, struct icaltime_span span)
*/
void test_icalcomponent_get_span()
{
- time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
+ icaltime_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
Sat Nov 4 15:00:00 PST 2000 */
- time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
+ icaltime_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
Sat Nov 4 16:00:00 PST 2000 */
struct icaldurationtype dur;
struct icaltime_span span;
@@ -321,7 +312,7 @@ void test_icalcomponent_get_span()
int tnum = 0;
/** test 0
- * Direct assigning time_t means they will be interpreted as UTC
+ * Direct assigning icaltime_t means they will be interpreted as UTC
*/
span.start = tm1;
span.end = tm2;
@@ -448,7 +439,7 @@ void test_icalcomponent_get_span()
if (VERBOSE)
print_span(tnum++, span);
- int_is("null span", (int)span.start, 0);
+ int_is("start == end", (int)span.start, (int)span.end);
icalcomponent_free(c);
/** test 7
diff --git a/src/test/regression-cxx.cpp b/src/test/regression-cxx.cpp
index 6bb33b3a..dbe3ae49 100644
--- a/src/test/regression-cxx.cpp
+++ b/src/test/regression-cxx.cpp
@@ -1,16 +1,8 @@
/**
- (C) COPYRIGHT 2001, Critical Path
+ SPDX-FileCopyrightText: 2001, Critical Path
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
*/
#ifdef HAVE_CONFIG_H
diff --git a/src/test/regression-recur.c b/src/test/regression-recur.c
index e11112e6..dee65679 100644
--- a/src/test/regression-recur.c
+++ b/src/test/regression-recur.c
@@ -2,20 +2,12 @@
FILE: regression-recur.c
CREATOR: ebusboom 8jun00
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
DESCRIPTION:
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifdef HAVE_CONFIG_H
@@ -69,8 +61,8 @@ static void recur_callback(icalcomponent *comp, struct icaltime_span *span, void
_unused(comp);
if (VERBOSE) {
- printf("recur: %s", ctime(&span->start));
- printf(" %s", ctime(&span->end));
+ printf("recur: %s", icalctime(&span->start));
+ printf(" %s", icalctime(&span->end));
}
*num_recurs = *num_recurs + 1;
}
@@ -83,7 +75,7 @@ void test_recur_file()
icalproperty *desc, *dtstart, *rrule;
struct icalrecurrencetype recur;
icalrecur_iterator *ritr;
- time_t tt;
+ icaltime_t tt;
const char *file;
int num_recurs_found = 0;
icalfileset_options options = { O_RDONLY, 0644, 0, NULL };
@@ -147,7 +139,7 @@ void test_recur_file()
tt = icaltime_as_timet(start);
if (VERBOSE)
- printf("#### %s\n", ctime(&tt));
+ printf("#### %s\n", icalctime(&tt));
icalrecur_iterator_free(ritr);
@@ -157,7 +149,7 @@ void test_recur_file()
next = icalrecur_iterator_next(ritr)) {
tt = icaltime_as_timet(next);
if (VERBOSE)
- printf(" %s", ctime(&tt));
+ printf(" %s", icalctime(&tt));
}
icalrecur_iterator_free(ritr);
diff --git a/src/test/regression-storage.c b/src/test/regression-storage.c
index f8cd11e1..b3c1f98d 100644
--- a/src/test/regression-storage.c
+++ b/src/test/regression-storage.c
@@ -2,20 +2,11 @@
FILE: regression-storage.c
CREATOR: eric 03 April 1999
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
DESCRIPTION:
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
The original code is usecases.c
diff --git a/src/test/regression-utils.c b/src/test/regression-utils.c
index 431cef85..3536f0ad 100644
--- a/src/test/regression-utils.c
+++ b/src/test/regression-utils.c
@@ -1,18 +1,9 @@
/*======================================================================
FILE: regression-utils.c
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
======================================================================*/
@@ -23,6 +14,9 @@
#include "libical/ical.h"
+#include "test-malloc.h"
+#include "regression.h"
+
#include <stdlib.h>
int QUIET = 0;
@@ -30,12 +24,12 @@ int VERBOSE = 1;
static char ictt_str[1024];
-const char *ical_timet_string(const time_t t)
+const char *ical_timet_string(const icaltime_t t)
{
struct tm tmp, stm;
memset(&tmp, 0, sizeof(tmp));
- if (gmtime_r(&t, &tmp)) {
+ if (icalgmtime_r(&t, &tmp)) {
stm = tmp;
} else {
memset(&stm, 0, sizeof(stm));
@@ -68,10 +62,10 @@ const char *ictt_as_string(struct icaltimetype t)
char *icaltime_as_ctime(struct icaltimetype t)
{
- time_t tt;
+ icaltime_t tt;
tt = icaltime_as_timet(t);
- snprintf(ictt_str, sizeof(ictt_str), "%s", ctime(&tt));
+ snprintf(ictt_str, sizeof(ictt_str), "%s", icalctime(&tt));
return ictt_str;
}
@@ -93,7 +87,7 @@ void die_on_errors_set(int val)
die_on_errors = val;
}
-void _ok(const char *test_name, int success, char *file, int linenum, const char *test)
+void _ok(const char *test_name, int success, const char *file, int linenum, const char *test)
{
testnumber++;
@@ -114,7 +108,7 @@ void _ok(const char *test_name, int success, char *file, int linenum, const char
}
}
-void _is(const char *test_name, const char *str1, const char *str2, char *file, int linenum)
+void _is(const char *test_name, const char *str1, const char *str2, const char *file, int linenum)
{
int diff;
@@ -135,7 +129,7 @@ void _is(const char *test_name, const char *str1, const char *str2, char *file,
}
}
-void _int_is(char *test_name, int i1, int i2, char *file, int linenum)
+void _int_is(const char *test_name, int i1, int i2, const char *file, int linenum)
{
_ok(test_name, (i1 == i2), file, linenum, "");
@@ -196,7 +190,6 @@ int test_end(void)
printf("%s%d/%d ", prefix, this_set, failed_tests[i].test);
}
printf("\n");
-
} else {
printf("\n All Tests Successful.\n");
}
@@ -204,6 +197,24 @@ int test_end(void)
return failed;
}
+/**
+ * Bring all memory that is allocated as side effect into a stable state, so we can calculate
+ * stable memory allocation statistics.
+ */
+static void cleanup_nondeterministic_memory() {
+
+ // icalerrno_return() allocates a buffer on it's first use per thread. Let's allocate it
+ // now, so it doesn't disturb our test statistics.
+ icalerrno_return();
+
+ // Built-in timezones are cached by libical. By freeing them, they don't influence our statistics.
+ icaltimezone_free_builtin_timezones();
+
+ // Memory that was added to the ring buffer is not required to be freed by the caller, so
+ // we free it here to keep our statistics clean.
+ icalmemory_free_ring();
+}
+
void test_run(const char *test_name, void (*test_fcn) (void), int do_test, int headeronly)
{
static int test_set = 1;
@@ -212,7 +223,29 @@ void test_run(const char *test_name, void (*test_fcn) (void), int do_test, int h
test_header(test_name, test_set);
if (!headeronly && (do_test == 0 || do_test == test_set)) {
+
+ struct testmalloc_statistics mem_statistics;
+
+ // Clean up cached and other kind of non-deterministic memory.
+ cleanup_nondeterministic_memory();
+
+ // Now that we are in a stable state, reset the memory statistics and start counting.
+ testmalloc_reset();
+
+ // Run the test.
(*test_fcn) ();
+
+ // Before getting the statistics, clean up any non-deterministic memory again, so it
+ // doesn't influence the statistics.
+ cleanup_nondeterministic_memory();
+
+ // Now we should get clean statistics.
+ testmalloc_get_statistics(&mem_statistics);
+
+ ok("no memory leaked",
+ (mem_statistics.mem_allocated_current == 0) &&
+ (mem_statistics.blocks_allocated == 0));
+
if (!QUIET)
printf("\n");
}
diff --git a/src/test/regression.c b/src/test/regression.c
index 2b94dc1c..da3ba9af 100644
--- a/src/test/regression.c
+++ b/src/test/regression.c
@@ -2,18 +2,9 @@
FILE: regression.c
CREATOR: eric 03 April 1999
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The original author is Eric Busboom
The original code is regression.c
@@ -27,6 +18,7 @@
#include "regression.h"
#include "libical/astime.h"
+#include "test-malloc.h"
#include "libical/ical.h"
#include "libicalss/icalss.h"
#include "libicalvcal/icalvcal.h"
@@ -806,7 +798,7 @@ void test_memory()
ok("final buffer size == 806", (bufsize == 806));
- free(f);
+ icalmemory_free_buffer(f);
bufsize = 4;
@@ -895,7 +887,7 @@ void test_memory()
if (VERBOSE)
printf("Char-by-Char buffer: %s\n", f);
- free(f);
+ icalmemory_free_buffer(f);
for (i = 0; i < 100; i++) {
f = icalmemory_tmp_buffer(bufsize);
@@ -1145,7 +1137,15 @@ void test_restriction()
icalproperty_vanew_dtend(atime,
icalparameter_new_tzid("America/New_York"),
(void *)0),
- icalproperty_new_location("1CP Conference Room 4350"), (void *)0), (void *)0);
+ icalproperty_new_location("1CP Conference Room 4350"),
+ icalcomponent_vanew(ICAL_VALARM_COMPONENT,
+ icalproperty_new_action(ICAL_ACTION_EMAIL),
+ icalproperty_new_repeat(0),
+ icalcomponent_vanew(ICAL_VLOCATION_COMPONENT,
+ (void *)0),
+ (void *)0),
+ (void *)0),
+ (void *)0);
valid = icalrestriction_check(comp);
@@ -1217,17 +1217,17 @@ void print_occur(struct icalrecurrencetype recur, struct icaltimetype start)
struct icaltimetype next;
icalrecur_iterator *ritr;
- time_t tt = icaltime_as_timet(start);
+ icaltime_t tt = icaltime_as_timet(start);
printf("#### %s\n", icalrecurrencetype_as_string(&recur));
- printf("#### %s\n", ctime(&tt));
+ printf("#### %s\n", icalctime(&tt));
ritr = icalrecur_iterator_new(recur, start);
for (next = icalrecur_iterator_next(ritr);
!icaltime_is_null_time(next);
next = icalrecur_iterator_next(ritr)) {
tt = icaltime_as_timet(next);
- printf(" %s", ctime(&tt));
+ printf(" %s", icalctime(&tt));
}
icalrecur_iterator_free(ritr);
@@ -1237,7 +1237,7 @@ void test_recur()
{
struct icalrecurrencetype rt;
struct icaltimetype start;
- time_t array[25];
+ icaltime_t array[25];
int i;
rt = icalrecurrencetype_from_string(
@@ -1258,7 +1258,7 @@ void test_recur()
for (i = 0; i < 25 && array[i] != 0; i++) {
if (VERBOSE) {
- printf(" %s", ctime(&(array[i])));
+ printf(" %s", icalctime(&(array[i])));
}
}
/* test_increment();*/
@@ -1350,19 +1350,19 @@ void test_recur_encode_by_month()
void test_expand_recurrence()
{
- time_t arr[10];
- time_t now = 931057385;
+ icaltime_t arr[10];
+ icaltime_t now = 931057385;
int i, numfound = 0;
icalrecur_expand_recurrence("FREQ=MONTHLY;BYDAY=MO,WE", now, 5, arr);
if (VERBOSE)
- printf("Start %s", ctime(&now));
+ printf("Start %s", icalctime(&now));
for (i = 0; i < 5; i++) {
numfound++;
if (VERBOSE)
- printf("i=%d %s\n", i, ctime(&arr[i]));
+ printf("i=%d %s\n", i, icalctime(&arr[i]));
}
int_is("Get an array of 5 items", numfound, 5);
}
@@ -1391,7 +1391,7 @@ void icalrecurrencetype_test()
struct icalrecurrencetype r = icalvalue_get_recur(v);
struct icaltimetype t = icaltime_from_timet_with_zone(time(0), 0, NULL);
struct icaltimetype next;
- time_t tt;
+ icaltime_t tt;
struct icalrecur_iterator_impl *itr =
(struct icalrecur_iterator_impl *)icalrecur_iterator_new(r, t);
@@ -1401,7 +1401,7 @@ void icalrecurrencetype_test()
next = icalrecur_iterator_next(itr);
tt = icaltime_as_timet(next);
- printf("%s", ctime(&tt));
+ printf("%s", icalctime(&tt));
} while (!icaltime_is_null_time(next));
@@ -1767,8 +1767,8 @@ void do_test_time(const char *zone)
{
struct icaltimetype ictt, icttutc, icttzone, icttdayl,
icttla, icttny, icttphoenix, icttlocal, icttnorm;
- time_t tt, tt2, tt_p200;
- time_t offset_tz;
+ icaltime_t tt, tt2, tt_p200;
+ icaltime_t offset_tz;
icalvalue *v;
short day_of_week, start_day_of_week, day_of_year;
icaltimezone *azone, *utczone;
@@ -1781,7 +1781,7 @@ void do_test_time(const char *zone)
/* Test new API */
if (VERBOSE) {
- printf("\n---> From time_t \n");
+ printf("\n---> From icaltime_t \n");
}
tt = 1025127869; /* stick with a constant... Wed, 26 Jun 2002 21:44:29 GMT */
@@ -1791,7 +1791,7 @@ void do_test_time(const char *zone)
}
ictt = icaltime_from_timet_with_zone(tt, 0, NULL);
- str_is("Floating time from time_t", ictt_as_string(ictt), "2002-06-26 21:44:29 (floating)");
+ str_is("Floating time from icaltime_t", ictt_as_string(ictt), "2002-06-26 21:44:29 (floating)");
ictt = icaltime_from_timet_with_zone(tt, 0, azone);
#if ADD_TESTS_REQUIRING_INVESTIGATION
@@ -1869,7 +1869,7 @@ void do_test_time(const char *zone)
tt = icaltime_as_timet(ictt);
- ok("test icaltime -> time_t for 20001103T183030Z", (tt == 973276230));
+ ok("test icaltime -> icaltime_t for 20001103T183030Z", (tt == 973276230));
/* Fri Nov 3 10:30:30 PST 2000 in PST
Fri Nov 3 18:30:30 PST 2000 in UTC */
@@ -1894,7 +1894,7 @@ void do_test_time(const char *zone)
/** add test case here.. **/
if (VERBOSE) {
- printf("\n As time_t \n");
+ printf("\n As icaltime_t \n");
}
tt2 = icaltime_as_timet(ictt);
@@ -1914,7 +1914,7 @@ void do_test_time(const char *zone)
printf("20001103T183030 : %s\n", ictt_as_string(icttlocal));
}
- offset_tz = (time_t) (-icaltimezone_get_utc_offset_of_utc_time(azone, &ictt, 0));
+ offset_tz = (icaltime_t) (-icaltimezone_get_utc_offset_of_utc_time(azone, &ictt, 0));
if (VERBOSE)
printf("offset_tz : %ld\n", (long)offset_tz);
@@ -2012,7 +2012,7 @@ void do_test_time(const char *zone)
icaltimezone_get_builtin_timezone("America/Phoenix"));
if (VERBOSE) {
- printf("Orig (ctime): %s\n", ical_timet_string(tt));
+ printf("Orig (icalctime): %s\n", ical_timet_string(tt));
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("UTC : %s\n", ictt_as_string(icttutc));
printf("Los Angeles : %s\n", ictt_as_string(icttla));
@@ -2025,7 +2025,7 @@ void do_test_time(const char *zone)
if (VERBOSE) {
printf("\n Daylight Savings \n");
- printf("Orig (ctime): %s\n", ical_timet_string(tt));
+ printf("Orig (icalctime): %s\n", ical_timet_string(tt));
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("NY : %s\n", ictt_as_string(icttny));
}
@@ -2053,7 +2053,7 @@ void do_test_time(const char *zone)
icaltimezone_get_builtin_timezone("America/Los_Angeles"));
if (VERBOSE) {
- printf("\nOrig (ctime): %s\n", ical_timet_string(tt));
+ printf("\nOrig (icalctime): %s\n", ical_timet_string(tt));
printf("Orig (ical) : %s\n", ictt_as_string(ictt));
printf("LA : %s\n", ictt_as_string(icttla));
}
@@ -2270,12 +2270,12 @@ void test_overlaps()
{
icalcomponent *cset, *c;
icalset *set;
- time_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
+ icaltime_t tm1 = 973378800; /*Sat Nov 4 23:00:00 UTC 2000,
Sat Nov 4 15:00:00 PST 2000 */
- time_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
+ icaltime_t tm2 = 973382400; /*Sat Nov 5 00:00:00 UTC 2000
Sat Nov 4 16:00:00 PST 2000 */
- time_t hh = 1800; /* one half hour */
+ icaltime_t hh = 1800; /* one half hour */
icalfileset_options options = { O_RDONLY, 0644, 0, NULL };
set = icalset_new(ICAL_FILE_SET, TEST_DATADIR "/overlaps.ics", &options);
@@ -2722,16 +2722,14 @@ void test_recur_parser()
rt = icalrecurrencetype_from_string(str);
icalerror_restore("MALFORMEDDATA", es);
ok(str, rt.freq == ICAL_NO_RECURRENCE);
- free(v);
+ icalmemory_free_buffer(v);
}
-
static int test_juldat_caldat_instance(long year, int month, int day) {
struct icaltimetype t;
struct ut_instant originalInstant;
-
memset(&t, 0, sizeof(t));
t.year = year;
t.month = month;
@@ -2808,7 +2806,6 @@ void test_juldat_caldat() {
ok("juldat and caldat return the expected values for random input values", failed == 0);
}
-
char *ical_strstr(const char *haystack, const char *needle)
{
return strstr(haystack, needle);
@@ -2872,7 +2869,7 @@ void test_doy()
stm.tm_year = tt1.year - 1900;
stm.tm_isdst = -1;
- (void)mktime(&stm);
+ (void)icalmktime(&stm);
doy = icaltime_day_of_year(tt1);
@@ -4252,6 +4249,8 @@ void test_vcal(void)
if (comp) {
icalcomponent_free(comp);
}
+
+ cleanVObject(vcal);
}
}
@@ -4378,6 +4377,50 @@ void test_comma_in_quoted_value(void)
icalcomponent_free(c);
}
+void test_geo_props(void)
+{
+ int estate;
+ icalcomponent *c;
+ icalproperty *p;
+
+ c = icalparser_parse_string("BEGIN:VEVENT\n" "GEO:49.42612;7.75473\n" "END:VEVENT\n");
+ ok("icalparser_parse_string()", (c != NULL));
+ if (!c) {
+ exit(EXIT_FAILURE);
+ }
+ if (VERBOSE)
+ printf("%s", icalcomponent_as_ical_string(c));
+ p = icalcomponent_get_first_property(c, ICAL_GEO_PROPERTY);
+ str_is("icalproperty_get_value_as_string() works",
+ icalproperty_get_value_as_string(p), "49.42612;7.75473");
+ icalcomponent_free(c);
+
+ c = icalparser_parse_string("BEGIN:VEVENT\n" "GEO:-0;+0\n" "END:VEVENT\n");
+ ok("icalparser_parse_string()", (c != NULL));
+ if (!c) {
+ exit(EXIT_FAILURE);
+ }
+ if (VERBOSE)
+ printf("%s", icalcomponent_as_ical_string(c));
+ p = icalcomponent_get_first_property(c, ICAL_GEO_PROPERTY);
+ str_is("icalproperty_get_value_as_string() works",
+ icalproperty_get_value_as_string(p), "-0;+0");
+ icalcomponent_free(c);
+
+ estate = icalerror_get_errors_are_fatal();
+ icalerror_set_errors_are_fatal(0);
+ c = icalparser_parse_string("BEGIN:VEVENT\n" "GEO:-0a;+0\n" "END:VEVENT\n");
+ if (!c) {
+ exit(EXIT_FAILURE);
+ }
+ if (VERBOSE)
+ printf("%s", icalcomponent_as_ical_string(c));
+ p = icalcomponent_get_first_property(c, ICAL_GEO_PROPERTY);
+ ok("expected fail icalcomponent_get_first_property()", (p == NULL));
+ icalcomponent_free(c);
+ icalerror_set_errors_are_fatal(estate);
+}
+
void test_zoneinfo_stuff(void)
{
#if defined(HAVE_SETENV)
@@ -4621,7 +4664,7 @@ void test_timezone_from_builtin(void)
icaltimezone *zone;
struct icaltimetype dtstart, dtend, due;
char *strcomp, *tzidprefix, *prevslash = NULL, *prevprevslash = NULL, *p;
- int len;
+ size_t len;
zone = icaltimezone_get_builtin_timezone("America/New_York");
tzidprefix = strdup(icaltimezone_get_tzid (zone));
@@ -4662,7 +4705,7 @@ void test_timezone_from_builtin(void)
comp = icaltimezone_get_component(zone);
strcomp = icalcomponent_as_ical_string_r(comp);
comp = icalcomponent_new_from_string(strcomp);
- free(strcomp);
+ icalmemory_free_buffer(strcomp);
ok("VTIMEZONE icalcomponent_new_from_string()", (comp != NULL));
@@ -4877,6 +4920,308 @@ static void test_builtin_compat_tzid (void)
icaltimezone_free_builtin_timezones();
}
+static void test_vcc_vcard_parse(void)
+{
+ /* Two VCARD-s, because some arches can parse the first and some the second. */
+ const char *vcard1 =
+ "BEGIN:VCARD\r\n"
+ "VERSION:3.0\r\n"
+ "NOTE:\r\n"
+ "FN:Xxxx\r\n"
+ "N:;Xxxx;;;\r\n"
+ "END:VCARD";
+ const char *vcard2 =
+ "BEGIN:VCARD\r\n"
+ "VERSION:3.0\r\n"
+ "X-XXX-ORIGINAL-VCARD:\r\n"
+ "X-XXX-KIND:XX_XXXXXXXX\r\n"
+ "NOTE:\r\n"
+ "X-XXXXXXXXX-FILE-AS:Xxxxxx\r\n"
+ "FN:Xxxxxx\r\n"
+ "N:;Xxxxxx;;;\r\n"
+ "X-XXX-XXXXXXXXX:\r\n"
+ "END:VCARD";
+ const char *vcalendar =
+ "BEGIN:VCALENDAR\r\n"
+ "BEGIN:VEVENT\r\n"
+ "UID:123\r\n"
+ "SUMMARY:Summary\r\n"
+ "DTSTAMP:20210803T063522Z\r\n"
+ "DTSTART;VALUE=DATE:20210902\r\n"
+ "END:VEVENT\r\n"
+ "END:VCALENDAR\r\n";
+ const char *vcalendar_broken =
+ "BEGIN:VCALENDAR\r\n"
+ "BEGIN:VTIMEZONE\r\n"
+ "TZID:tz/id\r\n"
+ "BEGIN:STANDARD\r\n"
+ "TZNAME:PMT\r\n"
+ "TZOFFSETFROM:+005744\r\n"
+ "TZOFFSETTO:+005744\r\n"
+ "DTSTART:18500101T000000\r\n"
+ "END:STANDARD\r\n"
+ "BEGIN:STANDARD\r\n"
+ "TZNAME:CET\r\n"
+ "TZOFFSETFROM:+005744\r\n"
+ "TZOFFSETTO:+0100\r\n"
+ "DTSTART:18911001T000000\r\n"
+ "END:STANDARD\r\n"
+ "BEGIN:DAYLIGHT\r\n"
+ "TZNAME:CEST\r\n"
+ "TZOFFSETFROM:+0100\r\n"
+ "TZOFFSETTO:+0200\r\n"
+ "DTSTART:19160430T230000\r\n"
+ "END:DAYLIGHT\r\n"
+ "END:VTIMEZONE\r\n"
+ "BEGIN:VEVENT\r\n"
+ "UID:321\r\n"
+ "SUMMARY:Summary\r\n"
+ "DTSTAMP:20210803T063522Z\r\n"
+ "DTSTART;VALUE=DATE:20210902\r\n"
+ "END:VEVENT\r\n"
+ "BEGIN:VEVENT\r\n"
+ "UID:123\r\n"
+ "DTSTAMP:20210803T063522Z\r\n"
+ "DTSTART;VALUE=DATE:20210902\r\n"
+ "BEGIN:VALARM\r\n"
+ "ACTION:DISPLAY\r\n"
+ "TRIGGER:-PT15M\r\n"
+ "END:VALARM\r\n"
+ "DESCRIPTION:aaa \r\n"
+ "\r\n"
+ " aaa\\naaa 1\\n \r\n"
+ "SUMMARY:Summary\r\n"
+ "END:VEVENT\r\n"
+ "END:VCALENDAR\r\n";
+ VObject *vcal;
+
+ vcal = Parse_MIME(vcard1, (unsigned long)strlen(vcard1));
+ if(vcal) {
+ icalcomponent *icalcomp;
+
+ icalcomp = icalvcal_convert(vcal);
+ ok("vCard1 is not iCalendar", (icalcomp == NULL));
+ if(icalcomp)
+ icalcomponent_free(icalcomp);
+
+ cleanVObject (vcal);
+ } else {
+ ok("vCard1 cannot be parsed", (vcal == NULL));
+ }
+
+ vcal = Parse_MIME(vcard2, (unsigned long)strlen(vcard2));
+ if(vcal) {
+ icalcomponent *icalcomp;
+
+ icalcomp = icalvcal_convert(vcal);
+ ok("vCard2 is not iCalendar", (icalcomp == NULL));
+ if(icalcomp)
+ icalcomponent_free(icalcomp);
+
+ cleanVObject(vcal);
+ } else {
+ ok("vCard2 cannot be parsed", (vcal == NULL));
+ }
+
+ vcal = Parse_MIME(vcalendar, (unsigned long)strlen(vcalendar));
+ ok("vCalendar can be parsed", (vcal != NULL));
+ if(vcal) {
+ icalcomponent *icalcomp;
+
+ icalcomp = icalvcal_convert(vcal);
+ ok("vCalendar can be converted", (icalcomp != NULL));
+ if(icalcomp) {
+ icalcomponent *child;
+
+ ok("vCalendar is VCALENDAR", (icalcomponent_isa(icalcomp) == ICAL_VCALENDAR_COMPONENT));
+ ok("vCalendar has one child", (icalcomponent_count_components(icalcomp, ICAL_ANY_COMPONENT) == 1));
+ child = icalcomponent_get_inner(icalcomp);
+ ok("vCalendar has inner comp", (child != NULL && child != icalcomp));
+ ok("vCalendar child is VEVENT", (icalcomponent_isa(child) == ICAL_VEVENT_COMPONENT));
+ ok("vCalendar child UID matches", (strcmp(icalcomponent_get_uid(child), "123") == 0));
+ ok("vCalendar child SUMMARY matches", (strcmp(icalcomponent_get_summary(child), "Summary") == 0));
+ icalcomponent_free(icalcomp);
+ }
+
+ cleanVObject(vcal);
+ }
+
+ vcal = Parse_MIME(vcalendar_broken, (unsigned long)strlen(vcalendar_broken));
+ ok("vCalendar-broken cannot be parsed", (vcal == NULL));
+}
+
+static void test_implicit_dtend_duration(void)
+{
+ const struct icaltimetype start1 = icaltime_from_string("20220108");
+ icalcomponent* c = icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VEVENT_COMPONENT,
+ icalproperty_vanew_dtstart(start1, 0),
+ 0),
+ 0);
+ struct icaldurationtype d = icalcomponent_get_duration(c);
+ struct icaltimetype end = icalcomponent_get_dtend(c),
+ start = icaltime_from_string("20220108T101010Z");
+ if (VERBOSE) {
+ printf("%s\n", icaldurationtype_as_ical_string(d));
+ }
+ str_is("icaldurationtype_as_ical_string(d)", "P1D", icaldurationtype_as_ical_string(d));
+
+ if (VERBOSE) {
+ printf("%s\n", icaltime_as_ical_string(end));
+ }
+ str_is("icaltime_as_ical_string(end)", "20220109", icaltime_as_ical_string(end));
+
+ icalcomponent_set_dtstart(c, start);
+ d = icalcomponent_get_duration(c);
+ end = icalcomponent_get_dtend(c);
+ if (VERBOSE) {
+ printf("%s\n", icaldurationtype_as_ical_string(d));
+ }
+ int_is("icaldurationtype_as_int(d)", 0, icaldurationtype_as_int(d));
+
+ if (VERBOSE) {
+ printf("%s\n", icaltime_as_ical_string(end));
+ }
+ int_is("icaltime_compare(start, end)", 0, icaltime_compare(start, end));
+ icalcomponent_free(c);
+
+ c = icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VTODO_COMPONENT,
+ icalproperty_vanew_dtstart(start1, 0),
+ 0),
+ 0);
+ icalcomponent_set_due(c, icaltime_from_string("20220109"));
+ d = icalcomponent_get_duration(c);
+ end = icalcomponent_get_dtend(c);
+ if (VERBOSE) {
+ printf("%s\n", icaldurationtype_as_ical_string(d));
+ }
+ str_is("P1D", "P1D", icaldurationtype_as_ical_string(d));
+
+ if (VERBOSE) {
+ printf("%i\n", icaltime_is_null_time(end));
+ }
+ int_is("icaltime_is_null_time(end)", 1, icaltime_is_null_time(end));
+ icalcomponent_free(c);
+}
+
+static void
+test_icalvalue_resets_timezone_on_set(void)
+{
+ const char *strcomp =
+ "BEGIN:VCALENDAR\r\n"
+ "BEGIN:VTIMEZONE\r\n"
+ "TZID:my_zone\r\n"
+ "BEGIN:STANDARD\r\n"
+ "TZNAME:my_zone\r\n"
+ "DTSTART:19160429T230000\r\n"
+ "TZOFFSETFROM:+0100\r\n"
+ "TZOFFSETTO:+0200\r\n"
+ "RRULE:FREQ=YEARLY;UNTIL=19160430T220000Z;BYDAY=-1SU;BYMONTH=4\r\n"
+ "END:STANDARD\r\n"
+ "END:VTIMEZONE\r\n"
+ "BEGIN:VEVENT\r\n"
+ "UID:0\r\n"
+ "DTSTART;TZID=my_zone:20180101T010000\r\n"
+ "DTEND:20180202T020000Z\r\n"
+ "DUE:20180302T030000\r\n"
+ "END:VEVENT\r\n"
+ "END:VCALENDAR\r\n";
+ icalcomponent *comp, *clone, *inner;
+ icaltimetype comp_dtstart, comp_dtend, comp_due;
+ icaltimetype clone_dtstart, clone_dtend, clone_due;
+ const char *orig_str, *clone_str;
+ int estate;
+
+ estate = icalerror_get_errors_are_fatal();
+ icalerror_set_errors_are_fatal(0);
+
+ /* First try without calling 'set' */
+ comp = icalcomponent_new_from_string(strcomp);
+ ok("1st - vCalendar can be parsed", (comp != NULL));
+ inner = icalcomponent_get_inner(comp);
+ ok("1st - inner exists", (inner != NULL));
+ orig_str = icalcomponent_as_ical_string(inner);
+ comp_dtstart = icalcomponent_get_dtstart(inner);
+ comp_dtend = icalcomponent_get_dtend(inner);
+ comp_due = icalcomponent_get_due(inner);
+ ok("1st - comp dtstart is non-UTC zone", (comp_dtstart.zone != NULL && comp_dtstart.zone != icaltimezone_get_utc_timezone()));
+ ok("1st - comp dtend is UTC zone", (comp_dtend.zone == icaltimezone_get_utc_timezone()));
+ ok("1st - comp due is floating", (comp_due.zone == NULL));
+ clone = icalcomponent_new_clone(inner);
+ icalcomponent_free(comp);
+ /* note the comp_dtstart.zone points to a freed memory now (it was freed with the 'comp') */
+ clone_dtstart = icalcomponent_get_dtstart(clone);
+ clone_dtend = icalcomponent_get_dtend(clone);
+ clone_due = icalcomponent_get_due(clone);
+ ok("1st - clone dtstart is null zone", (clone_dtstart.zone == NULL));
+ ok("1st - clone dtend is UTC zone", (clone_dtend.zone == icaltimezone_get_utc_timezone()));
+ ok("1st - clone due is floating", (clone_due.zone == NULL));
+ clone_str = icalcomponent_as_ical_string(clone);
+ ok("1st - clone and orig components match", (strcmp(orig_str, clone_str) == 0));
+ icalcomponent_free(clone);
+
+ /* Second try with calling 'set' */
+ comp = icalcomponent_new_from_string(strcomp);
+ inner = icalcomponent_get_inner(comp);
+ orig_str = icalcomponent_as_ical_string(inner);
+ comp_dtstart = icalcomponent_get_dtstart(inner);
+ comp_dtend = icalcomponent_get_dtend(inner);
+ comp_due = icalcomponent_get_due(inner);
+ ok("2nd - comp dtstart is non-UTC zone", (comp_dtstart.zone != NULL && comp_dtstart.zone != icaltimezone_get_utc_timezone()));
+ ok("2nd - comp dtend is UTC zone", (comp_dtend.zone == icaltimezone_get_utc_timezone()));
+ ok("2nd - comp due is floating", (comp_due.zone == NULL));
+ icalcomponent_set_dtstart(inner, comp_dtstart);
+ icalcomponent_set_dtend(inner, comp_dtend);
+ icalcomponent_set_due(inner, comp_due);
+ comp_dtstart = icalcomponent_get_dtstart(inner);
+ comp_dtend = icalcomponent_get_dtend(inner);
+ comp_due = icalcomponent_get_due(inner);
+ ok("2nd - comp dtstart is non-UTC zone", (comp_dtstart.zone != NULL && comp_dtstart.zone != icaltimezone_get_utc_timezone()));
+ ok("2nd - comp dtend is UTC zone after set", (comp_dtend.zone == icaltimezone_get_utc_timezone()));
+ ok("2nd - comp due is floating after set", (comp_due.zone == NULL));
+ clone = icalcomponent_new_clone(inner);
+ icalcomponent_free(comp);
+ /* note the comp_dtstart.zone points to a freed memory now (it was freed with the 'comp') */
+ clone_dtstart = icalcomponent_get_dtstart(clone);
+ clone_dtend = icalcomponent_get_dtend(clone);
+ clone_due = icalcomponent_get_due(clone);
+ ok("2nd - clone dtstart is null zone", (clone_dtstart.zone == NULL));
+ ok("2nd - clone dtend is UTC zone", (clone_dtend.zone == icaltimezone_get_utc_timezone()));
+ ok("2nd - clone due is floating", (clone_due.zone == NULL));
+ clone_str = icalcomponent_as_ical_string(clone);
+ ok("2nd - clone and orig components match", (strcmp(orig_str, clone_str) == 0));
+ icalcomponent_free(clone);
+
+ icalerror_set_errors_are_fatal(estate);
+ icalerror_clear_errno();
+}
+
+static void test_remove_tzid_from_due(void)
+{
+ icalproperty *due = icalproperty_vanew_due(icaltime_from_string("20220120T120000"), 0);
+ icalcomponent *c;
+
+ icalproperty_add_parameter(due, icalparameter_new_tzid("America/New_York"));
+
+ c = icalcomponent_vanew(
+ ICAL_VCALENDAR_COMPONENT,
+ icalcomponent_vanew(
+ ICAL_VTODO_COMPONENT,
+ due,
+ 0),
+ 0);
+
+ icalcomponent_set_due(c, icaltime_from_string("20220120"));
+ str_is("icalproperty_as_ical_string()", "DUE;VALUE=DATE:20220120\r\n", icalproperty_as_ical_string(icalcomponent_get_first_property(icalcomponent_get_inner(c), ICAL_DUE_PROPERTY)));
+
+ icalcomponent_free(c);
+}
+
int main(int argc, char *argv[])
{
#if !defined(HAVE_UNISTD_H)
@@ -4892,6 +5237,17 @@ int main(int argc, char *argv[])
int do_header = 0;
int failed_count = 0;
+#if !defined(MEMORY_CONSISTENCY)
+ // With MEMORY_CONSISTENCY we are building the entire library using the
+ // test_* functions; therefore, no need to set them here again.
+
+ // We specify special versions of malloc et al. that perform some extra verifications.
+ // Most notably they ensure, that memory allocated with icalmemory_new_buffer() is freed
+ // using icalmemory_free() rather than using free() directly and vice versa. Failing to
+ // do so would cause the test to fail with assertions or access violations.
+ icalmemory_set_mem_alloc_funcs(&test_malloc, &test_realloc, &test_free);
+#endif
+
set_zone_directory(TEST_ZONEDIR);
icaltimezone_set_tzid_prefix(TESTS_TZID_PREFIX);
@@ -5021,6 +5377,11 @@ int main(int argc, char *argv[])
test_run("Test icalcomponent_normalize", test_icalcomponent_normalize, do_test, do_header);
test_run("Test builtin compat TZID", test_builtin_compat_tzid, do_test, do_header);
+ test_run("Test VCC vCard parse", test_vcc_vcard_parse, do_test, do_header);
+ test_run("Test implicit DTEND and DURATION for VEVENT and VTODO", test_implicit_dtend_duration, do_test, do_header);
+ test_run("Test icalvalue resets timezone on set", test_icalvalue_resets_timezone_on_set, do_test, do_header);
+ test_run("Test removing TZID from DUE with icalcomponent_set_due", test_remove_tzid_from_due, do_test, do_header);
+ test_run("Test geo precision", test_geo_props, do_test, do_header);
/** OPTIONAL TESTS go here... **/
diff --git a/src/test/regression.h b/src/test/regression.h
index 9c5aab88..55531793 100644
--- a/src/test/regression.h
+++ b/src/test/regression.h
@@ -2,18 +2,10 @@
FILE: regression.c
CREATOR: eric 03 April 1999
- (C) COPYRIGHT 1999 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 1999 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
======================================================================*/
#ifndef TEST_REGRESSION_H
#define TEST_REGRESSION_H
@@ -52,7 +44,7 @@ extern "C"
void test_bdbset(void);
/* regression-utils.c */
- const char *ical_timet_string(const time_t t);
+ const char *ical_timet_string(const icaltime_t t);
const char *ictt_as_string(struct icaltimetype t);
char *icaltime_as_ctime(struct icaltimetype t);
diff --git a/src/test/stow.c b/src/test/stow.c
index 0b98126e..00b07d11 100644
--- a/src/test/stow.c
+++ b/src/test/stow.c
@@ -2,18 +2,9 @@
FILE: stow.c
CREATOR: eric 29 April 2000
- (C) COPYRIGHT 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
diff --git a/src/test/test-malloc.c b/src/test/test-malloc.c
new file mode 100644
index 00000000..d9c46995
--- /dev/null
+++ b/src/test/test-malloc.c
@@ -0,0 +1,178 @@
+/*======================================================================
+FILE: test-malloc.c
+
+SPDX-FileCopyrightText: 2018-2022, Markus Minichmayr <markus@tapkey.com>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
+======================================================================*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "test-malloc.h"
+#include "icalerror.h"
+#if !defined(MEMORY_CONSISTENCY)
+#include "regression.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+struct testmalloc_statistics global_testmalloc_statistics;
+static int global_testmalloc_remaining_attempts = -1;
+
+#define TESTMALLOC_MAGIC_NO 0x1234abcd
+struct testmalloc_hdr {
+ uint32_t magic_no;
+ size_t size;
+};
+
+struct testmalloc_hdrlayout {
+ struct testmalloc_hdr hdr;
+ int data;
+};
+
+#define TESTMALLOC_HDR_SIZE ((size_t) &((struct testmalloc_hdrlayout*) 0)->data)
+
+void *test_malloc(size_t size) {
+
+ void *block;
+ struct testmalloc_hdr *hdr;
+
+ global_testmalloc_statistics.malloc_cnt++;
+ if (global_testmalloc_remaining_attempts == 0) {
+ global_testmalloc_statistics.malloc_failed_cnt++;
+ return NULL;
+ }
+
+ block = malloc(size + TESTMALLOC_HDR_SIZE);
+ if (block == NULL) {
+ global_testmalloc_statistics.malloc_failed_cnt++;
+ return NULL;
+ }
+
+ hdr = (struct testmalloc_hdr *)block;
+ hdr->magic_no = TESTMALLOC_MAGIC_NO;
+ hdr->size = size;
+
+ global_testmalloc_statistics.mem_allocated_current += size;
+ if (global_testmalloc_statistics.mem_allocated_current > global_testmalloc_statistics.mem_allocated_max) {
+ global_testmalloc_statistics.mem_allocated_max = global_testmalloc_statistics.mem_allocated_current;
+ }
+
+ global_testmalloc_statistics.blocks_allocated++;
+
+ if (global_testmalloc_remaining_attempts > 0) {
+ global_testmalloc_remaining_attempts--;
+ }
+
+ return (void*) &((struct testmalloc_hdrlayout *) hdr)->data;
+}
+
+void *test_realloc(void *p, size_t size) {
+
+ struct testmalloc_hdr *hdr;
+ size_t old_size;
+
+ global_testmalloc_statistics.realloc_cnt++;
+ if (global_testmalloc_remaining_attempts == 0) {
+ global_testmalloc_statistics.realloc_failed_cnt++;
+ return NULL;
+ }
+
+ if (p == NULL) {
+ global_testmalloc_statistics.realloc_failed_cnt++;
+ return NULL;
+ }
+
+ hdr = (struct testmalloc_hdr *) (((uint8_t *) p) - TESTMALLOC_HDR_SIZE);
+ if (hdr->magic_no != TESTMALLOC_MAGIC_NO) {
+ global_testmalloc_statistics.realloc_failed_cnt++;
+ return NULL;
+ }
+
+ old_size = hdr->size;
+ hdr->magic_no = 0;
+
+ // cppcheck-suppress memleakOnRealloc; the mem block p passed to this function stays valid.
+ hdr = (struct testmalloc_hdr *)realloc(hdr, size + TESTMALLOC_HDR_SIZE);
+ if (hdr == NULL) {
+ global_testmalloc_statistics.realloc_failed_cnt++;
+ return NULL;
+ }
+
+ hdr->magic_no = TESTMALLOC_MAGIC_NO;
+ hdr->size = size;
+
+ global_testmalloc_statistics.mem_allocated_current += size - old_size;
+ if (global_testmalloc_statistics.mem_allocated_current > global_testmalloc_statistics.mem_allocated_max) {
+ global_testmalloc_statistics.mem_allocated_max = global_testmalloc_statistics.mem_allocated_current;
+ }
+
+ if (global_testmalloc_remaining_attempts > 0) {
+ global_testmalloc_remaining_attempts--;
+ }
+
+ return (void *) &((struct testmalloc_hdrlayout *)hdr)->data;
+}
+
+void test_free(void *p) {
+
+ struct testmalloc_hdr *hdr;
+ size_t old_size;
+
+ if (p == NULL) {
+ return;
+ }
+
+ global_testmalloc_statistics.free_cnt++;
+
+ hdr = (struct testmalloc_hdr *) (((uint8_t *) p) - TESTMALLOC_HDR_SIZE);
+
+ // The main objective of this check is to ensure, that only memory, that has been allocated via icalmemory is freed
+ // via icalmemory_free(). A side objective is to make sure, the block of memory hasn't been corrupted.
+ if (hdr->magic_no != TESTMALLOC_MAGIC_NO) {
+
+ // If we end up here, then probably either of the following happened:
+ // * The calling code tries to free a block of memory via icalmemory_free() that has been allocated outside of
+ // icalmemory, e.g. via malloc().
+ // * The header in front of the memory block being freed has been corrupted.
+
+#if !defined(MEMORY_CONSISTENCY)
+ ok("freed memory was allocated via icalmemory and has not been corrupted",
+ hdr->magic_no == TESTMALLOC_MAGIC_NO);
+#endif
+ icalerror_assert(hdr->magic_no == TESTMALLOC_MAGIC_NO,
+ "freed memory was allocated via icalmemory and has been corrupted");
+ global_testmalloc_statistics.free_failed_cnt++;
+ return;
+ }
+
+ old_size = hdr->size;
+ hdr->magic_no = 0;
+
+ free(hdr);
+
+ global_testmalloc_statistics.mem_allocated_current -= old_size;
+ global_testmalloc_statistics.blocks_allocated--;
+}
+
+void testmalloc_reset() {
+ memset(&global_testmalloc_statistics, 0, sizeof(global_testmalloc_statistics));
+ global_testmalloc_remaining_attempts = -1;
+}
+
+/** Sets the maximum number of malloc or realloc attemts that will succeed. If
+* the number is negative, no limit will be applied. */
+void testmalloc_set_max_successful_allocs(int n) {
+ global_testmalloc_remaining_attempts = n;
+}
+
+void testmalloc_get_statistics(struct testmalloc_statistics *statistics) {
+
+ if (statistics) {
+ *statistics = global_testmalloc_statistics;
+ }
+}
diff --git a/src/test/test-malloc.h b/src/test/test-malloc.h
new file mode 100644
index 00000000..04858bae
--- /dev/null
+++ b/src/test/test-malloc.h
@@ -0,0 +1,61 @@
+/*======================================================================
+FILE: test-malloc.h
+
+SPDX-FileCopyrightText: 2018-2022, Markus Minichmayr <markus@tapkey.com>
+
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
+
+======================================================================*/
+
+#ifndef TESTMALLOC_H
+#define TESTMALLOC_H
+
+#include <stdint.h>
+
+#include "libical_ical_export.h"
+
+struct testmalloc_statistics {
+ int malloc_cnt;
+ int realloc_cnt;
+ int free_cnt;
+
+ int malloc_failed_cnt;
+ int realloc_failed_cnt;
+ int free_failed_cnt;
+
+ size_t mem_allocated_max;
+ size_t mem_allocated_current;
+ int blocks_allocated;
+};
+
+/** Allocates the specified amount of memory and returns a pointer to the allocated memory.
+ * Memory allocated using this function must be freed using test_free().
+ * The number of allocations that can be made using this function can be limited via
+ * testmalloc_set_max_successful_allocs().
+ */
+LIBICAL_ICAL_EXPORT void *test_malloc(size_t size);
+
+/** Resizes the specified buffer.
+ * Can only be used with memory that has previously been allocated using test_malloc().
+ */
+LIBICAL_ICAL_EXPORT void *test_realloc(void *p, size_t size);
+
+/** Frees a block of memory that has previously been allocated via the test_malloc() function. Specifying memory that
+ * has not been allocated via test_malloc() causes an assertion.
+ */
+LIBICAL_ICAL_EXPORT void test_free(void *p);
+
+/** Resets the memory management statistics and sets the number of successful
+ * allocations limit to infinite.
+ */
+LIBICAL_ICAL_EXPORT void testmalloc_reset();
+
+/** Sets the maximum number of malloc or realloc attemts that will succeed. If
+ * the number is negative, no limit will be applied.
+ */
+LIBICAL_ICAL_EXPORT void testmalloc_set_max_successful_allocs(int n);
+
+/** Gets current memory allocation statistics. */
+LIBICAL_ICAL_EXPORT void testmalloc_get_statistics(struct testmalloc_statistics *statistics);
+
+#endif /* !TESTMALLOC_H */
diff --git a/src/test/testmime.c b/src/test/testmime.c
index e0c53ea9..df904868 100644
--- a/src/test/testmime.c
+++ b/src/test/testmime.c
@@ -2,18 +2,9 @@
FILE:
CREATOR: eric 25 June 2000
- (C) COPYRIGHT 2000, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Initial Developer of the Original Code is Eric Busboom
======================================================================*/
diff --git a/src/test/testvcal.c b/src/test/testvcal.c
index 96650f44..f38df8a8 100644
--- a/src/test/testvcal.c
+++ b/src/test/testvcal.c
@@ -2,18 +2,9 @@
FILE: testvcal.c
CREATOR: eric 26 May 2000
- (C) COPYRIGHT 2000 Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2000 Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
The Original Code is eric. The Initial Developer of the Original
Code is Eric Busboom
diff --git a/src/test/timezones.c b/src/test/timezones.c
index 935e912d..0285e3b5 100644
--- a/src/test/timezones.c
+++ b/src/test/timezones.c
@@ -1,18 +1,9 @@
/*
======================================================================
- (C) COPYRIGHT 2008, Eric Busboom <eric@civicknowledge.com>
+ SPDX-FileCopyrightText: 2008, Eric Busboom <eric@civicknowledge.com>
- This library is free software; you can redistribute it and/or modify
- it under the terms of either:
-
- The LGPL as published by the Free Software Foundation, version
- 2.1, available at: https://www.gnu.org/licenses/lgpl-2.1.html
-
- Or:
-
- The Mozilla Public License Version 2.0. You may obtain a copy of
- the License at https://www.mozilla.org/MPL/
+ SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
======================================================================*/
@@ -39,9 +30,9 @@ int main()
int verbose = 0;
int day;
- time_t start_time;
+ icaltime_t start_time;
struct tm start_tm;
- time_t curr_time;
+ icaltime_t curr_time;
struct tm curr_tm;
struct icaltimetype curr_tt;
int failed = 0;
@@ -82,19 +73,19 @@ int main()
* determine current local time and date: always use midday in
* the current zone and first day of first month in the year
*/
- start_time = time(NULL);
- (void)localtime_r(&start_time, &start_tm);
+ start_time = icaltime(NULL);
+ (void)icallocaltime_r(&start_time, &start_tm);
start_tm.tm_hour = 12;
start_tm.tm_min = 0;
start_tm.tm_sec = 0;
start_tm.tm_mday = 1;
start_tm.tm_mon = 0;
- start_time = mktime(&start_tm);
+ start_time = icalmktime(&start_tm);
/* check time conversion for the next 365 days */
for (day = 0, curr_time = start_time; day < 365; day++, curr_time += 24 * 60 * 60) {
/* determine date/time with glibc */
- localtime_r(&curr_time, &curr_tm);
+ icallocaltime_r(&curr_time, &curr_tm);
/* determine date/time with libical */
curr_tt = icaltime_from_timet_with_zone(curr_time, 0, utc_zone);
curr_tt.zone = utc_zone; /* workaround: icaltime_from_timet_with_zone()
@@ -114,7 +105,7 @@ int main()
if (verbose || curr_failed != failed) {
struct tm utc_tm;
- if (!gmtime_r(&curr_time, &utc_tm))
+ if (!icalgmtime_r(&curr_time, &utc_tm))
memset(&utc_tm, 0, sizeof(utc_tm));
printf(
diff --git a/test-data/CMakeLists.txt b/test-data/CMakeLists.txt
index 0b7b3433..b650e8dc 100644
--- a/test-data/CMakeLists.txt
+++ b/test-data/CMakeLists.txt
@@ -1,3 +1,4 @@
+# SPDX-FileCopyrightText: Allen Winter <winter@kde.org>
+# SPDX-License-Identifier: LGPL-2.1-only OR MPL-2.0
########### install files ###############
-
diff --git a/uninstall.cmake.in b/uninstall.cmake.in
index 662668c7..13dc359e 100644
--- a/uninstall.cmake.in
+++ b/uninstall.cmake.in
@@ -1,3 +1,10 @@
+
+# SPDX-FileCopyrightText: Kitware, Inc. and Contributors
+# SPDX-License-Identifier: BSD-3-Clause
+
+# see:
+# https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#can-i-do-make-uninstall-with-cmake
+
if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
endif()
diff --git a/zoneinfo/Africa/Abidjan.ics b/zoneinfo/Africa/Abidjan.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Abidjan.ics
+++ b/zoneinfo/Africa/Abidjan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Accra.ics b/zoneinfo/Africa/Accra.ics
index 51f64f83..d7fc42c8 100644
--- a/zoneinfo/Africa/Accra.ics
+++ b/zoneinfo/Africa/Accra.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Accra
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:Africa/Accra
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
TZOFFSETFROM:+0000
diff --git a/zoneinfo/Africa/Addis_Ababa.ics b/zoneinfo/Africa/Addis_Ababa.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Addis_Ababa.ics
+++ b/zoneinfo/Africa/Addis_Ababa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Algiers.ics b/zoneinfo/Africa/Algiers.ics
index 464bcd21..3ce8569b 100644
--- a/zoneinfo/Africa/Algiers.ics
+++ b/zoneinfo/Africa/Algiers.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Algiers
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Algiers
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Algiers
BEGIN:STANDARD
TZNAME:CET
diff --git a/zoneinfo/Africa/Asmara.ics b/zoneinfo/Africa/Asmara.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Asmara.ics
+++ b/zoneinfo/Africa/Asmara.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Asmera.ics b/zoneinfo/Africa/Asmera.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Asmera.ics
+++ b/zoneinfo/Africa/Asmera.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Bamako.ics b/zoneinfo/Africa/Bamako.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Bamako.ics
+++ b/zoneinfo/Africa/Bamako.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Bangui.ics b/zoneinfo/Africa/Bangui.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Bangui.ics
+++ b/zoneinfo/Africa/Bangui.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Banjul.ics b/zoneinfo/Africa/Banjul.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Banjul.ics
+++ b/zoneinfo/Africa/Banjul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Bissau.ics b/zoneinfo/Africa/Bissau.ics
index ea0cec6f..f0eea376 100644
--- a/zoneinfo/Africa/Bissau.ics
+++ b/zoneinfo/Africa/Bissau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Bissau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Bissau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Bissau
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Blantyre.ics b/zoneinfo/Africa/Blantyre.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Blantyre.ics
+++ b/zoneinfo/Africa/Blantyre.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Brazzaville.ics b/zoneinfo/Africa/Brazzaville.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Brazzaville.ics
+++ b/zoneinfo/Africa/Brazzaville.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Bujumbura.ics b/zoneinfo/Africa/Bujumbura.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Bujumbura.ics
+++ b/zoneinfo/Africa/Bujumbura.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Cairo.ics b/zoneinfo/Africa/Cairo.ics
index 746bb179..6b5c8970 100644
--- a/zoneinfo/Africa/Cairo.ics
+++ b/zoneinfo/Africa/Cairo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Cairo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Cairo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Cairo
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Africa/Casablanca.ics b/zoneinfo/Africa/Casablanca.ics
index 993c93ed..aa8ebf9f 100644
--- a/zoneinfo/Africa/Casablanca.ics
+++ b/zoneinfo/Africa/Casablanca.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Casablanca
+TZID:/citadel.org/20211207_1/Africa/Casablanca
TZUNTIL:20870511T020001Z
-LAST-MODIFIED:20210410T122212Z
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Casablanca
BEGIN:STANDARD
TZNAME:+01
diff --git a/zoneinfo/Africa/Ceuta.ics b/zoneinfo/Africa/Ceuta.ics
index ec19a3b9..a0172a5b 100644
--- a/zoneinfo/Africa/Ceuta.ics
+++ b/zoneinfo/Africa/Ceuta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Ceuta
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Ceuta
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Ceuta
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Africa/Conakry.ics b/zoneinfo/Africa/Conakry.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Conakry.ics
+++ b/zoneinfo/Africa/Conakry.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Dakar.ics b/zoneinfo/Africa/Dakar.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Dakar.ics
+++ b/zoneinfo/Africa/Dakar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Dar_es_Salaam.ics b/zoneinfo/Africa/Dar_es_Salaam.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Dar_es_Salaam.ics
+++ b/zoneinfo/Africa/Dar_es_Salaam.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Djibouti.ics b/zoneinfo/Africa/Djibouti.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Djibouti.ics
+++ b/zoneinfo/Africa/Djibouti.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Douala.ics b/zoneinfo/Africa/Douala.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Douala.ics
+++ b/zoneinfo/Africa/Douala.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/El_Aaiun.ics b/zoneinfo/Africa/El_Aaiun.ics
index dc538ad6..9d1810f1 100644
--- a/zoneinfo/Africa/El_Aaiun.ics
+++ b/zoneinfo/Africa/El_Aaiun.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/El_Aaiun
+TZID:/citadel.org/20211207_1/Africa/El_Aaiun
TZUNTIL:20870511T020001Z
-LAST-MODIFIED:20210410T122212Z
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/El_Aaiun
BEGIN:STANDARD
TZNAME:+01
diff --git a/zoneinfo/Africa/Freetown.ics b/zoneinfo/Africa/Freetown.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Freetown.ics
+++ b/zoneinfo/Africa/Freetown.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Gaborone.ics b/zoneinfo/Africa/Gaborone.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Gaborone.ics
+++ b/zoneinfo/Africa/Gaborone.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Harare.ics b/zoneinfo/Africa/Harare.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Harare.ics
+++ b/zoneinfo/Africa/Harare.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Johannesburg.ics b/zoneinfo/Africa/Johannesburg.ics
index 5bdcbc52..3ae60e9c 100644
--- a/zoneinfo/Africa/Johannesburg.ics
+++ b/zoneinfo/Africa/Johannesburg.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Johannesburg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Johannesburg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Johannesburg
BEGIN:STANDARD
TZNAME:SAST
diff --git a/zoneinfo/Africa/Juba.ics b/zoneinfo/Africa/Juba.ics
index 21fd6dd1..5301b79e 100644
--- a/zoneinfo/Africa/Juba.ics
+++ b/zoneinfo/Africa/Juba.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Juba
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Juba
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Juba
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Kampala.ics b/zoneinfo/Africa/Kampala.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Kampala.ics
+++ b/zoneinfo/Africa/Kampala.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Khartoum.ics b/zoneinfo/Africa/Khartoum.ics
index e4a07631..8baedb8d 100644
--- a/zoneinfo/Africa/Khartoum.ics
+++ b/zoneinfo/Africa/Khartoum.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Khartoum
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Khartoum
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Khartoum
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Kigali.ics b/zoneinfo/Africa/Kigali.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Kigali.ics
+++ b/zoneinfo/Africa/Kigali.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Kinshasa.ics b/zoneinfo/Africa/Kinshasa.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Kinshasa.ics
+++ b/zoneinfo/Africa/Kinshasa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Lagos.ics b/zoneinfo/Africa/Lagos.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Lagos.ics
+++ b/zoneinfo/Africa/Lagos.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Libreville.ics b/zoneinfo/Africa/Libreville.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Libreville.ics
+++ b/zoneinfo/Africa/Libreville.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Lome.ics b/zoneinfo/Africa/Lome.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Lome.ics
+++ b/zoneinfo/Africa/Lome.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Luanda.ics b/zoneinfo/Africa/Luanda.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Luanda.ics
+++ b/zoneinfo/Africa/Luanda.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Lubumbashi.ics b/zoneinfo/Africa/Lubumbashi.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Lubumbashi.ics
+++ b/zoneinfo/Africa/Lubumbashi.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Lusaka.ics b/zoneinfo/Africa/Lusaka.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Lusaka.ics
+++ b/zoneinfo/Africa/Lusaka.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Malabo.ics b/zoneinfo/Africa/Malabo.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Malabo.ics
+++ b/zoneinfo/Africa/Malabo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Maputo.ics b/zoneinfo/Africa/Maputo.ics
index b4ab148f..772540b0 100644
--- a/zoneinfo/Africa/Maputo.ics
+++ b/zoneinfo/Africa/Maputo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Maputo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Maputo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Maputo
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/Africa/Maseru.ics b/zoneinfo/Africa/Maseru.ics
index 5bdcbc52..3ae60e9c 100644
--- a/zoneinfo/Africa/Maseru.ics
+++ b/zoneinfo/Africa/Maseru.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Johannesburg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Johannesburg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Johannesburg
BEGIN:STANDARD
TZNAME:SAST
diff --git a/zoneinfo/Africa/Mbabane.ics b/zoneinfo/Africa/Mbabane.ics
index 5bdcbc52..3ae60e9c 100644
--- a/zoneinfo/Africa/Mbabane.ics
+++ b/zoneinfo/Africa/Mbabane.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Johannesburg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Johannesburg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Johannesburg
BEGIN:STANDARD
TZNAME:SAST
diff --git a/zoneinfo/Africa/Mogadishu.ics b/zoneinfo/Africa/Mogadishu.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Mogadishu.ics
+++ b/zoneinfo/Africa/Mogadishu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Monrovia.ics b/zoneinfo/Africa/Monrovia.ics
index dcf36e62..219c1c9c 100644
--- a/zoneinfo/Africa/Monrovia.ics
+++ b/zoneinfo/Africa/Monrovia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Monrovia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Monrovia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Monrovia
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Nairobi.ics b/zoneinfo/Africa/Nairobi.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Africa/Nairobi.ics
+++ b/zoneinfo/Africa/Nairobi.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Africa/Ndjamena.ics b/zoneinfo/Africa/Ndjamena.ics
index 41d0d21c..23d05c57 100644
--- a/zoneinfo/Africa/Ndjamena.ics
+++ b/zoneinfo/Africa/Ndjamena.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Ndjamena
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Ndjamena
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Ndjamena
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Niamey.ics b/zoneinfo/Africa/Niamey.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Niamey.ics
+++ b/zoneinfo/Africa/Niamey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Nouakchott.ics b/zoneinfo/Africa/Nouakchott.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Nouakchott.ics
+++ b/zoneinfo/Africa/Nouakchott.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Ouagadougou.ics b/zoneinfo/Africa/Ouagadougou.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Ouagadougou.ics
+++ b/zoneinfo/Africa/Ouagadougou.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Porto-Novo.ics b/zoneinfo/Africa/Porto-Novo.ics
index a1aa1530..2e94b8b0 100644
--- a/zoneinfo/Africa/Porto-Novo.ics
+++ b/zoneinfo/Africa/Porto-Novo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Lagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Lagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Lagos
BEGIN:STANDARD
TZNAME:WAT
diff --git a/zoneinfo/Africa/Sao_Tome.ics b/zoneinfo/Africa/Sao_Tome.ics
index 1ef6e84b..bded29bb 100644
--- a/zoneinfo/Africa/Sao_Tome.ics
+++ b/zoneinfo/Africa/Sao_Tome.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Sao_Tome
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Sao_Tome
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Sao_Tome
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Timbuktu.ics b/zoneinfo/Africa/Timbuktu.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Africa/Timbuktu.ics
+++ b/zoneinfo/Africa/Timbuktu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Africa/Tripoli.ics b/zoneinfo/Africa/Tripoli.ics
index 6d31ae4a..72f0e425 100644
--- a/zoneinfo/Africa/Tripoli.ics
+++ b/zoneinfo/Africa/Tripoli.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Tripoli
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Tripoli
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Tripoli
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Africa/Tunis.ics b/zoneinfo/Africa/Tunis.ics
index c228408c..131c3e18 100644
--- a/zoneinfo/Africa/Tunis.ics
+++ b/zoneinfo/Africa/Tunis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Tunis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Tunis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Tunis
BEGIN:STANDARD
TZNAME:CET
diff --git a/zoneinfo/Africa/Windhoek.ics b/zoneinfo/Africa/Windhoek.ics
index c3f5aab5..3d5c13ee 100644
--- a/zoneinfo/Africa/Windhoek.ics
+++ b/zoneinfo/Africa/Windhoek.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Windhoek
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Windhoek
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Windhoek
BEGIN:STANDARD
TZNAME:CAT
diff --git a/zoneinfo/America/Adak.ics b/zoneinfo/America/Adak.ics
index b1fa8db9..f6af5b1c 100644
--- a/zoneinfo/America/Adak.ics
+++ b/zoneinfo/America/Adak.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Adak
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Adak
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Adak
BEGIN:DAYLIGHT
TZNAME:HDT
diff --git a/zoneinfo/America/Anchorage.ics b/zoneinfo/America/Anchorage.ics
index 021cbaa8..573012dd 100644
--- a/zoneinfo/America/Anchorage.ics
+++ b/zoneinfo/America/Anchorage.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Anchorage
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Anchorage
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Anchorage
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/Anguilla.ics b/zoneinfo/America/Anguilla.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Anguilla.ics
+++ b/zoneinfo/America/Anguilla.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Antigua.ics b/zoneinfo/America/Antigua.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Antigua.ics
+++ b/zoneinfo/America/Antigua.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Araguaina.ics b/zoneinfo/America/Araguaina.ics
index 927aa55a..519c8b39 100644
--- a/zoneinfo/America/Araguaina.ics
+++ b/zoneinfo/America/Araguaina.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Araguaina
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Araguaina
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Araguaina
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Buenos_Aires.ics b/zoneinfo/America/Argentina/Buenos_Aires.ics
index 2c246f93..f497ce6c 100644
--- a/zoneinfo/America/Argentina/Buenos_Aires.ics
+++ b/zoneinfo/America/Argentina/Buenos_Aires.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Buenos_Aires
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Buenos_Aires
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Buenos_Aires
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Catamarca.ics b/zoneinfo/America/Argentina/Catamarca.ics
index 294005dc..9e6dd0bf 100644
--- a/zoneinfo/America/Argentina/Catamarca.ics
+++ b/zoneinfo/America/Argentina/Catamarca.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Catamarca
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Catamarca
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Catamarca
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/ComodRivadavia.ics b/zoneinfo/America/Argentina/ComodRivadavia.ics
index 294005dc..9e6dd0bf 100644
--- a/zoneinfo/America/Argentina/ComodRivadavia.ics
+++ b/zoneinfo/America/Argentina/ComodRivadavia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Catamarca
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Catamarca
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Catamarca
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Cordoba.ics b/zoneinfo/America/Argentina/Cordoba.ics
index 3f2b8e1e..deccae2d 100644
--- a/zoneinfo/America/Argentina/Cordoba.ics
+++ b/zoneinfo/America/Argentina/Cordoba.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Cordoba
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Cordoba
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Cordoba
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Jujuy.ics b/zoneinfo/America/Argentina/Jujuy.ics
index 4c23bfc6..e616bab5 100644
--- a/zoneinfo/America/Argentina/Jujuy.ics
+++ b/zoneinfo/America/Argentina/Jujuy.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Jujuy
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Jujuy
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Jujuy
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/La_Rioja.ics b/zoneinfo/America/Argentina/La_Rioja.ics
index 0598f57f..ff0e9178 100644
--- a/zoneinfo/America/Argentina/La_Rioja.ics
+++ b/zoneinfo/America/Argentina/La_Rioja.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/La_Rioja
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/La_Rioja
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/La_Rioja
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Mendoza.ics b/zoneinfo/America/Argentina/Mendoza.ics
index a9905fbd..5f58bc2c 100644
--- a/zoneinfo/America/Argentina/Mendoza.ics
+++ b/zoneinfo/America/Argentina/Mendoza.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Mendoza
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Mendoza
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Mendoza
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Rio_Gallegos.ics b/zoneinfo/America/Argentina/Rio_Gallegos.ics
index 02d387aa..a453c5da 100644
--- a/zoneinfo/America/Argentina/Rio_Gallegos.ics
+++ b/zoneinfo/America/Argentina/Rio_Gallegos.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Rio_Gallegos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Rio_Gallegos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Rio_Gallegos
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Salta.ics b/zoneinfo/America/Argentina/Salta.ics
index 324b87e0..3628fe7c 100644
--- a/zoneinfo/America/Argentina/Salta.ics
+++ b/zoneinfo/America/Argentina/Salta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Salta
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Salta
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Salta
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/San_Juan.ics b/zoneinfo/America/Argentina/San_Juan.ics
index 457580ef..605701c1 100644
--- a/zoneinfo/America/Argentina/San_Juan.ics
+++ b/zoneinfo/America/Argentina/San_Juan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/San_Juan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/San_Juan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/San_Juan
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/San_Luis.ics b/zoneinfo/America/Argentina/San_Luis.ics
index c631571a..248340f7 100644
--- a/zoneinfo/America/Argentina/San_Luis.ics
+++ b/zoneinfo/America/Argentina/San_Luis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/San_Luis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/San_Luis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/San_Luis
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Tucuman.ics b/zoneinfo/America/Argentina/Tucuman.ics
index 237d1bcf..1f1a259c 100644
--- a/zoneinfo/America/Argentina/Tucuman.ics
+++ b/zoneinfo/America/Argentina/Tucuman.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Tucuman
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Tucuman
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Tucuman
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Argentina/Ushuaia.ics b/zoneinfo/America/Argentina/Ushuaia.ics
index 9577ef26..90835b02 100644
--- a/zoneinfo/America/Argentina/Ushuaia.ics
+++ b/zoneinfo/America/Argentina/Ushuaia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Ushuaia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Ushuaia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Ushuaia
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Aruba.ics b/zoneinfo/America/Aruba.ics
index 271b60a4..c0bfd092 100644
--- a/zoneinfo/America/Aruba.ics
+++ b/zoneinfo/America/Aruba.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Curacao
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Curacao
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Asuncion.ics b/zoneinfo/America/Asuncion.ics
index fb41fbc7..2e68c3a4 100644
--- a/zoneinfo/America/Asuncion.ics
+++ b/zoneinfo/America/Asuncion.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Asuncion
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Asuncion
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Asuncion
BEGIN:DAYLIGHT
TZNAME:-03
diff --git a/zoneinfo/America/Atikokan.ics b/zoneinfo/America/Atikokan.ics
index b234f27b..83c840b3 100644
--- a/zoneinfo/America/Atikokan.ics
+++ b/zoneinfo/America/Atikokan.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Atikokan
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Atikokan
+TZID:/citadel.org/20211207_1/America/Panama
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Panama
BEGIN:STANDARD
TZNAME:EST
TZOFFSETFROM:-0500
diff --git a/zoneinfo/America/Atka.ics b/zoneinfo/America/Atka.ics
index b1fa8db9..f6af5b1c 100644
--- a/zoneinfo/America/Atka.ics
+++ b/zoneinfo/America/Atka.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Adak
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Adak
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Adak
BEGIN:DAYLIGHT
TZNAME:HDT
diff --git a/zoneinfo/America/Bahia.ics b/zoneinfo/America/Bahia.ics
index b0b9a08e..264b0390 100644
--- a/zoneinfo/America/Bahia.ics
+++ b/zoneinfo/America/Bahia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Bahia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Bahia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Bahia
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Bahia_Banderas.ics b/zoneinfo/America/Bahia_Banderas.ics
index 8e43f05e..c432a273 100644
--- a/zoneinfo/America/Bahia_Banderas.ics
+++ b/zoneinfo/America/Bahia_Banderas.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Bahia_Banderas
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Bahia_Banderas
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Bahia_Banderas
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Barbados.ics b/zoneinfo/America/Barbados.ics
index 01d5fe80..9bd174a6 100644
--- a/zoneinfo/America/Barbados.ics
+++ b/zoneinfo/America/Barbados.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Barbados
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Barbados
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Barbados
BEGIN:STANDARD
TZNAME:AST
diff --git a/zoneinfo/America/Belem.ics b/zoneinfo/America/Belem.ics
index 919786a3..a163de68 100644
--- a/zoneinfo/America/Belem.ics
+++ b/zoneinfo/America/Belem.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Belem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Belem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Belem
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Belize.ics b/zoneinfo/America/Belize.ics
index eff4c412..1d3c638f 100644
--- a/zoneinfo/America/Belize.ics
+++ b/zoneinfo/America/Belize.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Belize
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Belize
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Belize
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Blanc-Sablon.ics b/zoneinfo/America/Blanc-Sablon.ics
index eadbb6e6..c0bfd092 100644
--- a/zoneinfo/America/Blanc-Sablon.ics
+++ b/zoneinfo/America/Blanc-Sablon.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Blanc-Sablon
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Blanc-Sablon
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Boa_Vista.ics b/zoneinfo/America/Boa_Vista.ics
index 1beb6006..f194c143 100644
--- a/zoneinfo/America/Boa_Vista.ics
+++ b/zoneinfo/America/Boa_Vista.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Boa_Vista
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Boa_Vista
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Boa_Vista
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Bogota.ics b/zoneinfo/America/Bogota.ics
index 7357f24b..44f9ac3a 100644
--- a/zoneinfo/America/Bogota.ics
+++ b/zoneinfo/America/Bogota.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Bogota
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Bogota
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Bogota
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/Boise.ics b/zoneinfo/America/Boise.ics
index dabbfe49..7b59585d 100644
--- a/zoneinfo/America/Boise.ics
+++ b/zoneinfo/America/Boise.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Boise
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Boise
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Boise
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Buenos_Aires.ics b/zoneinfo/America/Buenos_Aires.ics
index 2c246f93..f497ce6c 100644
--- a/zoneinfo/America/Buenos_Aires.ics
+++ b/zoneinfo/America/Buenos_Aires.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Buenos_Aires
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Buenos_Aires
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Buenos_Aires
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Cambridge_Bay.ics b/zoneinfo/America/Cambridge_Bay.ics
index 5a11eb06..e74408e9 100644
--- a/zoneinfo/America/Cambridge_Bay.ics
+++ b/zoneinfo/America/Cambridge_Bay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Cambridge_Bay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Cambridge_Bay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Cambridge_Bay
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Campo_Grande.ics b/zoneinfo/America/Campo_Grande.ics
index 49948685..5d9a5fb9 100644
--- a/zoneinfo/America/Campo_Grande.ics
+++ b/zoneinfo/America/Campo_Grande.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Campo_Grande
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Campo_Grande
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Campo_Grande
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Cancun.ics b/zoneinfo/America/Cancun.ics
index c0bc0725..50625a0f 100644
--- a/zoneinfo/America/Cancun.ics
+++ b/zoneinfo/America/Cancun.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Cancun
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Cancun
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Cancun
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Caracas.ics b/zoneinfo/America/Caracas.ics
index 780f71e1..eac90af5 100644
--- a/zoneinfo/America/Caracas.ics
+++ b/zoneinfo/America/Caracas.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Caracas
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Caracas
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Caracas
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Catamarca.ics b/zoneinfo/America/Catamarca.ics
index 294005dc..9e6dd0bf 100644
--- a/zoneinfo/America/Catamarca.ics
+++ b/zoneinfo/America/Catamarca.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Catamarca
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Catamarca
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Catamarca
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Cayenne.ics b/zoneinfo/America/Cayenne.ics
index d561cc50..6e0d959e 100644
--- a/zoneinfo/America/Cayenne.ics
+++ b/zoneinfo/America/Cayenne.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Cayenne
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Cayenne
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Cayenne
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Cayman.ics b/zoneinfo/America/Cayman.ics
index 99d0d48e..83c840b3 100644
--- a/zoneinfo/America/Cayman.ics
+++ b/zoneinfo/America/Cayman.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Panama
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Panama
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Panama
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Chicago.ics b/zoneinfo/America/Chicago.ics
index bc29e43f..0bad1652 100644
--- a/zoneinfo/America/Chicago.ics
+++ b/zoneinfo/America/Chicago.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Chicago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Chicago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Chihuahua.ics b/zoneinfo/America/Chihuahua.ics
index 01294c89..37793cdd 100644
--- a/zoneinfo/America/Chihuahua.ics
+++ b/zoneinfo/America/Chihuahua.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Chihuahua
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Chihuahua
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Chihuahua
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Coral_Harbour.ics b/zoneinfo/America/Coral_Harbour.ics
index b234f27b..83c840b3 100644
--- a/zoneinfo/America/Coral_Harbour.ics
+++ b/zoneinfo/America/Coral_Harbour.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Atikokan
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Atikokan
+TZID:/citadel.org/20211207_1/America/Panama
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Panama
BEGIN:STANDARD
TZNAME:EST
TZOFFSETFROM:-0500
diff --git a/zoneinfo/America/Cordoba.ics b/zoneinfo/America/Cordoba.ics
index 3f2b8e1e..deccae2d 100644
--- a/zoneinfo/America/Cordoba.ics
+++ b/zoneinfo/America/Cordoba.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Cordoba
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Cordoba
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Cordoba
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Costa_Rica.ics b/zoneinfo/America/Costa_Rica.ics
index e89fd153..7b514108 100644
--- a/zoneinfo/America/Costa_Rica.ics
+++ b/zoneinfo/America/Costa_Rica.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Costa_Rica
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Costa_Rica
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Costa_Rica
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Creston.ics b/zoneinfo/America/Creston.ics
index c8fb5441..93db33c3 100644
--- a/zoneinfo/America/Creston.ics
+++ b/zoneinfo/America/Creston.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Creston
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Creston
+TZID:/citadel.org/20211207_1/America/Phoenix
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Phoenix
BEGIN:STANDARD
TZNAME:MST
TZOFFSETFROM:-0700
diff --git a/zoneinfo/America/Cuiaba.ics b/zoneinfo/America/Cuiaba.ics
index a46dd9e3..5e81ef02 100644
--- a/zoneinfo/America/Cuiaba.ics
+++ b/zoneinfo/America/Cuiaba.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Cuiaba
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Cuiaba
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Cuiaba
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Curacao.ics b/zoneinfo/America/Curacao.ics
index 271b60a4..c0bfd092 100644
--- a/zoneinfo/America/Curacao.ics
+++ b/zoneinfo/America/Curacao.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Curacao
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Curacao
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Danmarkshavn.ics b/zoneinfo/America/Danmarkshavn.ics
index 5903e879..00e58db3 100644
--- a/zoneinfo/America/Danmarkshavn.ics
+++ b/zoneinfo/America/Danmarkshavn.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Danmarkshavn
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Danmarkshavn
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Danmarkshavn
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/America/Dawson.ics b/zoneinfo/America/Dawson.ics
index 5363ba18..fcb041d3 100644
--- a/zoneinfo/America/Dawson.ics
+++ b/zoneinfo/America/Dawson.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Dawson
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Dawson
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Dawson
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Dawson_Creek.ics b/zoneinfo/America/Dawson_Creek.ics
index 2c6f570d..f358281f 100644
--- a/zoneinfo/America/Dawson_Creek.ics
+++ b/zoneinfo/America/Dawson_Creek.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Dawson_Creek
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Dawson_Creek
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Dawson_Creek
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Denver.ics b/zoneinfo/America/Denver.ics
index 79d6ba54..76584cb4 100644
--- a/zoneinfo/America/Denver.ics
+++ b/zoneinfo/America/Denver.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Denver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Denver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Detroit.ics b/zoneinfo/America/Detroit.ics
index e148a23d..c653a38b 100644
--- a/zoneinfo/America/Detroit.ics
+++ b/zoneinfo/America/Detroit.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Detroit
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Detroit
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Detroit
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Dominica.ics b/zoneinfo/America/Dominica.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Dominica.ics
+++ b/zoneinfo/America/Dominica.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Edmonton.ics b/zoneinfo/America/Edmonton.ics
index 5045c4ce..7a06ce41 100644
--- a/zoneinfo/America/Edmonton.ics
+++ b/zoneinfo/America/Edmonton.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Edmonton
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Edmonton
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Edmonton
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Eirunepe.ics b/zoneinfo/America/Eirunepe.ics
index 7c29de57..cf0d6050 100644
--- a/zoneinfo/America/Eirunepe.ics
+++ b/zoneinfo/America/Eirunepe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Eirunepe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Eirunepe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Eirunepe
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/El_Salvador.ics b/zoneinfo/America/El_Salvador.ics
index 914a6c4f..f149ddb3 100644
--- a/zoneinfo/America/El_Salvador.ics
+++ b/zoneinfo/America/El_Salvador.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/El_Salvador
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/El_Salvador
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/El_Salvador
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Ensenada.ics b/zoneinfo/America/Ensenada.ics
index 2141774b..20014d51 100644
--- a/zoneinfo/America/Ensenada.ics
+++ b/zoneinfo/America/Ensenada.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Tijuana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Tijuana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Tijuana
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/America/Fort_Nelson.ics b/zoneinfo/America/Fort_Nelson.ics
index 37e44f6b..eb11bec4 100644
--- a/zoneinfo/America/Fort_Nelson.ics
+++ b/zoneinfo/America/Fort_Nelson.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Fort_Nelson
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Fort_Nelson
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Fort_Nelson
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Fort_Wayne.ics b/zoneinfo/America/Fort_Wayne.ics
index 7db2a7f7..15781f51 100644
--- a/zoneinfo/America/Fort_Wayne.ics
+++ b/zoneinfo/America/Fort_Wayne.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Indianapolis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Indianapolis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Indianapolis
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Fortaleza.ics b/zoneinfo/America/Fortaleza.ics
index ed40decd..904aaa09 100644
--- a/zoneinfo/America/Fortaleza.ics
+++ b/zoneinfo/America/Fortaleza.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Fortaleza
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Fortaleza
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Fortaleza
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Glace_Bay.ics b/zoneinfo/America/Glace_Bay.ics
index 45398b85..9caf7d8c 100644
--- a/zoneinfo/America/Glace_Bay.ics
+++ b/zoneinfo/America/Glace_Bay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Glace_Bay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Glace_Bay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Glace_Bay
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/America/Godthab.ics b/zoneinfo/America/Godthab.ics
index 23077e13..c6d55d33 100644
--- a/zoneinfo/America/Godthab.ics
+++ b/zoneinfo/America/Godthab.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Nuuk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Nuuk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Nuuk
BEGIN:DAYLIGHT
TZNAME:-02
diff --git a/zoneinfo/America/Goose_Bay.ics b/zoneinfo/America/Goose_Bay.ics
index 56520134..8ea92acd 100644
--- a/zoneinfo/America/Goose_Bay.ics
+++ b/zoneinfo/America/Goose_Bay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Goose_Bay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Goose_Bay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Goose_Bay
BEGIN:STANDARD
TZNAME:AST
diff --git a/zoneinfo/America/Grand_Turk.ics b/zoneinfo/America/Grand_Turk.ics
index 20b0ed93..0f10eeda 100644
--- a/zoneinfo/America/Grand_Turk.ics
+++ b/zoneinfo/America/Grand_Turk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Grand_Turk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Grand_Turk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Grand_Turk
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Grenada.ics b/zoneinfo/America/Grenada.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Grenada.ics
+++ b/zoneinfo/America/Grenada.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Guadeloupe.ics b/zoneinfo/America/Guadeloupe.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Guadeloupe.ics
+++ b/zoneinfo/America/Guadeloupe.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Guatemala.ics b/zoneinfo/America/Guatemala.ics
index e19110e8..299ea55f 100644
--- a/zoneinfo/America/Guatemala.ics
+++ b/zoneinfo/America/Guatemala.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Guatemala
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Guatemala
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Guatemala
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Guayaquil.ics b/zoneinfo/America/Guayaquil.ics
index 0c2a114c..443405fb 100644
--- a/zoneinfo/America/Guayaquil.ics
+++ b/zoneinfo/America/Guayaquil.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Guayaquil
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Guayaquil
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Guayaquil
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/Guyana.ics b/zoneinfo/America/Guyana.ics
index 867f8404..b48e8074 100644
--- a/zoneinfo/America/Guyana.ics
+++ b/zoneinfo/America/Guyana.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Guyana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Guyana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Guyana
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Halifax.ics b/zoneinfo/America/Halifax.ics
index 101ec547..f6933249 100644
--- a/zoneinfo/America/Halifax.ics
+++ b/zoneinfo/America/Halifax.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Halifax
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Halifax
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Halifax
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/America/Havana.ics b/zoneinfo/America/Havana.ics
index 484d9735..edd18faa 100644
--- a/zoneinfo/America/Havana.ics
+++ b/zoneinfo/America/Havana.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Havana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Havana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Havana
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Hermosillo.ics b/zoneinfo/America/Hermosillo.ics
index db15b5ca..c5357ce1 100644
--- a/zoneinfo/America/Hermosillo.ics
+++ b/zoneinfo/America/Hermosillo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Hermosillo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Hermosillo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Hermosillo
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Indiana/Indianapolis.ics b/zoneinfo/America/Indiana/Indianapolis.ics
index 7db2a7f7..15781f51 100644
--- a/zoneinfo/America/Indiana/Indianapolis.ics
+++ b/zoneinfo/America/Indiana/Indianapolis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Indianapolis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Indianapolis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Indianapolis
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Indiana/Knox.ics b/zoneinfo/America/Indiana/Knox.ics
index 073fb48b..7c457cc5 100644
--- a/zoneinfo/America/Indiana/Knox.ics
+++ b/zoneinfo/America/Indiana/Knox.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Knox
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Knox
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Knox
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Indiana/Marengo.ics b/zoneinfo/America/Indiana/Marengo.ics
index 6eabcad0..15d0245f 100644
--- a/zoneinfo/America/Indiana/Marengo.ics
+++ b/zoneinfo/America/Indiana/Marengo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Marengo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Marengo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Marengo
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Indiana/Petersburg.ics b/zoneinfo/America/Indiana/Petersburg.ics
index 583c230c..1cad4d11 100644
--- a/zoneinfo/America/Indiana/Petersburg.ics
+++ b/zoneinfo/America/Indiana/Petersburg.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Petersburg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Petersburg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Petersburg
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Indiana/Tell_City.ics b/zoneinfo/America/Indiana/Tell_City.ics
index f44d128b..06f07d69 100644
--- a/zoneinfo/America/Indiana/Tell_City.ics
+++ b/zoneinfo/America/Indiana/Tell_City.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Tell_City
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Tell_City
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Tell_City
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Indiana/Vevay.ics b/zoneinfo/America/Indiana/Vevay.ics
index 42f7748e..5f3f3140 100644
--- a/zoneinfo/America/Indiana/Vevay.ics
+++ b/zoneinfo/America/Indiana/Vevay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Vevay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Vevay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Vevay
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Indiana/Vincennes.ics b/zoneinfo/America/Indiana/Vincennes.ics
index 9ee54d73..e3ebf17c 100644
--- a/zoneinfo/America/Indiana/Vincennes.ics
+++ b/zoneinfo/America/Indiana/Vincennes.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Vincennes
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Vincennes
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Vincennes
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Indiana/Winamac.ics b/zoneinfo/America/Indiana/Winamac.ics
index f73eab96..0439be03 100644
--- a/zoneinfo/America/Indiana/Winamac.ics
+++ b/zoneinfo/America/Indiana/Winamac.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Winamac
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Winamac
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Winamac
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Indianapolis.ics b/zoneinfo/America/Indianapolis.ics
index 7db2a7f7..15781f51 100644
--- a/zoneinfo/America/Indianapolis.ics
+++ b/zoneinfo/America/Indianapolis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Indianapolis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Indianapolis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Indianapolis
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Inuvik.ics b/zoneinfo/America/Inuvik.ics
index a0841d71..d013fc13 100644
--- a/zoneinfo/America/Inuvik.ics
+++ b/zoneinfo/America/Inuvik.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Inuvik
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Inuvik
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Inuvik
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Iqaluit.ics b/zoneinfo/America/Iqaluit.ics
index ebe0e3ee..0f905d4a 100644
--- a/zoneinfo/America/Iqaluit.ics
+++ b/zoneinfo/America/Iqaluit.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Iqaluit
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Iqaluit
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Iqaluit
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Jamaica.ics b/zoneinfo/America/Jamaica.ics
index 1ef6b2d3..286f140f 100644
--- a/zoneinfo/America/Jamaica.ics
+++ b/zoneinfo/America/Jamaica.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Jamaica
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Jamaica
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Jamaica
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Jujuy.ics b/zoneinfo/America/Jujuy.ics
index 4c23bfc6..e616bab5 100644
--- a/zoneinfo/America/Jujuy.ics
+++ b/zoneinfo/America/Jujuy.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Jujuy
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Jujuy
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Jujuy
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Juneau.ics b/zoneinfo/America/Juneau.ics
index 689a6d6d..ec3815f6 100644
--- a/zoneinfo/America/Juneau.ics
+++ b/zoneinfo/America/Juneau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Juneau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Juneau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Juneau
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/Kentucky/Louisville.ics b/zoneinfo/America/Kentucky/Louisville.ics
index ff489d98..e854ce8f 100644
--- a/zoneinfo/America/Kentucky/Louisville.ics
+++ b/zoneinfo/America/Kentucky/Louisville.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Kentucky/Louisville
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Kentucky/Louisville
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Kentucky/Louisville
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Kentucky/Monticello.ics b/zoneinfo/America/Kentucky/Monticello.ics
index b4921d3f..e0e640d5 100644
--- a/zoneinfo/America/Kentucky/Monticello.ics
+++ b/zoneinfo/America/Kentucky/Monticello.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Kentucky/Monticello
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Kentucky/Monticello
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Kentucky/Monticello
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Knox_IN.ics b/zoneinfo/America/Knox_IN.ics
index 073fb48b..7c457cc5 100644
--- a/zoneinfo/America/Knox_IN.ics
+++ b/zoneinfo/America/Knox_IN.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Knox
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Knox
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Knox
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Kralendijk.ics b/zoneinfo/America/Kralendijk.ics
index 271b60a4..c0bfd092 100644
--- a/zoneinfo/America/Kralendijk.ics
+++ b/zoneinfo/America/Kralendijk.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Curacao
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Curacao
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/La_Paz.ics b/zoneinfo/America/La_Paz.ics
index 5178e1a3..19a37eab 100644
--- a/zoneinfo/America/La_Paz.ics
+++ b/zoneinfo/America/La_Paz.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/La_Paz
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/La_Paz
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/La_Paz
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Lima.ics b/zoneinfo/America/Lima.ics
index f30e4864..fa258cda 100644
--- a/zoneinfo/America/Lima.ics
+++ b/zoneinfo/America/Lima.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Lima
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Lima
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Lima
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/Los_Angeles.ics b/zoneinfo/America/Los_Angeles.ics
index d495ce63..02d2810c 100644
--- a/zoneinfo/America/Los_Angeles.ics
+++ b/zoneinfo/America/Los_Angeles.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Los_Angeles
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Los_Angeles
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Los_Angeles
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/America/Louisville.ics b/zoneinfo/America/Louisville.ics
index ff489d98..e854ce8f 100644
--- a/zoneinfo/America/Louisville.ics
+++ b/zoneinfo/America/Louisville.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Kentucky/Louisville
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Kentucky/Louisville
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Kentucky/Louisville
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Lower_Princes.ics b/zoneinfo/America/Lower_Princes.ics
index 271b60a4..c0bfd092 100644
--- a/zoneinfo/America/Lower_Princes.ics
+++ b/zoneinfo/America/Lower_Princes.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Curacao
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Curacao
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Maceio.ics b/zoneinfo/America/Maceio.ics
index ddad13b5..6e6a4111 100644
--- a/zoneinfo/America/Maceio.ics
+++ b/zoneinfo/America/Maceio.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Maceio
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Maceio
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Maceio
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Managua.ics b/zoneinfo/America/Managua.ics
index 1326f2c1..496cd898 100644
--- a/zoneinfo/America/Managua.ics
+++ b/zoneinfo/America/Managua.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Managua
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Managua
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Managua
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Manaus.ics b/zoneinfo/America/Manaus.ics
index 63581145..3afb9f05 100644
--- a/zoneinfo/America/Manaus.ics
+++ b/zoneinfo/America/Manaus.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Manaus
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Manaus
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Manaus
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Marigot.ics b/zoneinfo/America/Marigot.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Marigot.ics
+++ b/zoneinfo/America/Marigot.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Martinique.ics b/zoneinfo/America/Martinique.ics
index a6327388..aff1a416 100644
--- a/zoneinfo/America/Martinique.ics
+++ b/zoneinfo/America/Martinique.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Martinique
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Martinique
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Martinique
BEGIN:STANDARD
TZNAME:AST
diff --git a/zoneinfo/America/Matamoros.ics b/zoneinfo/America/Matamoros.ics
index 2dc8d8d3..453c5d8d 100644
--- a/zoneinfo/America/Matamoros.ics
+++ b/zoneinfo/America/Matamoros.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Matamoros
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Matamoros
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Matamoros
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Mazatlan.ics b/zoneinfo/America/Mazatlan.ics
index 79e4194b..d859310b 100644
--- a/zoneinfo/America/Mazatlan.ics
+++ b/zoneinfo/America/Mazatlan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Mazatlan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Mazatlan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Mazatlan
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Mendoza.ics b/zoneinfo/America/Mendoza.ics
index a9905fbd..5f58bc2c 100644
--- a/zoneinfo/America/Mendoza.ics
+++ b/zoneinfo/America/Mendoza.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Mendoza
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Mendoza
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Mendoza
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Menominee.ics b/zoneinfo/America/Menominee.ics
index 8e7ef100..1f0f8d15 100644
--- a/zoneinfo/America/Menominee.ics
+++ b/zoneinfo/America/Menominee.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Menominee
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Menominee
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Menominee
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Merida.ics b/zoneinfo/America/Merida.ics
index 7b1d3093..bbb50789 100644
--- a/zoneinfo/America/Merida.ics
+++ b/zoneinfo/America/Merida.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Merida
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Merida
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Merida
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Metlakatla.ics b/zoneinfo/America/Metlakatla.ics
index 123782d4..cd2bbe09 100644
--- a/zoneinfo/America/Metlakatla.ics
+++ b/zoneinfo/America/Metlakatla.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Metlakatla
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Metlakatla
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Metlakatla
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/Mexico_City.ics b/zoneinfo/America/Mexico_City.ics
index 8f72edb3..c869740c 100644
--- a/zoneinfo/America/Mexico_City.ics
+++ b/zoneinfo/America/Mexico_City.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Mexico_City
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Mexico_City
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Mexico_City
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Miquelon.ics b/zoneinfo/America/Miquelon.ics
index 4659376d..6b35eb1f 100644
--- a/zoneinfo/America/Miquelon.ics
+++ b/zoneinfo/America/Miquelon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Miquelon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Miquelon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Miquelon
BEGIN:DAYLIGHT
TZNAME:-02
diff --git a/zoneinfo/America/Moncton.ics b/zoneinfo/America/Moncton.ics
index a28b78e8..7db45fba 100644
--- a/zoneinfo/America/Moncton.ics
+++ b/zoneinfo/America/Moncton.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Moncton
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Moncton
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Moncton
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/America/Monterrey.ics b/zoneinfo/America/Monterrey.ics
index 067c88a6..f76c3e6e 100644
--- a/zoneinfo/America/Monterrey.ics
+++ b/zoneinfo/America/Monterrey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Monterrey
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Monterrey
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Monterrey
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Montevideo.ics b/zoneinfo/America/Montevideo.ics
index 2b2f793b..e958c4ba 100644
--- a/zoneinfo/America/Montevideo.ics
+++ b/zoneinfo/America/Montevideo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Montevideo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Montevideo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Montevideo
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Montreal.ics b/zoneinfo/America/Montreal.ics
index 185ff4b4..811a6158 100644
--- a/zoneinfo/America/Montreal.ics
+++ b/zoneinfo/America/Montreal.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Toronto
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Toronto
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Toronto
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Montserrat.ics b/zoneinfo/America/Montserrat.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Montserrat.ics
+++ b/zoneinfo/America/Montserrat.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Nassau.ics b/zoneinfo/America/Nassau.ics
index 5236f602..811a6158 100644
--- a/zoneinfo/America/Nassau.ics
+++ b/zoneinfo/America/Nassau.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Nassau
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Nassau
+TZID:/citadel.org/20211207_1/America/Toronto
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Toronto
BEGIN:DAYLIGHT
TZNAME:EDT
TZOFFSETFROM:-0500
diff --git a/zoneinfo/America/New_York.ics b/zoneinfo/America/New_York.ics
index 29ac5969..3738a5bb 100644
--- a/zoneinfo/America/New_York.ics
+++ b/zoneinfo/America/New_York.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/New_York
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/New_York
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Nipigon.ics b/zoneinfo/America/Nipigon.ics
index 2102e545..2ab99168 100644
--- a/zoneinfo/America/Nipigon.ics
+++ b/zoneinfo/America/Nipigon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Nipigon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Nipigon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Nipigon
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Nome.ics b/zoneinfo/America/Nome.ics
index f054fd86..4e7c7534 100644
--- a/zoneinfo/America/Nome.ics
+++ b/zoneinfo/America/Nome.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Nome
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Nome
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Nome
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/Noronha.ics b/zoneinfo/America/Noronha.ics
index 580b9364..e663fd80 100644
--- a/zoneinfo/America/Noronha.ics
+++ b/zoneinfo/America/Noronha.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Noronha
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Noronha
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Noronha
BEGIN:STANDARD
TZNAME:-02
diff --git a/zoneinfo/America/North_Dakota/Beulah.ics b/zoneinfo/America/North_Dakota/Beulah.ics
index 7c59bcc5..065b7ce0 100644
--- a/zoneinfo/America/North_Dakota/Beulah.ics
+++ b/zoneinfo/America/North_Dakota/Beulah.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/North_Dakota/Beulah
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/North_Dakota/Beulah
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/North_Dakota/Beulah
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/North_Dakota/Center.ics b/zoneinfo/America/North_Dakota/Center.ics
index 5c88f1f5..2e184d51 100644
--- a/zoneinfo/America/North_Dakota/Center.ics
+++ b/zoneinfo/America/North_Dakota/Center.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/North_Dakota/Center
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/North_Dakota/Center
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/North_Dakota/Center
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/North_Dakota/New_Salem.ics b/zoneinfo/America/North_Dakota/New_Salem.ics
index 15e9f24d..f84a1981 100644
--- a/zoneinfo/America/North_Dakota/New_Salem.ics
+++ b/zoneinfo/America/North_Dakota/New_Salem.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/North_Dakota/New_Salem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/North_Dakota/New_Salem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/North_Dakota/New_Salem
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Nuuk.ics b/zoneinfo/America/Nuuk.ics
index 23077e13..c6d55d33 100644
--- a/zoneinfo/America/Nuuk.ics
+++ b/zoneinfo/America/Nuuk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Nuuk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Nuuk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Nuuk
BEGIN:DAYLIGHT
TZNAME:-02
diff --git a/zoneinfo/America/Ojinaga.ics b/zoneinfo/America/Ojinaga.ics
index 9d667506..db45d8dc 100644
--- a/zoneinfo/America/Ojinaga.ics
+++ b/zoneinfo/America/Ojinaga.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Ojinaga
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Ojinaga
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Ojinaga
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Panama.ics b/zoneinfo/America/Panama.ics
index 99d0d48e..83c840b3 100644
--- a/zoneinfo/America/Panama.ics
+++ b/zoneinfo/America/Panama.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Panama
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Panama
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Panama
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/America/Pangnirtung.ics b/zoneinfo/America/Pangnirtung.ics
index 605243b5..1fbdd179 100644
--- a/zoneinfo/America/Pangnirtung.ics
+++ b/zoneinfo/America/Pangnirtung.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Pangnirtung
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Pangnirtung
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Pangnirtung
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Paramaribo.ics b/zoneinfo/America/Paramaribo.ics
index 5811b7a6..d308a10e 100644
--- a/zoneinfo/America/Paramaribo.ics
+++ b/zoneinfo/America/Paramaribo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Paramaribo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Paramaribo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Paramaribo
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Phoenix.ics b/zoneinfo/America/Phoenix.ics
index df6a2521..93db33c3 100644
--- a/zoneinfo/America/Phoenix.ics
+++ b/zoneinfo/America/Phoenix.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Phoenix
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Phoenix
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Phoenix
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Port-au-Prince.ics b/zoneinfo/America/Port-au-Prince.ics
index 5061e561..dd032d14 100644
--- a/zoneinfo/America/Port-au-Prince.ics
+++ b/zoneinfo/America/Port-au-Prince.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port-au-Prince
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Port-au-Prince
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Port-au-Prince
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Port_of_Spain.ics b/zoneinfo/America/Port_of_Spain.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Port_of_Spain.ics
+++ b/zoneinfo/America/Port_of_Spain.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Porto_Acre.ics b/zoneinfo/America/Porto_Acre.ics
index 3d4c27fb..4b1798f8 100644
--- a/zoneinfo/America/Porto_Acre.ics
+++ b/zoneinfo/America/Porto_Acre.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Rio_Branco
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Rio_Branco
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Rio_Branco
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/Porto_Velho.ics b/zoneinfo/America/Porto_Velho.ics
index 567f4d5d..657b0931 100644
--- a/zoneinfo/America/Porto_Velho.ics
+++ b/zoneinfo/America/Porto_Velho.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Porto_Velho
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Porto_Velho
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Porto_Velho
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Puerto_Rico.ics b/zoneinfo/America/Puerto_Rico.ics
index 78455c01..c0bfd092 100644
--- a/zoneinfo/America/Puerto_Rico.ics
+++ b/zoneinfo/America/Puerto_Rico.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Puerto_Rico
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
diff --git a/zoneinfo/America/Punta_Arenas.ics b/zoneinfo/America/Punta_Arenas.ics
index 23692b25..6dda7c15 100644
--- a/zoneinfo/America/Punta_Arenas.ics
+++ b/zoneinfo/America/Punta_Arenas.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Punta_Arenas
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Punta_Arenas
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Punta_Arenas
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Rainy_River.ics b/zoneinfo/America/Rainy_River.ics
index cf58ef93..983495fc 100644
--- a/zoneinfo/America/Rainy_River.ics
+++ b/zoneinfo/America/Rainy_River.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Rainy_River
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Rainy_River
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Rainy_River
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Rankin_Inlet.ics b/zoneinfo/America/Rankin_Inlet.ics
index 81bf62a9..20c60e30 100644
--- a/zoneinfo/America/Rankin_Inlet.ics
+++ b/zoneinfo/America/Rankin_Inlet.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Rankin_Inlet
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Rankin_Inlet
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Rankin_Inlet
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Recife.ics b/zoneinfo/America/Recife.ics
index bcc36dbd..39d1e3a6 100644
--- a/zoneinfo/America/Recife.ics
+++ b/zoneinfo/America/Recife.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Recife
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Recife
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Recife
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Regina.ics b/zoneinfo/America/Regina.ics
index c15afef0..b6b0b770 100644
--- a/zoneinfo/America/Regina.ics
+++ b/zoneinfo/America/Regina.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Regina
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Regina
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Regina
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Resolute.ics b/zoneinfo/America/Resolute.ics
index 377e8e3b..37c080b5 100644
--- a/zoneinfo/America/Resolute.ics
+++ b/zoneinfo/America/Resolute.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Resolute
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Resolute
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Resolute
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Rio_Branco.ics b/zoneinfo/America/Rio_Branco.ics
index 3d4c27fb..4b1798f8 100644
--- a/zoneinfo/America/Rio_Branco.ics
+++ b/zoneinfo/America/Rio_Branco.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Rio_Branco
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Rio_Branco
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Rio_Branco
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/America/Rosario.ics b/zoneinfo/America/Rosario.ics
index 3f2b8e1e..deccae2d 100644
--- a/zoneinfo/America/Rosario.ics
+++ b/zoneinfo/America/Rosario.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Argentina/Cordoba
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Argentina/Cordoba
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Argentina/Cordoba
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Santa_Isabel.ics b/zoneinfo/America/Santa_Isabel.ics
index 2141774b..20014d51 100644
--- a/zoneinfo/America/Santa_Isabel.ics
+++ b/zoneinfo/America/Santa_Isabel.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Tijuana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Tijuana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Tijuana
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/America/Santarem.ics b/zoneinfo/America/Santarem.ics
index 340957cd..255a203e 100644
--- a/zoneinfo/America/Santarem.ics
+++ b/zoneinfo/America/Santarem.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Santarem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Santarem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Santarem
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Santiago.ics b/zoneinfo/America/Santiago.ics
index b6c15aa8..e96b1501 100644
--- a/zoneinfo/America/Santiago.ics
+++ b/zoneinfo/America/Santiago.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Santiago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Santiago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Santiago
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/America/Santo_Domingo.ics b/zoneinfo/America/Santo_Domingo.ics
index 7c03ec86..abf14b27 100644
--- a/zoneinfo/America/Santo_Domingo.ics
+++ b/zoneinfo/America/Santo_Domingo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Santo_Domingo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Santo_Domingo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Santo_Domingo
BEGIN:STANDARD
TZNAME:AST
diff --git a/zoneinfo/America/Sao_Paulo.ics b/zoneinfo/America/Sao_Paulo.ics
index 16996961..8ff52510 100644
--- a/zoneinfo/America/Sao_Paulo.ics
+++ b/zoneinfo/America/Sao_Paulo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Sao_Paulo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Sao_Paulo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Sao_Paulo
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/America/Scoresbysund.ics b/zoneinfo/America/Scoresbysund.ics
index a8992e1b..72127d81 100644
--- a/zoneinfo/America/Scoresbysund.ics
+++ b/zoneinfo/America/Scoresbysund.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Scoresbysund
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Scoresbysund
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Scoresbysund
BEGIN:DAYLIGHT
TZNAME:+00
diff --git a/zoneinfo/America/Shiprock.ics b/zoneinfo/America/Shiprock.ics
index 79d6ba54..76584cb4 100644
--- a/zoneinfo/America/Shiprock.ics
+++ b/zoneinfo/America/Shiprock.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Denver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Denver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/America/Sitka.ics b/zoneinfo/America/Sitka.ics
index 9d22ddb8..cd19b61c 100644
--- a/zoneinfo/America/Sitka.ics
+++ b/zoneinfo/America/Sitka.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Sitka
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Sitka
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Sitka
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/St_Barthelemy.ics b/zoneinfo/America/St_Barthelemy.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/St_Barthelemy.ics
+++ b/zoneinfo/America/St_Barthelemy.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/St_Johns.ics b/zoneinfo/America/St_Johns.ics
index 7095decf..584f3300 100644
--- a/zoneinfo/America/St_Johns.ics
+++ b/zoneinfo/America/St_Johns.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/St_Johns
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/St_Johns
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/St_Johns
BEGIN:STANDARD
TZNAME:NST
diff --git a/zoneinfo/America/St_Kitts.ics b/zoneinfo/America/St_Kitts.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/St_Kitts.ics
+++ b/zoneinfo/America/St_Kitts.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/St_Lucia.ics b/zoneinfo/America/St_Lucia.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/St_Lucia.ics
+++ b/zoneinfo/America/St_Lucia.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/St_Thomas.ics b/zoneinfo/America/St_Thomas.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/St_Thomas.ics
+++ b/zoneinfo/America/St_Thomas.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/St_Vincent.ics b/zoneinfo/America/St_Vincent.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/St_Vincent.ics
+++ b/zoneinfo/America/St_Vincent.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Swift_Current.ics b/zoneinfo/America/Swift_Current.ics
index 08976621..3a864298 100644
--- a/zoneinfo/America/Swift_Current.ics
+++ b/zoneinfo/America/Swift_Current.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Swift_Current
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Swift_Current
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Swift_Current
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Tegucigalpa.ics b/zoneinfo/America/Tegucigalpa.ics
index 8ed7c4f7..8b881b50 100644
--- a/zoneinfo/America/Tegucigalpa.ics
+++ b/zoneinfo/America/Tegucigalpa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Tegucigalpa
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Tegucigalpa
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Tegucigalpa
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/America/Thule.ics b/zoneinfo/America/Thule.ics
index 326ec0fb..efa6f8f7 100644
--- a/zoneinfo/America/Thule.ics
+++ b/zoneinfo/America/Thule.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Thule
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Thule
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Thule
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/America/Thunder_Bay.ics b/zoneinfo/America/Thunder_Bay.ics
index c1ed1208..52f568bd 100644
--- a/zoneinfo/America/Thunder_Bay.ics
+++ b/zoneinfo/America/Thunder_Bay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Thunder_Bay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Thunder_Bay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Thunder_Bay
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Tijuana.ics b/zoneinfo/America/Tijuana.ics
index 2141774b..20014d51 100644
--- a/zoneinfo/America/Tijuana.ics
+++ b/zoneinfo/America/Tijuana.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Tijuana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Tijuana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Tijuana
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/America/Toronto.ics b/zoneinfo/America/Toronto.ics
index 185ff4b4..811a6158 100644
--- a/zoneinfo/America/Toronto.ics
+++ b/zoneinfo/America/Toronto.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Toronto
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Toronto
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Toronto
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/America/Tortola.ics b/zoneinfo/America/Tortola.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Tortola.ics
+++ b/zoneinfo/America/Tortola.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Vancouver.ics b/zoneinfo/America/Vancouver.ics
index 10446a77..d7a912c4 100644
--- a/zoneinfo/America/Vancouver.ics
+++ b/zoneinfo/America/Vancouver.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Vancouver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Vancouver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Vancouver
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/America/Virgin.ics b/zoneinfo/America/Virgin.ics
index 04cce7a2..c0bfd092 100644
--- a/zoneinfo/America/Virgin.ics
+++ b/zoneinfo/America/Virgin.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Port_of_Spain
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:America/Port_of_Spain
+TZID:/citadel.org/20211207_1/America/Puerto_Rico
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:America/Puerto_Rico
BEGIN:STANDARD
TZNAME:AST
TZOFFSETFROM:-0400
diff --git a/zoneinfo/America/Whitehorse.ics b/zoneinfo/America/Whitehorse.ics
index 26ea5165..0e1383ce 100644
--- a/zoneinfo/America/Whitehorse.ics
+++ b/zoneinfo/America/Whitehorse.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Whitehorse
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Whitehorse
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Whitehorse
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/America/Winnipeg.ics b/zoneinfo/America/Winnipeg.ics
index d755f390..8dcd6087 100644
--- a/zoneinfo/America/Winnipeg.ics
+++ b/zoneinfo/America/Winnipeg.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Winnipeg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Winnipeg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Winnipeg
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/America/Yakutat.ics b/zoneinfo/America/Yakutat.ics
index db93ca30..0011f634 100644
--- a/zoneinfo/America/Yakutat.ics
+++ b/zoneinfo/America/Yakutat.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Yakutat
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Yakutat
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Yakutat
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/America/Yellowknife.ics b/zoneinfo/America/Yellowknife.ics
index 7d113141..5bcfdc71 100644
--- a/zoneinfo/America/Yellowknife.ics
+++ b/zoneinfo/America/Yellowknife.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Yellowknife
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Yellowknife
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Yellowknife
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/Antarctica/Casey.ics b/zoneinfo/Antarctica/Casey.ics
index 1785ccbe..96b2f648 100644
--- a/zoneinfo/Antarctica/Casey.ics
+++ b/zoneinfo/Antarctica/Casey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Casey
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Casey
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Casey
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Antarctica/Davis.ics b/zoneinfo/Antarctica/Davis.ics
index 9a78ae4f..3c92e40d 100644
--- a/zoneinfo/Antarctica/Davis.ics
+++ b/zoneinfo/Antarctica/Davis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Davis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Davis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Davis
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Antarctica/DumontDUrville.ics b/zoneinfo/Antarctica/DumontDUrville.ics
index bee30c41..07460e5e 100644
--- a/zoneinfo/Antarctica/DumontDUrville.ics
+++ b/zoneinfo/Antarctica/DumontDUrville.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/DumontDUrville
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:Antarctica/DumontDUrville
+TZID:/citadel.org/20211207_1/Pacific/Port_Moresby
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:Pacific/Port_Moresby
BEGIN:STANDARD
TZNAME:+10
TZOFFSETFROM:+1000
diff --git a/zoneinfo/Antarctica/Macquarie.ics b/zoneinfo/Antarctica/Macquarie.ics
index 6d462bf3..d88fa75b 100644
--- a/zoneinfo/Antarctica/Macquarie.ics
+++ b/zoneinfo/Antarctica/Macquarie.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Macquarie
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Macquarie
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Macquarie
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Antarctica/Mawson.ics b/zoneinfo/Antarctica/Mawson.ics
index 462c8d85..752acbd6 100644
--- a/zoneinfo/Antarctica/Mawson.ics
+++ b/zoneinfo/Antarctica/Mawson.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Mawson
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Mawson
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Mawson
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Antarctica/McMurdo.ics b/zoneinfo/Antarctica/McMurdo.ics
index 22f2072d..ae1b4b12 100644
--- a/zoneinfo/Antarctica/McMurdo.ics
+++ b/zoneinfo/Antarctica/McMurdo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Auckland
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Auckland
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Auckland
BEGIN:DAYLIGHT
TZNAME:NZDT
diff --git a/zoneinfo/Antarctica/Palmer.ics b/zoneinfo/Antarctica/Palmer.ics
index 7f70c8d1..4845bd24 100644
--- a/zoneinfo/Antarctica/Palmer.ics
+++ b/zoneinfo/Antarctica/Palmer.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Palmer
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Palmer
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Palmer
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/Antarctica/Rothera.ics b/zoneinfo/Antarctica/Rothera.ics
index e0af89e4..faea198f 100644
--- a/zoneinfo/Antarctica/Rothera.ics
+++ b/zoneinfo/Antarctica/Rothera.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Rothera
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Rothera
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Rothera
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/Antarctica/South_Pole.ics b/zoneinfo/Antarctica/South_Pole.ics
index 22f2072d..ae1b4b12 100644
--- a/zoneinfo/Antarctica/South_Pole.ics
+++ b/zoneinfo/Antarctica/South_Pole.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Auckland
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Auckland
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Auckland
BEGIN:DAYLIGHT
TZNAME:NZDT
diff --git a/zoneinfo/Antarctica/Syowa.ics b/zoneinfo/Antarctica/Syowa.ics
index a4584cd2..748c16c4 100644
--- a/zoneinfo/Antarctica/Syowa.ics
+++ b/zoneinfo/Antarctica/Syowa.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Syowa
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:Antarctica/Syowa
+TZID:/citadel.org/20211207_1/Asia/Riyadh
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:Asia/Riyadh
BEGIN:STANDARD
TZNAME:+03
TZOFFSETFROM:+0300
diff --git a/zoneinfo/Antarctica/Troll.ics b/zoneinfo/Antarctica/Troll.ics
index 7175a335..d5b6ba3a 100644
--- a/zoneinfo/Antarctica/Troll.ics
+++ b/zoneinfo/Antarctica/Troll.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Troll
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Troll
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Troll
BEGIN:DAYLIGHT
TZNAME:+02
diff --git a/zoneinfo/Antarctica/Vostok.ics b/zoneinfo/Antarctica/Vostok.ics
index 5af48a09..61444977 100644
--- a/zoneinfo/Antarctica/Vostok.ics
+++ b/zoneinfo/Antarctica/Vostok.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Antarctica/Vostok
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Antarctica/Vostok
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Antarctica/Vostok
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Arctic/Longyearbyen.ics b/zoneinfo/Arctic/Longyearbyen.ics
index e337e96f..8274486e 100644
--- a/zoneinfo/Arctic/Longyearbyen.ics
+++ b/zoneinfo/Arctic/Longyearbyen.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Oslo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Oslo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Oslo
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Asia/Aden.ics b/zoneinfo/Asia/Aden.ics
index cde808f1..748c16c4 100644
--- a/zoneinfo/Asia/Aden.ics
+++ b/zoneinfo/Asia/Aden.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Riyadh
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Riyadh
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Riyadh
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Almaty.ics b/zoneinfo/Asia/Almaty.ics
index 8fb330dc..22e30583 100644
--- a/zoneinfo/Asia/Almaty.ics
+++ b/zoneinfo/Asia/Almaty.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Almaty
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Almaty
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Almaty
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Amman.ics b/zoneinfo/Asia/Amman.ics
index f1264538..93bf0d2f 100644
--- a/zoneinfo/Asia/Amman.ics
+++ b/zoneinfo/Asia/Amman.ics
@@ -2,16 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Amman
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Amman
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Amman
-BEGIN:DAYLIGHT
-TZNAME:EEST
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0300
-DTSTART:19700327T000000
-RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR
-END:DAYLIGHT
BEGIN:STANDARD
TZNAME:EET
TZOFFSETFROM:+0300
@@ -19,5 +12,12 @@ TZOFFSETTO:+0200
DTSTART:19701030T010000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR
END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EEST
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0300
+DTSTART:19700227T000000
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=-1FR
+END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
diff --git a/zoneinfo/Asia/Anadyr.ics b/zoneinfo/Asia/Anadyr.ics
index 715a86b1..b220cc3f 100644
--- a/zoneinfo/Asia/Anadyr.ics
+++ b/zoneinfo/Asia/Anadyr.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Anadyr
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Anadyr
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Anadyr
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Asia/Aqtau.ics b/zoneinfo/Asia/Aqtau.ics
index 9f5abdf7..406af0f6 100644
--- a/zoneinfo/Asia/Aqtau.ics
+++ b/zoneinfo/Asia/Aqtau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Aqtau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Aqtau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Aqtau
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Aqtobe.ics b/zoneinfo/Asia/Aqtobe.ics
index 8a56e617..e10823cf 100644
--- a/zoneinfo/Asia/Aqtobe.ics
+++ b/zoneinfo/Asia/Aqtobe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Aqtobe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Aqtobe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Aqtobe
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Ashgabat.ics b/zoneinfo/Asia/Ashgabat.ics
index 3b77e236..82b3a799 100644
--- a/zoneinfo/Asia/Ashgabat.ics
+++ b/zoneinfo/Asia/Ashgabat.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ashgabat
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ashgabat
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ashgabat
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Ashkhabad.ics b/zoneinfo/Asia/Ashkhabad.ics
index 3b77e236..82b3a799 100644
--- a/zoneinfo/Asia/Ashkhabad.ics
+++ b/zoneinfo/Asia/Ashkhabad.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ashgabat
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ashgabat
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ashgabat
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Atyrau.ics b/zoneinfo/Asia/Atyrau.ics
index a4405b94..7b05d9e4 100644
--- a/zoneinfo/Asia/Atyrau.ics
+++ b/zoneinfo/Asia/Atyrau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Atyrau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Atyrau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Atyrau
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Baghdad.ics b/zoneinfo/Asia/Baghdad.ics
index 375f09c6..30c84e4b 100644
--- a/zoneinfo/Asia/Baghdad.ics
+++ b/zoneinfo/Asia/Baghdad.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Baghdad
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Baghdad
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Baghdad
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Bahrain.ics b/zoneinfo/Asia/Bahrain.ics
index 8d9d581e..38144386 100644
--- a/zoneinfo/Asia/Bahrain.ics
+++ b/zoneinfo/Asia/Bahrain.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Qatar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Qatar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Qatar
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Baku.ics b/zoneinfo/Asia/Baku.ics
index b3275290..56f3d14d 100644
--- a/zoneinfo/Asia/Baku.ics
+++ b/zoneinfo/Asia/Baku.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Baku
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Baku
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Baku
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Asia/Bangkok.ics b/zoneinfo/Asia/Bangkok.ics
index ad63ebfb..2fbf4b07 100644
--- a/zoneinfo/Asia/Bangkok.ics
+++ b/zoneinfo/Asia/Bangkok.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Bangkok
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Bangkok
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Bangkok
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Barnaul.ics b/zoneinfo/Asia/Barnaul.ics
index a1a63893..c4c58d78 100644
--- a/zoneinfo/Asia/Barnaul.ics
+++ b/zoneinfo/Asia/Barnaul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Barnaul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Barnaul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Barnaul
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Beirut.ics b/zoneinfo/Asia/Beirut.ics
index 473e9972..8395923c 100644
--- a/zoneinfo/Asia/Beirut.ics
+++ b/zoneinfo/Asia/Beirut.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Beirut
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Beirut
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Beirut
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Asia/Bishkek.ics b/zoneinfo/Asia/Bishkek.ics
index 792506cd..ebcedea3 100644
--- a/zoneinfo/Asia/Bishkek.ics
+++ b/zoneinfo/Asia/Bishkek.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Bishkek
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Bishkek
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Bishkek
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Brunei.ics b/zoneinfo/Asia/Brunei.ics
index 519c1a76..58c1f397 100644
--- a/zoneinfo/Asia/Brunei.ics
+++ b/zoneinfo/Asia/Brunei.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Brunei
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Brunei
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Brunei
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Calcutta.ics b/zoneinfo/Asia/Calcutta.ics
index af969950..c7a9b1ed 100644
--- a/zoneinfo/Asia/Calcutta.ics
+++ b/zoneinfo/Asia/Calcutta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kolkata
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kolkata
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kolkata
BEGIN:STANDARD
TZNAME:IST
diff --git a/zoneinfo/Asia/Chita.ics b/zoneinfo/Asia/Chita.ics
index 889e683f..3e7dd00b 100644
--- a/zoneinfo/Asia/Chita.ics
+++ b/zoneinfo/Asia/Chita.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Chita
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Chita
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Chita
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Asia/Choibalsan.ics b/zoneinfo/Asia/Choibalsan.ics
index df8ac10d..e82b6534 100644
--- a/zoneinfo/Asia/Choibalsan.ics
+++ b/zoneinfo/Asia/Choibalsan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Choibalsan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Choibalsan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Choibalsan
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Chongqing.ics b/zoneinfo/Asia/Chongqing.ics
index ee91b6ac..6ef4af39 100644
--- a/zoneinfo/Asia/Chongqing.ics
+++ b/zoneinfo/Asia/Chongqing.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Shanghai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Shanghai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Chungking.ics b/zoneinfo/Asia/Chungking.ics
index ee91b6ac..6ef4af39 100644
--- a/zoneinfo/Asia/Chungking.ics
+++ b/zoneinfo/Asia/Chungking.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Shanghai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Shanghai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Colombo.ics b/zoneinfo/Asia/Colombo.ics
index dbc8bc6f..d181d7c7 100644
--- a/zoneinfo/Asia/Colombo.ics
+++ b/zoneinfo/Asia/Colombo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Colombo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Colombo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Colombo
BEGIN:STANDARD
TZNAME:+0530
diff --git a/zoneinfo/Asia/Dacca.ics b/zoneinfo/Asia/Dacca.ics
index 36c48804..427b99bb 100644
--- a/zoneinfo/Asia/Dacca.ics
+++ b/zoneinfo/Asia/Dacca.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dhaka
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dhaka
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dhaka
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Damascus.ics b/zoneinfo/Asia/Damascus.ics
index 005ef54d..c09d7db3 100644
--- a/zoneinfo/Asia/Damascus.ics
+++ b/zoneinfo/Asia/Damascus.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Damascus
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Damascus
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Damascus
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Asia/Dhaka.ics b/zoneinfo/Asia/Dhaka.ics
index 36c48804..427b99bb 100644
--- a/zoneinfo/Asia/Dhaka.ics
+++ b/zoneinfo/Asia/Dhaka.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dhaka
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dhaka
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dhaka
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Dili.ics b/zoneinfo/Asia/Dili.ics
index ead8e002..219df590 100644
--- a/zoneinfo/Asia/Dili.ics
+++ b/zoneinfo/Asia/Dili.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dili
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dili
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dili
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Asia/Dubai.ics b/zoneinfo/Asia/Dubai.ics
index 4c69cc35..ff025bd8 100644
--- a/zoneinfo/Asia/Dubai.ics
+++ b/zoneinfo/Asia/Dubai.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dubai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dubai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dubai
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Asia/Dushanbe.ics b/zoneinfo/Asia/Dushanbe.ics
index 2909e3aa..78f38045 100644
--- a/zoneinfo/Asia/Dushanbe.ics
+++ b/zoneinfo/Asia/Dushanbe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dushanbe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dushanbe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dushanbe
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Famagusta.ics b/zoneinfo/Asia/Famagusta.ics
index 79e838e5..990a6b78 100644
--- a/zoneinfo/Asia/Famagusta.ics
+++ b/zoneinfo/Asia/Famagusta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Famagusta
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Famagusta
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Famagusta
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Asia/Gaza.ics b/zoneinfo/Asia/Gaza.ics
index 268a4a50..4949a4d5 100644
--- a/zoneinfo/Asia/Gaza.ics
+++ b/zoneinfo/Asia/Gaza.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Gaza
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Gaza
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Gaza
BEGIN:DAYLIGHT
TZNAME:EEST
@@ -16,8 +16,8 @@ BEGIN:STANDARD
TZNAME:EET
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
-DTSTART:19701024T010000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA
+DTSTART:19701030T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
diff --git a/zoneinfo/Asia/Harbin.ics b/zoneinfo/Asia/Harbin.ics
index ee91b6ac..6ef4af39 100644
--- a/zoneinfo/Asia/Harbin.ics
+++ b/zoneinfo/Asia/Harbin.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Shanghai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Shanghai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Hebron.ics b/zoneinfo/Asia/Hebron.ics
index a90edf01..3774294f 100644
--- a/zoneinfo/Asia/Hebron.ics
+++ b/zoneinfo/Asia/Hebron.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Hebron
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Hebron
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Hebron
BEGIN:DAYLIGHT
TZNAME:EEST
@@ -16,8 +16,8 @@ BEGIN:STANDARD
TZNAME:EET
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
-DTSTART:19701024T010000
-RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA
+DTSTART:19701030T010000
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR
END:STANDARD
END:VTIMEZONE
END:VCALENDAR
diff --git a/zoneinfo/Asia/Ho_Chi_Minh.ics b/zoneinfo/Asia/Ho_Chi_Minh.ics
index 28c9106b..4ddfc2aa 100644
--- a/zoneinfo/Asia/Ho_Chi_Minh.ics
+++ b/zoneinfo/Asia/Ho_Chi_Minh.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ho_Chi_Minh
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ho_Chi_Minh
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ho_Chi_Minh
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Hong_Kong.ics b/zoneinfo/Asia/Hong_Kong.ics
index 4bb4603f..3795c449 100644
--- a/zoneinfo/Asia/Hong_Kong.ics
+++ b/zoneinfo/Asia/Hong_Kong.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Hong_Kong
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Hong_Kong
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Hong_Kong
BEGIN:STANDARD
TZNAME:HKT
diff --git a/zoneinfo/Asia/Hovd.ics b/zoneinfo/Asia/Hovd.ics
index 994e59d6..1774d0ac 100644
--- a/zoneinfo/Asia/Hovd.ics
+++ b/zoneinfo/Asia/Hovd.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Hovd
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Hovd
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Hovd
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Irkutsk.ics b/zoneinfo/Asia/Irkutsk.ics
index 04094c65..6b78b395 100644
--- a/zoneinfo/Asia/Irkutsk.ics
+++ b/zoneinfo/Asia/Irkutsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Irkutsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Irkutsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Irkutsk
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Istanbul.ics b/zoneinfo/Asia/Istanbul.ics
index 576ca49c..8234cbbb 100644
--- a/zoneinfo/Asia/Istanbul.ics
+++ b/zoneinfo/Asia/Istanbul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Istanbul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Istanbul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Istanbul
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Jakarta.ics b/zoneinfo/Asia/Jakarta.ics
index 15e66b13..b9c16aa3 100644
--- a/zoneinfo/Asia/Jakarta.ics
+++ b/zoneinfo/Asia/Jakarta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Jakarta
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Jakarta
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Jakarta
BEGIN:STANDARD
TZNAME:WIB
diff --git a/zoneinfo/Asia/Jayapura.ics b/zoneinfo/Asia/Jayapura.ics
index 06faa419..158e2cd3 100644
--- a/zoneinfo/Asia/Jayapura.ics
+++ b/zoneinfo/Asia/Jayapura.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Jayapura
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Jayapura
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Jayapura
BEGIN:STANDARD
TZNAME:WIT
diff --git a/zoneinfo/Asia/Jerusalem.ics b/zoneinfo/Asia/Jerusalem.ics
index f41a1c68..00e44fca 100644
--- a/zoneinfo/Asia/Jerusalem.ics
+++ b/zoneinfo/Asia/Jerusalem.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Jerusalem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Jerusalem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Jerusalem
BEGIN:DAYLIGHT
TZNAME:IDT
diff --git a/zoneinfo/Asia/Kabul.ics b/zoneinfo/Asia/Kabul.ics
index 9f0f8e01..c369590f 100644
--- a/zoneinfo/Asia/Kabul.ics
+++ b/zoneinfo/Asia/Kabul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kabul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kabul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kabul
BEGIN:STANDARD
TZNAME:+0430
diff --git a/zoneinfo/Asia/Kamchatka.ics b/zoneinfo/Asia/Kamchatka.ics
index 084875ed..37379528 100644
--- a/zoneinfo/Asia/Kamchatka.ics
+++ b/zoneinfo/Asia/Kamchatka.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kamchatka
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kamchatka
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kamchatka
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Asia/Karachi.ics b/zoneinfo/Asia/Karachi.ics
index 7df943dd..98e635d6 100644
--- a/zoneinfo/Asia/Karachi.ics
+++ b/zoneinfo/Asia/Karachi.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Karachi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Karachi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Karachi
BEGIN:STANDARD
TZNAME:PKT
diff --git a/zoneinfo/Asia/Kashgar.ics b/zoneinfo/Asia/Kashgar.ics
index a1aca55e..b4cc8345 100644
--- a/zoneinfo/Asia/Kashgar.ics
+++ b/zoneinfo/Asia/Kashgar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Urumqi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Urumqi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Urumqi
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Kathmandu.ics b/zoneinfo/Asia/Kathmandu.ics
index 3a852557..6d1fae8b 100644
--- a/zoneinfo/Asia/Kathmandu.ics
+++ b/zoneinfo/Asia/Kathmandu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kathmandu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kathmandu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kathmandu
BEGIN:STANDARD
TZNAME:+0545
diff --git a/zoneinfo/Asia/Katmandu.ics b/zoneinfo/Asia/Katmandu.ics
index 3a852557..6d1fae8b 100644
--- a/zoneinfo/Asia/Katmandu.ics
+++ b/zoneinfo/Asia/Katmandu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kathmandu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kathmandu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kathmandu
BEGIN:STANDARD
TZNAME:+0545
diff --git a/zoneinfo/Asia/Khandyga.ics b/zoneinfo/Asia/Khandyga.ics
index fc752d10..73db90ae 100644
--- a/zoneinfo/Asia/Khandyga.ics
+++ b/zoneinfo/Asia/Khandyga.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Khandyga
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Khandyga
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Khandyga
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Asia/Kolkata.ics b/zoneinfo/Asia/Kolkata.ics
index af969950..c7a9b1ed 100644
--- a/zoneinfo/Asia/Kolkata.ics
+++ b/zoneinfo/Asia/Kolkata.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kolkata
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kolkata
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kolkata
BEGIN:STANDARD
TZNAME:IST
diff --git a/zoneinfo/Asia/Krasnoyarsk.ics b/zoneinfo/Asia/Krasnoyarsk.ics
index b9f75c66..b01da79f 100644
--- a/zoneinfo/Asia/Krasnoyarsk.ics
+++ b/zoneinfo/Asia/Krasnoyarsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Krasnoyarsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Krasnoyarsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Krasnoyarsk
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Kuala_Lumpur.ics b/zoneinfo/Asia/Kuala_Lumpur.ics
index 4614e25e..e3aa0375 100644
--- a/zoneinfo/Asia/Kuala_Lumpur.ics
+++ b/zoneinfo/Asia/Kuala_Lumpur.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kuala_Lumpur
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kuala_Lumpur
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kuala_Lumpur
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Kuching.ics b/zoneinfo/Asia/Kuching.ics
index fb8f34b6..6820ddb2 100644
--- a/zoneinfo/Asia/Kuching.ics
+++ b/zoneinfo/Asia/Kuching.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Kuching
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Kuching
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Kuching
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Kuwait.ics b/zoneinfo/Asia/Kuwait.ics
index cde808f1..748c16c4 100644
--- a/zoneinfo/Asia/Kuwait.ics
+++ b/zoneinfo/Asia/Kuwait.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Riyadh
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Riyadh
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Riyadh
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Macao.ics b/zoneinfo/Asia/Macao.ics
index 50f00429..a8fb7881 100644
--- a/zoneinfo/Asia/Macao.ics
+++ b/zoneinfo/Asia/Macao.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Macau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Macau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Macau
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Macau.ics b/zoneinfo/Asia/Macau.ics
index 50f00429..a8fb7881 100644
--- a/zoneinfo/Asia/Macau.ics
+++ b/zoneinfo/Asia/Macau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Macau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Macau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Macau
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Magadan.ics b/zoneinfo/Asia/Magadan.ics
index 9e59a046..f5d4390a 100644
--- a/zoneinfo/Asia/Magadan.ics
+++ b/zoneinfo/Asia/Magadan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Magadan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Magadan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Magadan
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Asia/Makassar.ics b/zoneinfo/Asia/Makassar.ics
index 13501f9b..d1f08056 100644
--- a/zoneinfo/Asia/Makassar.ics
+++ b/zoneinfo/Asia/Makassar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Makassar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Makassar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Makassar
BEGIN:STANDARD
TZNAME:WITA
diff --git a/zoneinfo/Asia/Manila.ics b/zoneinfo/Asia/Manila.ics
index 4c02e036..bec4f556 100644
--- a/zoneinfo/Asia/Manila.ics
+++ b/zoneinfo/Asia/Manila.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Manila
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Manila
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Manila
BEGIN:STANDARD
TZNAME:PST
diff --git a/zoneinfo/Asia/Muscat.ics b/zoneinfo/Asia/Muscat.ics
index 4c69cc35..ff025bd8 100644
--- a/zoneinfo/Asia/Muscat.ics
+++ b/zoneinfo/Asia/Muscat.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Dubai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Dubai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Dubai
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Asia/Nicosia.ics b/zoneinfo/Asia/Nicosia.ics
index 3a79df1a..f34f04f7 100644
--- a/zoneinfo/Asia/Nicosia.ics
+++ b/zoneinfo/Asia/Nicosia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Nicosia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Nicosia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Nicosia
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Asia/Novokuznetsk.ics b/zoneinfo/Asia/Novokuznetsk.ics
index 563e68bb..44c17588 100644
--- a/zoneinfo/Asia/Novokuznetsk.ics
+++ b/zoneinfo/Asia/Novokuznetsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Novokuznetsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Novokuznetsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Novokuznetsk
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Novosibirsk.ics b/zoneinfo/Asia/Novosibirsk.ics
index 87cc380d..c87ef1b6 100644
--- a/zoneinfo/Asia/Novosibirsk.ics
+++ b/zoneinfo/Asia/Novosibirsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Novosibirsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Novosibirsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Novosibirsk
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Omsk.ics b/zoneinfo/Asia/Omsk.ics
index 84974e7e..9b6dec15 100644
--- a/zoneinfo/Asia/Omsk.ics
+++ b/zoneinfo/Asia/Omsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Omsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Omsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Omsk
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Oral.ics b/zoneinfo/Asia/Oral.ics
index a2b80ef4..33b5e3e4 100644
--- a/zoneinfo/Asia/Oral.ics
+++ b/zoneinfo/Asia/Oral.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Oral
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Oral
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Oral
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Phnom_Penh.ics b/zoneinfo/Asia/Phnom_Penh.ics
index ad63ebfb..2fbf4b07 100644
--- a/zoneinfo/Asia/Phnom_Penh.ics
+++ b/zoneinfo/Asia/Phnom_Penh.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Bangkok
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Bangkok
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Bangkok
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Pontianak.ics b/zoneinfo/Asia/Pontianak.ics
index ee584695..3e6de70b 100644
--- a/zoneinfo/Asia/Pontianak.ics
+++ b/zoneinfo/Asia/Pontianak.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Pontianak
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Pontianak
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Pontianak
BEGIN:STANDARD
TZNAME:WIB
diff --git a/zoneinfo/Asia/Pyongyang.ics b/zoneinfo/Asia/Pyongyang.ics
index 3ab5c8ac..410ed9a1 100644
--- a/zoneinfo/Asia/Pyongyang.ics
+++ b/zoneinfo/Asia/Pyongyang.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Pyongyang
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Pyongyang
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Pyongyang
BEGIN:STANDARD
TZNAME:KST
diff --git a/zoneinfo/Asia/Qatar.ics b/zoneinfo/Asia/Qatar.ics
index 8d9d581e..38144386 100644
--- a/zoneinfo/Asia/Qatar.ics
+++ b/zoneinfo/Asia/Qatar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Qatar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Qatar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Qatar
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Qostanay.ics b/zoneinfo/Asia/Qostanay.ics
index efa84b45..84e1d33d 100644
--- a/zoneinfo/Asia/Qostanay.ics
+++ b/zoneinfo/Asia/Qostanay.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Qostanay
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Qostanay
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Qostanay
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Qyzylorda.ics b/zoneinfo/Asia/Qyzylorda.ics
index 36a91f18..c439c070 100644
--- a/zoneinfo/Asia/Qyzylorda.ics
+++ b/zoneinfo/Asia/Qyzylorda.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Qyzylorda
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Qyzylorda
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Qyzylorda
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Rangoon.ics b/zoneinfo/Asia/Rangoon.ics
index bc378607..c0b7dd1f 100644
--- a/zoneinfo/Asia/Rangoon.ics
+++ b/zoneinfo/Asia/Rangoon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Yangon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Yangon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Yangon
BEGIN:STANDARD
TZNAME:+0630
diff --git a/zoneinfo/Asia/Riyadh.ics b/zoneinfo/Asia/Riyadh.ics
index cde808f1..748c16c4 100644
--- a/zoneinfo/Asia/Riyadh.ics
+++ b/zoneinfo/Asia/Riyadh.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Riyadh
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Riyadh
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Riyadh
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Asia/Saigon.ics b/zoneinfo/Asia/Saigon.ics
index 28c9106b..4ddfc2aa 100644
--- a/zoneinfo/Asia/Saigon.ics
+++ b/zoneinfo/Asia/Saigon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ho_Chi_Minh
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ho_Chi_Minh
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ho_Chi_Minh
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Sakhalin.ics b/zoneinfo/Asia/Sakhalin.ics
index bef40df5..c9bd39d1 100644
--- a/zoneinfo/Asia/Sakhalin.ics
+++ b/zoneinfo/Asia/Sakhalin.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Sakhalin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Sakhalin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Sakhalin
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Asia/Samarkand.ics b/zoneinfo/Asia/Samarkand.ics
index 1f035d15..ccbaafcf 100644
--- a/zoneinfo/Asia/Samarkand.ics
+++ b/zoneinfo/Asia/Samarkand.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Samarkand
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Samarkand
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Samarkand
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Seoul.ics b/zoneinfo/Asia/Seoul.ics
index 196673f7..746d0209 100644
--- a/zoneinfo/Asia/Seoul.ics
+++ b/zoneinfo/Asia/Seoul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Seoul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Seoul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Seoul
BEGIN:STANDARD
TZNAME:KST
diff --git a/zoneinfo/Asia/Shanghai.ics b/zoneinfo/Asia/Shanghai.ics
index ee91b6ac..6ef4af39 100644
--- a/zoneinfo/Asia/Shanghai.ics
+++ b/zoneinfo/Asia/Shanghai.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Shanghai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Shanghai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Singapore.ics b/zoneinfo/Asia/Singapore.ics
index 90e65f2a..00e23374 100644
--- a/zoneinfo/Asia/Singapore.ics
+++ b/zoneinfo/Asia/Singapore.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Singapore
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Singapore
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Singapore
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Srednekolymsk.ics b/zoneinfo/Asia/Srednekolymsk.ics
index 3c1aedf3..9316be26 100644
--- a/zoneinfo/Asia/Srednekolymsk.ics
+++ b/zoneinfo/Asia/Srednekolymsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Srednekolymsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Srednekolymsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Srednekolymsk
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Asia/Taipei.ics b/zoneinfo/Asia/Taipei.ics
index 0d976016..d836d436 100644
--- a/zoneinfo/Asia/Taipei.ics
+++ b/zoneinfo/Asia/Taipei.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Taipei
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Taipei
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Taipei
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Asia/Tashkent.ics b/zoneinfo/Asia/Tashkent.ics
index 13bd726e..e2863a72 100644
--- a/zoneinfo/Asia/Tashkent.ics
+++ b/zoneinfo/Asia/Tashkent.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tashkent
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tashkent
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tashkent
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Tbilisi.ics b/zoneinfo/Asia/Tbilisi.ics
index 5d44a68e..3b5d40df 100644
--- a/zoneinfo/Asia/Tbilisi.ics
+++ b/zoneinfo/Asia/Tbilisi.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tbilisi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tbilisi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tbilisi
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Asia/Tehran.ics b/zoneinfo/Asia/Tehran.ics
index bdbfb7ac..cfbab1fe 100644
--- a/zoneinfo/Asia/Tehran.ics
+++ b/zoneinfo/Asia/Tehran.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tehran
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tehran
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tehran
BEGIN:DAYLIGHT
TZNAME:+0430
diff --git a/zoneinfo/Asia/Tel_Aviv.ics b/zoneinfo/Asia/Tel_Aviv.ics
index f41a1c68..00e44fca 100644
--- a/zoneinfo/Asia/Tel_Aviv.ics
+++ b/zoneinfo/Asia/Tel_Aviv.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Jerusalem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Jerusalem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Jerusalem
BEGIN:DAYLIGHT
TZNAME:IDT
diff --git a/zoneinfo/Asia/Thimbu.ics b/zoneinfo/Asia/Thimbu.ics
index 09e12d89..84dcec80 100644
--- a/zoneinfo/Asia/Thimbu.ics
+++ b/zoneinfo/Asia/Thimbu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Thimphu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Thimphu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Thimphu
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Thimphu.ics b/zoneinfo/Asia/Thimphu.ics
index 09e12d89..84dcec80 100644
--- a/zoneinfo/Asia/Thimphu.ics
+++ b/zoneinfo/Asia/Thimphu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Thimphu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Thimphu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Thimphu
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Tokyo.ics b/zoneinfo/Asia/Tokyo.ics
index cbbad067..5c0806fc 100644
--- a/zoneinfo/Asia/Tokyo.ics
+++ b/zoneinfo/Asia/Tokyo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tokyo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tokyo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tokyo
BEGIN:STANDARD
TZNAME:JST
diff --git a/zoneinfo/Asia/Tomsk.ics b/zoneinfo/Asia/Tomsk.ics
index 32d916d3..22088c82 100644
--- a/zoneinfo/Asia/Tomsk.ics
+++ b/zoneinfo/Asia/Tomsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tomsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tomsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tomsk
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Ujung_Pandang.ics b/zoneinfo/Asia/Ujung_Pandang.ics
index 13501f9b..d1f08056 100644
--- a/zoneinfo/Asia/Ujung_Pandang.ics
+++ b/zoneinfo/Asia/Ujung_Pandang.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Makassar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Makassar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Makassar
BEGIN:STANDARD
TZNAME:WITA
diff --git a/zoneinfo/Asia/Ulaanbaatar.ics b/zoneinfo/Asia/Ulaanbaatar.ics
index d39f0d38..dae691b4 100644
--- a/zoneinfo/Asia/Ulaanbaatar.ics
+++ b/zoneinfo/Asia/Ulaanbaatar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ulaanbaatar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ulaanbaatar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ulaanbaatar
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Ulan_Bator.ics b/zoneinfo/Asia/Ulan_Bator.ics
index d39f0d38..dae691b4 100644
--- a/zoneinfo/Asia/Ulan_Bator.ics
+++ b/zoneinfo/Asia/Ulan_Bator.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ulaanbaatar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ulaanbaatar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ulaanbaatar
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Asia/Urumqi.ics b/zoneinfo/Asia/Urumqi.ics
index a1aca55e..b4cc8345 100644
--- a/zoneinfo/Asia/Urumqi.ics
+++ b/zoneinfo/Asia/Urumqi.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Urumqi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Urumqi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Urumqi
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Asia/Ust-Nera.ics b/zoneinfo/Asia/Ust-Nera.ics
index a4fa53c1..68feda78 100644
--- a/zoneinfo/Asia/Ust-Nera.ics
+++ b/zoneinfo/Asia/Ust-Nera.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Ust-Nera
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Ust-Nera
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Ust-Nera
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Asia/Vientiane.ics b/zoneinfo/Asia/Vientiane.ics
index ad63ebfb..2fbf4b07 100644
--- a/zoneinfo/Asia/Vientiane.ics
+++ b/zoneinfo/Asia/Vientiane.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Bangkok
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Bangkok
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Bangkok
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Asia/Vladivostok.ics b/zoneinfo/Asia/Vladivostok.ics
index 1368fb0a..5e8be04c 100644
--- a/zoneinfo/Asia/Vladivostok.ics
+++ b/zoneinfo/Asia/Vladivostok.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Vladivostok
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Vladivostok
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Vladivostok
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Asia/Yakutsk.ics b/zoneinfo/Asia/Yakutsk.ics
index 7548d052..6ebd9bc8 100644
--- a/zoneinfo/Asia/Yakutsk.ics
+++ b/zoneinfo/Asia/Yakutsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Yakutsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Yakutsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Yakutsk
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Asia/Yangon.ics b/zoneinfo/Asia/Yangon.ics
index bc378607..c0b7dd1f 100644
--- a/zoneinfo/Asia/Yangon.ics
+++ b/zoneinfo/Asia/Yangon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Yangon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Yangon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Yangon
BEGIN:STANDARD
TZNAME:+0630
diff --git a/zoneinfo/Asia/Yekaterinburg.ics b/zoneinfo/Asia/Yekaterinburg.ics
index dab89aca..ffcfb18a 100644
--- a/zoneinfo/Asia/Yekaterinburg.ics
+++ b/zoneinfo/Asia/Yekaterinburg.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Yekaterinburg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Yekaterinburg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Yekaterinburg
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Asia/Yerevan.ics b/zoneinfo/Asia/Yerevan.ics
index da008062..ed5f0771 100644
--- a/zoneinfo/Asia/Yerevan.ics
+++ b/zoneinfo/Asia/Yerevan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Yerevan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Yerevan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Yerevan
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Atlantic/Azores.ics b/zoneinfo/Atlantic/Azores.ics
index 8f1bbf20..2ff68097 100644
--- a/zoneinfo/Atlantic/Azores.ics
+++ b/zoneinfo/Atlantic/Azores.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Azores
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Azores
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Azores
BEGIN:DAYLIGHT
TZNAME:+00
diff --git a/zoneinfo/Atlantic/Bermuda.ics b/zoneinfo/Atlantic/Bermuda.ics
index 148b56d3..3b2e62fc 100644
--- a/zoneinfo/Atlantic/Bermuda.ics
+++ b/zoneinfo/Atlantic/Bermuda.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Bermuda
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Bermuda
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Bermuda
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/Atlantic/Canary.ics b/zoneinfo/Atlantic/Canary.ics
index c1de7164..fbeebdb6 100644
--- a/zoneinfo/Atlantic/Canary.ics
+++ b/zoneinfo/Atlantic/Canary.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Canary
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Canary
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Canary
BEGIN:DAYLIGHT
TZNAME:WEST
diff --git a/zoneinfo/Atlantic/Cape_Verde.ics b/zoneinfo/Atlantic/Cape_Verde.ics
index d76c2a4b..91ed2d73 100644
--- a/zoneinfo/Atlantic/Cape_Verde.ics
+++ b/zoneinfo/Atlantic/Cape_Verde.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Cape_Verde
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Cape_Verde
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Cape_Verde
BEGIN:STANDARD
TZNAME:-01
diff --git a/zoneinfo/Atlantic/Faeroe.ics b/zoneinfo/Atlantic/Faeroe.ics
index 077b0a6d..987b3a1b 100644
--- a/zoneinfo/Atlantic/Faeroe.ics
+++ b/zoneinfo/Atlantic/Faeroe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Faroe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Faroe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Faroe
BEGIN:DAYLIGHT
TZNAME:WEST
diff --git a/zoneinfo/Atlantic/Faroe.ics b/zoneinfo/Atlantic/Faroe.ics
index 077b0a6d..987b3a1b 100644
--- a/zoneinfo/Atlantic/Faroe.ics
+++ b/zoneinfo/Atlantic/Faroe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Faroe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Faroe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Faroe
BEGIN:DAYLIGHT
TZNAME:WEST
diff --git a/zoneinfo/Atlantic/Jan_Mayen.ics b/zoneinfo/Atlantic/Jan_Mayen.ics
index e337e96f..8274486e 100644
--- a/zoneinfo/Atlantic/Jan_Mayen.ics
+++ b/zoneinfo/Atlantic/Jan_Mayen.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Oslo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Oslo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Oslo
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Atlantic/Madeira.ics b/zoneinfo/Atlantic/Madeira.ics
index 7470c4da..ec2b75ba 100644
--- a/zoneinfo/Atlantic/Madeira.ics
+++ b/zoneinfo/Atlantic/Madeira.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Madeira
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Madeira
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Madeira
BEGIN:DAYLIGHT
TZNAME:WEST
diff --git a/zoneinfo/Atlantic/Reykjavik.ics b/zoneinfo/Atlantic/Reykjavik.ics
index 8913b0ac..56942646 100644
--- a/zoneinfo/Atlantic/Reykjavik.ics
+++ b/zoneinfo/Atlantic/Reykjavik.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Reykjavik
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Reykjavik
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Reykjavik
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Atlantic/South_Georgia.ics b/zoneinfo/Atlantic/South_Georgia.ics
index d243641d..9a15b0e6 100644
--- a/zoneinfo/Atlantic/South_Georgia.ics
+++ b/zoneinfo/Atlantic/South_Georgia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/South_Georgia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/South_Georgia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/South_Georgia
BEGIN:STANDARD
TZNAME:-02
diff --git a/zoneinfo/Atlantic/St_Helena.ics b/zoneinfo/Atlantic/St_Helena.ics
index 63bc3772..d7fc42c8 100644
--- a/zoneinfo/Atlantic/St_Helena.ics
+++ b/zoneinfo/Atlantic/St_Helena.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Abidjan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Abidjan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Abidjan
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Atlantic/Stanley.ics b/zoneinfo/Atlantic/Stanley.ics
index dc8a88e8..d2fd1af3 100644
--- a/zoneinfo/Atlantic/Stanley.ics
+++ b/zoneinfo/Atlantic/Stanley.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Stanley
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Stanley
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Stanley
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/Australia/ACT.ics b/zoneinfo/Australia/ACT.ics
index c91b29dc..b5aa558d 100644
--- a/zoneinfo/Australia/ACT.ics
+++ b/zoneinfo/Australia/ACT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Sydney
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Sydney
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Sydney
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/Adelaide.ics b/zoneinfo/Australia/Adelaide.ics
index 83809314..db12ad50 100644
--- a/zoneinfo/Australia/Adelaide.ics
+++ b/zoneinfo/Australia/Adelaide.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Adelaide
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Adelaide
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Adelaide
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Australia/Brisbane.ics b/zoneinfo/Australia/Brisbane.ics
index e06a60ee..42e12f3e 100644
--- a/zoneinfo/Australia/Brisbane.ics
+++ b/zoneinfo/Australia/Brisbane.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Brisbane
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Brisbane
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Brisbane
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/Broken_Hill.ics b/zoneinfo/Australia/Broken_Hill.ics
index 005dc6c0..8732e248 100644
--- a/zoneinfo/Australia/Broken_Hill.ics
+++ b/zoneinfo/Australia/Broken_Hill.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Broken_Hill
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Broken_Hill
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Broken_Hill
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Australia/Canberra.ics b/zoneinfo/Australia/Canberra.ics
index c91b29dc..b5aa558d 100644
--- a/zoneinfo/Australia/Canberra.ics
+++ b/zoneinfo/Australia/Canberra.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Sydney
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Sydney
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Sydney
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/Currie.ics b/zoneinfo/Australia/Currie.ics
index b0c5d17b..6b64add8 100644
--- a/zoneinfo/Australia/Currie.ics
+++ b/zoneinfo/Australia/Currie.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Hobart
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Hobart
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Hobart
BEGIN:DAYLIGHT
TZNAME:AEDT
diff --git a/zoneinfo/Australia/Darwin.ics b/zoneinfo/Australia/Darwin.ics
index b5f79654..9e277146 100644
--- a/zoneinfo/Australia/Darwin.ics
+++ b/zoneinfo/Australia/Darwin.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Darwin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Darwin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Darwin
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Australia/Eucla.ics b/zoneinfo/Australia/Eucla.ics
index b3913f66..6522fe43 100644
--- a/zoneinfo/Australia/Eucla.ics
+++ b/zoneinfo/Australia/Eucla.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Eucla
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Eucla
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Eucla
BEGIN:STANDARD
TZNAME:+0845
diff --git a/zoneinfo/Australia/Hobart.ics b/zoneinfo/Australia/Hobart.ics
index b0c5d17b..6b64add8 100644
--- a/zoneinfo/Australia/Hobart.ics
+++ b/zoneinfo/Australia/Hobart.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Hobart
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Hobart
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Hobart
BEGIN:DAYLIGHT
TZNAME:AEDT
diff --git a/zoneinfo/Australia/LHI.ics b/zoneinfo/Australia/LHI.ics
index 7f0dd485..774c8433 100644
--- a/zoneinfo/Australia/LHI.ics
+++ b/zoneinfo/Australia/LHI.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Lord_Howe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Lord_Howe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Lord_Howe
BEGIN:STANDARD
TZNAME:+1030
diff --git a/zoneinfo/Australia/Lindeman.ics b/zoneinfo/Australia/Lindeman.ics
index 1425440e..bf8a3d64 100644
--- a/zoneinfo/Australia/Lindeman.ics
+++ b/zoneinfo/Australia/Lindeman.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Lindeman
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Lindeman
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Lindeman
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/Lord_Howe.ics b/zoneinfo/Australia/Lord_Howe.ics
index 7f0dd485..774c8433 100644
--- a/zoneinfo/Australia/Lord_Howe.ics
+++ b/zoneinfo/Australia/Lord_Howe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Lord_Howe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Lord_Howe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Lord_Howe
BEGIN:STANDARD
TZNAME:+1030
diff --git a/zoneinfo/Australia/Melbourne.ics b/zoneinfo/Australia/Melbourne.ics
index ff42dbb4..74473748 100644
--- a/zoneinfo/Australia/Melbourne.ics
+++ b/zoneinfo/Australia/Melbourne.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Melbourne
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Melbourne
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Melbourne
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/NSW.ics b/zoneinfo/Australia/NSW.ics
index c91b29dc..b5aa558d 100644
--- a/zoneinfo/Australia/NSW.ics
+++ b/zoneinfo/Australia/NSW.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Sydney
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Sydney
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Sydney
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/North.ics b/zoneinfo/Australia/North.ics
index b5f79654..9e277146 100644
--- a/zoneinfo/Australia/North.ics
+++ b/zoneinfo/Australia/North.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Darwin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Darwin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Darwin
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Australia/Perth.ics b/zoneinfo/Australia/Perth.ics
index b8d05eed..7c9d9eee 100644
--- a/zoneinfo/Australia/Perth.ics
+++ b/zoneinfo/Australia/Perth.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Perth
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Perth
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Perth
BEGIN:STANDARD
TZNAME:AWST
diff --git a/zoneinfo/Australia/Queensland.ics b/zoneinfo/Australia/Queensland.ics
index e06a60ee..42e12f3e 100644
--- a/zoneinfo/Australia/Queensland.ics
+++ b/zoneinfo/Australia/Queensland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Brisbane
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Brisbane
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Brisbane
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/South.ics b/zoneinfo/Australia/South.ics
index 83809314..db12ad50 100644
--- a/zoneinfo/Australia/South.ics
+++ b/zoneinfo/Australia/South.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Adelaide
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Adelaide
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Adelaide
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Australia/Sydney.ics b/zoneinfo/Australia/Sydney.ics
index c91b29dc..b5aa558d 100644
--- a/zoneinfo/Australia/Sydney.ics
+++ b/zoneinfo/Australia/Sydney.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Sydney
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Sydney
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Sydney
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/Tasmania.ics b/zoneinfo/Australia/Tasmania.ics
index b0c5d17b..6b64add8 100644
--- a/zoneinfo/Australia/Tasmania.ics
+++ b/zoneinfo/Australia/Tasmania.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Hobart
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Hobart
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Hobart
BEGIN:DAYLIGHT
TZNAME:AEDT
diff --git a/zoneinfo/Australia/Victoria.ics b/zoneinfo/Australia/Victoria.ics
index ff42dbb4..74473748 100644
--- a/zoneinfo/Australia/Victoria.ics
+++ b/zoneinfo/Australia/Victoria.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Melbourne
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Melbourne
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Melbourne
BEGIN:STANDARD
TZNAME:AEST
diff --git a/zoneinfo/Australia/West.ics b/zoneinfo/Australia/West.ics
index b8d05eed..7c9d9eee 100644
--- a/zoneinfo/Australia/West.ics
+++ b/zoneinfo/Australia/West.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Perth
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Perth
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Perth
BEGIN:STANDARD
TZNAME:AWST
diff --git a/zoneinfo/Australia/Yancowinna.ics b/zoneinfo/Australia/Yancowinna.ics
index 005dc6c0..8732e248 100644
--- a/zoneinfo/Australia/Yancowinna.ics
+++ b/zoneinfo/Australia/Yancowinna.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Australia/Broken_Hill
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Australia/Broken_Hill
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Australia/Broken_Hill
BEGIN:STANDARD
TZNAME:ACST
diff --git a/zoneinfo/Brazil/Acre.ics b/zoneinfo/Brazil/Acre.ics
index 3d4c27fb..4b1798f8 100644
--- a/zoneinfo/Brazil/Acre.ics
+++ b/zoneinfo/Brazil/Acre.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Rio_Branco
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Rio_Branco
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Rio_Branco
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/Brazil/DeNoronha.ics b/zoneinfo/Brazil/DeNoronha.ics
index 580b9364..e663fd80 100644
--- a/zoneinfo/Brazil/DeNoronha.ics
+++ b/zoneinfo/Brazil/DeNoronha.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Noronha
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Noronha
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Noronha
BEGIN:STANDARD
TZNAME:-02
diff --git a/zoneinfo/Brazil/East.ics b/zoneinfo/Brazil/East.ics
index 16996961..8ff52510 100644
--- a/zoneinfo/Brazil/East.ics
+++ b/zoneinfo/Brazil/East.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Sao_Paulo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Sao_Paulo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Sao_Paulo
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/Brazil/West.ics b/zoneinfo/Brazil/West.ics
index 63581145..3afb9f05 100644
--- a/zoneinfo/Brazil/West.ics
+++ b/zoneinfo/Brazil/West.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Manaus
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Manaus
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Manaus
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/CET.ics b/zoneinfo/CET.ics
index cc032909..a54f5581 100644
--- a/zoneinfo/CET.ics
+++ b/zoneinfo/CET.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/CET
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/CET
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:CET
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/CST6CDT.ics b/zoneinfo/CST6CDT.ics
index 84b4026e..b6dd7417 100644
--- a/zoneinfo/CST6CDT.ics
+++ b/zoneinfo/CST6CDT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/CST6CDT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/CST6CDT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:CST6CDT
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/Canada/Atlantic.ics b/zoneinfo/Canada/Atlantic.ics
index 101ec547..f6933249 100644
--- a/zoneinfo/Canada/Atlantic.ics
+++ b/zoneinfo/Canada/Atlantic.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Halifax
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Halifax
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Halifax
BEGIN:DAYLIGHT
TZNAME:ADT
diff --git a/zoneinfo/Canada/Central.ics b/zoneinfo/Canada/Central.ics
index d755f390..8dcd6087 100644
--- a/zoneinfo/Canada/Central.ics
+++ b/zoneinfo/Canada/Central.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Winnipeg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Winnipeg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Winnipeg
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/Canada/Eastern.ics b/zoneinfo/Canada/Eastern.ics
index 185ff4b4..811a6158 100644
--- a/zoneinfo/Canada/Eastern.ics
+++ b/zoneinfo/Canada/Eastern.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Toronto
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Toronto
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Toronto
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/Canada/Mountain.ics b/zoneinfo/Canada/Mountain.ics
index 5045c4ce..7a06ce41 100644
--- a/zoneinfo/Canada/Mountain.ics
+++ b/zoneinfo/Canada/Mountain.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Edmonton
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Edmonton
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Edmonton
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/Canada/Newfoundland.ics b/zoneinfo/Canada/Newfoundland.ics
index 7095decf..584f3300 100644
--- a/zoneinfo/Canada/Newfoundland.ics
+++ b/zoneinfo/Canada/Newfoundland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/St_Johns
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/St_Johns
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/St_Johns
BEGIN:STANDARD
TZNAME:NST
diff --git a/zoneinfo/Canada/Pacific.ics b/zoneinfo/Canada/Pacific.ics
index 10446a77..d7a912c4 100644
--- a/zoneinfo/Canada/Pacific.ics
+++ b/zoneinfo/Canada/Pacific.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Vancouver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Vancouver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Vancouver
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/Canada/Saskatchewan.ics b/zoneinfo/Canada/Saskatchewan.ics
index c15afef0..b6b0b770 100644
--- a/zoneinfo/Canada/Saskatchewan.ics
+++ b/zoneinfo/Canada/Saskatchewan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Regina
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Regina
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Regina
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/Canada/Yukon.ics b/zoneinfo/Canada/Yukon.ics
index 26ea5165..0e1383ce 100644
--- a/zoneinfo/Canada/Yukon.ics
+++ b/zoneinfo/Canada/Yukon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Whitehorse
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Whitehorse
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Whitehorse
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/Chile/Continental.ics b/zoneinfo/Chile/Continental.ics
index b6c15aa8..e96b1501 100644
--- a/zoneinfo/Chile/Continental.ics
+++ b/zoneinfo/Chile/Continental.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Santiago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Santiago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Santiago
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/Chile/EasterIsland.ics b/zoneinfo/Chile/EasterIsland.ics
index 08ad2cfe..d9a2f772 100644
--- a/zoneinfo/Chile/EasterIsland.ics
+++ b/zoneinfo/Chile/EasterIsland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Easter
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Easter
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Easter
BEGIN:STANDARD
TZNAME:-06
diff --git a/zoneinfo/Cuba.ics b/zoneinfo/Cuba.ics
index 484d9735..edd18faa 100644
--- a/zoneinfo/Cuba.ics
+++ b/zoneinfo/Cuba.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Havana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Havana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Havana
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/EET.ics b/zoneinfo/EET.ics
index 6cc24e8c..7bc0484f 100644
--- a/zoneinfo/EET.ics
+++ b/zoneinfo/EET.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/EET
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/EET
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:EET
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/EST.ics b/zoneinfo/EST.ics
index 304b0608..9abb4f03 100644
--- a/zoneinfo/EST.ics
+++ b/zoneinfo/EST.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/EST
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/EST
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:EST
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/EST5EDT.ics b/zoneinfo/EST5EDT.ics
index a0e9c768..8a6e949a 100644
--- a/zoneinfo/EST5EDT.ics
+++ b/zoneinfo/EST5EDT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/EST5EDT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/EST5EDT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:EST5EDT
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/Egypt.ics b/zoneinfo/Egypt.ics
index 746bb179..6b5c8970 100644
--- a/zoneinfo/Egypt.ics
+++ b/zoneinfo/Egypt.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Cairo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Cairo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Cairo
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Eire.ics b/zoneinfo/Eire.ics
index 52380405..1c493edb 100644
--- a/zoneinfo/Eire.ics
+++ b/zoneinfo/Eire.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Dublin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Dublin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Dublin
BEGIN:STANDARD
TZNAME:IST
diff --git a/zoneinfo/Etc/GMT+0.ics b/zoneinfo/Etc/GMT+0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Etc/GMT+0.ics
+++ b/zoneinfo/Etc/GMT+0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Etc/GMT+1.ics b/zoneinfo/Etc/GMT+1.ics
index a0de1622..3dc12927 100644
--- a/zoneinfo/Etc/GMT+1.ics
+++ b/zoneinfo/Etc/GMT+1.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+1
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+1
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+1
BEGIN:STANDARD
TZNAME:-01
diff --git a/zoneinfo/Etc/GMT+10.ics b/zoneinfo/Etc/GMT+10.ics
index e4ff0888..bfb5061a 100644
--- a/zoneinfo/Etc/GMT+10.ics
+++ b/zoneinfo/Etc/GMT+10.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+10
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+10
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+10
BEGIN:STANDARD
TZNAME:-10
diff --git a/zoneinfo/Etc/GMT+11.ics b/zoneinfo/Etc/GMT+11.ics
index 1fe7baa9..c661808f 100644
--- a/zoneinfo/Etc/GMT+11.ics
+++ b/zoneinfo/Etc/GMT+11.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+11
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+11
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+11
BEGIN:STANDARD
TZNAME:-11
diff --git a/zoneinfo/Etc/GMT+12.ics b/zoneinfo/Etc/GMT+12.ics
index 82c1cfaa..67fd7f7e 100644
--- a/zoneinfo/Etc/GMT+12.ics
+++ b/zoneinfo/Etc/GMT+12.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+12
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+12
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+12
BEGIN:STANDARD
TZNAME:-12
diff --git a/zoneinfo/Etc/GMT+2.ics b/zoneinfo/Etc/GMT+2.ics
index 844f1b09..87a7e84f 100644
--- a/zoneinfo/Etc/GMT+2.ics
+++ b/zoneinfo/Etc/GMT+2.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+2
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+2
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+2
BEGIN:STANDARD
TZNAME:-02
diff --git a/zoneinfo/Etc/GMT+3.ics b/zoneinfo/Etc/GMT+3.ics
index 3e0f8d91..020bfabb 100644
--- a/zoneinfo/Etc/GMT+3.ics
+++ b/zoneinfo/Etc/GMT+3.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+3
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+3
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+3
BEGIN:STANDARD
TZNAME:-03
diff --git a/zoneinfo/Etc/GMT+4.ics b/zoneinfo/Etc/GMT+4.ics
index 5cccf011..b78527c0 100644
--- a/zoneinfo/Etc/GMT+4.ics
+++ b/zoneinfo/Etc/GMT+4.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+4
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+4
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+4
BEGIN:STANDARD
TZNAME:-04
diff --git a/zoneinfo/Etc/GMT+5.ics b/zoneinfo/Etc/GMT+5.ics
index d409f03e..66864886 100644
--- a/zoneinfo/Etc/GMT+5.ics
+++ b/zoneinfo/Etc/GMT+5.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+5
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+5
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+5
BEGIN:STANDARD
TZNAME:-05
diff --git a/zoneinfo/Etc/GMT+6.ics b/zoneinfo/Etc/GMT+6.ics
index 024f6900..786bc8e4 100644
--- a/zoneinfo/Etc/GMT+6.ics
+++ b/zoneinfo/Etc/GMT+6.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+6
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+6
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+6
BEGIN:STANDARD
TZNAME:-06
diff --git a/zoneinfo/Etc/GMT+7.ics b/zoneinfo/Etc/GMT+7.ics
index 88759ce7..4134d1e2 100644
--- a/zoneinfo/Etc/GMT+7.ics
+++ b/zoneinfo/Etc/GMT+7.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+7
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+7
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+7
BEGIN:STANDARD
TZNAME:-07
diff --git a/zoneinfo/Etc/GMT+8.ics b/zoneinfo/Etc/GMT+8.ics
index 10b4b376..f3814489 100644
--- a/zoneinfo/Etc/GMT+8.ics
+++ b/zoneinfo/Etc/GMT+8.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+8
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+8
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+8
BEGIN:STANDARD
TZNAME:-08
diff --git a/zoneinfo/Etc/GMT+9.ics b/zoneinfo/Etc/GMT+9.ics
index 1cfea1a9..82966b25 100644
--- a/zoneinfo/Etc/GMT+9.ics
+++ b/zoneinfo/Etc/GMT+9.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT+9
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT+9
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT+9
BEGIN:STANDARD
TZNAME:-09
diff --git a/zoneinfo/Etc/GMT-0.ics b/zoneinfo/Etc/GMT-0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Etc/GMT-0.ics
+++ b/zoneinfo/Etc/GMT-0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Etc/GMT-1.ics b/zoneinfo/Etc/GMT-1.ics
index 3dc43e05..8d89a6e0 100644
--- a/zoneinfo/Etc/GMT-1.ics
+++ b/zoneinfo/Etc/GMT-1.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-1
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-1
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-1
BEGIN:STANDARD
TZNAME:+01
diff --git a/zoneinfo/Etc/GMT-10.ics b/zoneinfo/Etc/GMT-10.ics
index 79493614..d8293b84 100644
--- a/zoneinfo/Etc/GMT-10.ics
+++ b/zoneinfo/Etc/GMT-10.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-10
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-10
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-10
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Etc/GMT-11.ics b/zoneinfo/Etc/GMT-11.ics
index 5d32a53a..e81cb420 100644
--- a/zoneinfo/Etc/GMT-11.ics
+++ b/zoneinfo/Etc/GMT-11.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-11
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-11
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-11
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Etc/GMT-12.ics b/zoneinfo/Etc/GMT-12.ics
index 51f85051..3643bee7 100644
--- a/zoneinfo/Etc/GMT-12.ics
+++ b/zoneinfo/Etc/GMT-12.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-12
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-12
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-12
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Etc/GMT-13.ics b/zoneinfo/Etc/GMT-13.ics
index 63d5432e..4279355e 100644
--- a/zoneinfo/Etc/GMT-13.ics
+++ b/zoneinfo/Etc/GMT-13.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-13
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-13
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-13
BEGIN:STANDARD
TZNAME:+13
diff --git a/zoneinfo/Etc/GMT-14.ics b/zoneinfo/Etc/GMT-14.ics
index 6a15f826..38ecbbc1 100644
--- a/zoneinfo/Etc/GMT-14.ics
+++ b/zoneinfo/Etc/GMT-14.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-14
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-14
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-14
BEGIN:STANDARD
TZNAME:+14
diff --git a/zoneinfo/Etc/GMT-2.ics b/zoneinfo/Etc/GMT-2.ics
index 5e4f919a..ec57e8b5 100644
--- a/zoneinfo/Etc/GMT-2.ics
+++ b/zoneinfo/Etc/GMT-2.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-2
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-2
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-2
BEGIN:STANDARD
TZNAME:+02
diff --git a/zoneinfo/Etc/GMT-3.ics b/zoneinfo/Etc/GMT-3.ics
index 7084bf5c..ac56ab83 100644
--- a/zoneinfo/Etc/GMT-3.ics
+++ b/zoneinfo/Etc/GMT-3.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-3
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-3
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-3
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Etc/GMT-4.ics b/zoneinfo/Etc/GMT-4.ics
index c27ff08b..0720a178 100644
--- a/zoneinfo/Etc/GMT-4.ics
+++ b/zoneinfo/Etc/GMT-4.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-4
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-4
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-4
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Etc/GMT-5.ics b/zoneinfo/Etc/GMT-5.ics
index 6b2f1832..e15dcff0 100644
--- a/zoneinfo/Etc/GMT-5.ics
+++ b/zoneinfo/Etc/GMT-5.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-5
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-5
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-5
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Etc/GMT-6.ics b/zoneinfo/Etc/GMT-6.ics
index 8a70f382..57324bc5 100644
--- a/zoneinfo/Etc/GMT-6.ics
+++ b/zoneinfo/Etc/GMT-6.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-6
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-6
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-6
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Etc/GMT-7.ics b/zoneinfo/Etc/GMT-7.ics
index 0a76390e..5e6b2bb6 100644
--- a/zoneinfo/Etc/GMT-7.ics
+++ b/zoneinfo/Etc/GMT-7.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-7
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-7
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-7
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Etc/GMT-8.ics b/zoneinfo/Etc/GMT-8.ics
index efb0fb09..8042af1e 100644
--- a/zoneinfo/Etc/GMT-8.ics
+++ b/zoneinfo/Etc/GMT-8.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-8
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-8
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-8
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Etc/GMT-9.ics b/zoneinfo/Etc/GMT-9.ics
index 88feb74f..d4b7a77f 100644
--- a/zoneinfo/Etc/GMT-9.ics
+++ b/zoneinfo/Etc/GMT-9.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT-9
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT-9
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT-9
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Etc/GMT.ics b/zoneinfo/Etc/GMT.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Etc/GMT.ics
+++ b/zoneinfo/Etc/GMT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Etc/GMT0.ics b/zoneinfo/Etc/GMT0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Etc/GMT0.ics
+++ b/zoneinfo/Etc/GMT0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Etc/Greenwich.ics b/zoneinfo/Etc/Greenwich.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Etc/Greenwich.ics
+++ b/zoneinfo/Etc/Greenwich.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Etc/UCT.ics b/zoneinfo/Etc/UCT.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Etc/UCT.ics
+++ b/zoneinfo/Etc/UCT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/Etc/UTC.ics b/zoneinfo/Etc/UTC.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Etc/UTC.ics
+++ b/zoneinfo/Etc/UTC.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/Etc/Universal.ics b/zoneinfo/Etc/Universal.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Etc/Universal.ics
+++ b/zoneinfo/Etc/Universal.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/Etc/Zulu.ics b/zoneinfo/Etc/Zulu.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Etc/Zulu.ics
+++ b/zoneinfo/Etc/Zulu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/Europe/Amsterdam.ics b/zoneinfo/Europe/Amsterdam.ics
index f000a260..6ba8e6c4 100644
--- a/zoneinfo/Europe/Amsterdam.ics
+++ b/zoneinfo/Europe/Amsterdam.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Amsterdam
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Amsterdam
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Amsterdam
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Andorra.ics b/zoneinfo/Europe/Andorra.ics
index 3260ed94..c6a51627 100644
--- a/zoneinfo/Europe/Andorra.ics
+++ b/zoneinfo/Europe/Andorra.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Andorra
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Andorra
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Andorra
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Astrakhan.ics b/zoneinfo/Europe/Astrakhan.ics
index ef64e1c0..0e743e9f 100644
--- a/zoneinfo/Europe/Astrakhan.ics
+++ b/zoneinfo/Europe/Astrakhan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Astrakhan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Astrakhan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Astrakhan
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Europe/Athens.ics b/zoneinfo/Europe/Athens.ics
index 9facb940..fac3860b 100644
--- a/zoneinfo/Europe/Athens.ics
+++ b/zoneinfo/Europe/Athens.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Athens
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Athens
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Athens
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Belfast.ics b/zoneinfo/Europe/Belfast.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/Europe/Belfast.ics
+++ b/zoneinfo/Europe/Belfast.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/Europe/Belgrade.ics b/zoneinfo/Europe/Belgrade.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Belgrade.ics
+++ b/zoneinfo/Europe/Belgrade.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Berlin.ics b/zoneinfo/Europe/Berlin.ics
index b48761c1..44697092 100644
--- a/zoneinfo/Europe/Berlin.ics
+++ b/zoneinfo/Europe/Berlin.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Berlin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Berlin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Berlin
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Bratislava.ics b/zoneinfo/Europe/Bratislava.ics
index 4208cfc8..ca590934 100644
--- a/zoneinfo/Europe/Bratislava.ics
+++ b/zoneinfo/Europe/Bratislava.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Prague
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Prague
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Prague
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Brussels.ics b/zoneinfo/Europe/Brussels.ics
index bae9e28b..149ddf21 100644
--- a/zoneinfo/Europe/Brussels.ics
+++ b/zoneinfo/Europe/Brussels.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Brussels
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Brussels
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Brussels
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Bucharest.ics b/zoneinfo/Europe/Bucharest.ics
index 90f8f65e..8ff4cb98 100644
--- a/zoneinfo/Europe/Bucharest.ics
+++ b/zoneinfo/Europe/Bucharest.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Bucharest
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Bucharest
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Bucharest
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Budapest.ics b/zoneinfo/Europe/Budapest.ics
index 5ad47325..67a69200 100644
--- a/zoneinfo/Europe/Budapest.ics
+++ b/zoneinfo/Europe/Budapest.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Budapest
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Budapest
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Budapest
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Busingen.ics b/zoneinfo/Europe/Busingen.ics
index 8d071ddf..093b0731 100644
--- a/zoneinfo/Europe/Busingen.ics
+++ b/zoneinfo/Europe/Busingen.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Zurich
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Zurich
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Zurich
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Chisinau.ics b/zoneinfo/Europe/Chisinau.ics
index e0f32d84..921d8a79 100644
--- a/zoneinfo/Europe/Chisinau.ics
+++ b/zoneinfo/Europe/Chisinau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Chisinau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Chisinau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Chisinau
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Copenhagen.ics b/zoneinfo/Europe/Copenhagen.ics
index afab1335..baaeae98 100644
--- a/zoneinfo/Europe/Copenhagen.ics
+++ b/zoneinfo/Europe/Copenhagen.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Copenhagen
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Copenhagen
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Copenhagen
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Dublin.ics b/zoneinfo/Europe/Dublin.ics
index 52380405..1c493edb 100644
--- a/zoneinfo/Europe/Dublin.ics
+++ b/zoneinfo/Europe/Dublin.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Dublin
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Dublin
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Dublin
BEGIN:STANDARD
TZNAME:IST
diff --git a/zoneinfo/Europe/Gibraltar.ics b/zoneinfo/Europe/Gibraltar.ics
index aa3d95b8..08d3e617 100644
--- a/zoneinfo/Europe/Gibraltar.ics
+++ b/zoneinfo/Europe/Gibraltar.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Gibraltar
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Gibraltar
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Gibraltar
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Guernsey.ics b/zoneinfo/Europe/Guernsey.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/Europe/Guernsey.ics
+++ b/zoneinfo/Europe/Guernsey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/Europe/Helsinki.ics b/zoneinfo/Europe/Helsinki.ics
index 889988fe..56674704 100644
--- a/zoneinfo/Europe/Helsinki.ics
+++ b/zoneinfo/Europe/Helsinki.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Helsinki
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Helsinki
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Helsinki
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Isle_of_Man.ics b/zoneinfo/Europe/Isle_of_Man.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/Europe/Isle_of_Man.ics
+++ b/zoneinfo/Europe/Isle_of_Man.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/Europe/Istanbul.ics b/zoneinfo/Europe/Istanbul.ics
index 576ca49c..8234cbbb 100644
--- a/zoneinfo/Europe/Istanbul.ics
+++ b/zoneinfo/Europe/Istanbul.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Istanbul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Istanbul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Istanbul
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Europe/Jersey.ics b/zoneinfo/Europe/Jersey.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/Europe/Jersey.ics
+++ b/zoneinfo/Europe/Jersey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/Europe/Kaliningrad.ics b/zoneinfo/Europe/Kaliningrad.ics
index 84b77e0f..b9c5142b 100644
--- a/zoneinfo/Europe/Kaliningrad.ics
+++ b/zoneinfo/Europe/Kaliningrad.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Kaliningrad
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Kaliningrad
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Kaliningrad
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Europe/Kiev.ics b/zoneinfo/Europe/Kiev.ics
index e67c1c91..7b74f022 100644
--- a/zoneinfo/Europe/Kiev.ics
+++ b/zoneinfo/Europe/Kiev.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Kiev
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Kiev
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Kiev
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Kirov.ics b/zoneinfo/Europe/Kirov.ics
index 5866303f..cc172460 100644
--- a/zoneinfo/Europe/Kirov.ics
+++ b/zoneinfo/Europe/Kirov.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Kirov
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Kirov
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Kirov
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Europe/Lisbon.ics b/zoneinfo/Europe/Lisbon.ics
index e60df94c..f3dc7908 100644
--- a/zoneinfo/Europe/Lisbon.ics
+++ b/zoneinfo/Europe/Lisbon.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Lisbon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Lisbon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Lisbon
BEGIN:STANDARD
TZNAME:WET
diff --git a/zoneinfo/Europe/Ljubljana.ics b/zoneinfo/Europe/Ljubljana.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Ljubljana.ics
+++ b/zoneinfo/Europe/Ljubljana.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/London.ics b/zoneinfo/Europe/London.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/Europe/London.ics
+++ b/zoneinfo/Europe/London.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/Europe/Luxembourg.ics b/zoneinfo/Europe/Luxembourg.ics
index 6c9d43c1..c5e8d23e 100644
--- a/zoneinfo/Europe/Luxembourg.ics
+++ b/zoneinfo/Europe/Luxembourg.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Luxembourg
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Luxembourg
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Luxembourg
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Madrid.ics b/zoneinfo/Europe/Madrid.ics
index f92669f9..f8e322a2 100644
--- a/zoneinfo/Europe/Madrid.ics
+++ b/zoneinfo/Europe/Madrid.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Madrid
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Madrid
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Madrid
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Malta.ics b/zoneinfo/Europe/Malta.ics
index ff1ead71..995cde3f 100644
--- a/zoneinfo/Europe/Malta.ics
+++ b/zoneinfo/Europe/Malta.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Malta
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Malta
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Malta
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Mariehamn.ics b/zoneinfo/Europe/Mariehamn.ics
index 889988fe..56674704 100644
--- a/zoneinfo/Europe/Mariehamn.ics
+++ b/zoneinfo/Europe/Mariehamn.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Helsinki
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Helsinki
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Helsinki
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Minsk.ics b/zoneinfo/Europe/Minsk.ics
index 4c21f35a..637025de 100644
--- a/zoneinfo/Europe/Minsk.ics
+++ b/zoneinfo/Europe/Minsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Minsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Minsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Minsk
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Europe/Monaco.ics b/zoneinfo/Europe/Monaco.ics
index 4d68c63d..33f40446 100644
--- a/zoneinfo/Europe/Monaco.ics
+++ b/zoneinfo/Europe/Monaco.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Monaco
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Monaco
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Monaco
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Moscow.ics b/zoneinfo/Europe/Moscow.ics
index 9c539797..5b3a00f4 100644
--- a/zoneinfo/Europe/Moscow.ics
+++ b/zoneinfo/Europe/Moscow.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Moscow
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Moscow
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Moscow
BEGIN:STANDARD
TZNAME:MSK
diff --git a/zoneinfo/Europe/Nicosia.ics b/zoneinfo/Europe/Nicosia.ics
index 3a79df1a..f34f04f7 100644
--- a/zoneinfo/Europe/Nicosia.ics
+++ b/zoneinfo/Europe/Nicosia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Nicosia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Nicosia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Nicosia
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/Europe/Oslo.ics b/zoneinfo/Europe/Oslo.ics
index e337e96f..8274486e 100644
--- a/zoneinfo/Europe/Oslo.ics
+++ b/zoneinfo/Europe/Oslo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Oslo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Oslo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Oslo
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Paris.ics b/zoneinfo/Europe/Paris.ics
index 2f92ebd7..76ac2cd7 100644
--- a/zoneinfo/Europe/Paris.ics
+++ b/zoneinfo/Europe/Paris.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Paris
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Paris
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Paris
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Podgorica.ics b/zoneinfo/Europe/Podgorica.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Podgorica.ics
+++ b/zoneinfo/Europe/Podgorica.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Prague.ics b/zoneinfo/Europe/Prague.ics
index 4208cfc8..ca590934 100644
--- a/zoneinfo/Europe/Prague.ics
+++ b/zoneinfo/Europe/Prague.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Prague
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Prague
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Prague
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Riga.ics b/zoneinfo/Europe/Riga.ics
index 0940f1f5..0d509f6d 100644
--- a/zoneinfo/Europe/Riga.ics
+++ b/zoneinfo/Europe/Riga.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Riga
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Riga
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Riga
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Rome.ics b/zoneinfo/Europe/Rome.ics
index 51108623..cb4d7d1b 100644
--- a/zoneinfo/Europe/Rome.ics
+++ b/zoneinfo/Europe/Rome.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Rome
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Rome
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Rome
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Samara.ics b/zoneinfo/Europe/Samara.ics
index f0cc5c7f..bd1e55f3 100644
--- a/zoneinfo/Europe/Samara.ics
+++ b/zoneinfo/Europe/Samara.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Samara
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Samara
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Samara
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Europe/San_Marino.ics b/zoneinfo/Europe/San_Marino.ics
index 51108623..cb4d7d1b 100644
--- a/zoneinfo/Europe/San_Marino.ics
+++ b/zoneinfo/Europe/San_Marino.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Rome
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Rome
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Rome
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Sarajevo.ics b/zoneinfo/Europe/Sarajevo.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Sarajevo.ics
+++ b/zoneinfo/Europe/Sarajevo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Saratov.ics b/zoneinfo/Europe/Saratov.ics
index 91eded5f..df3657a9 100644
--- a/zoneinfo/Europe/Saratov.ics
+++ b/zoneinfo/Europe/Saratov.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Saratov
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Saratov
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Saratov
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Europe/Simferopol.ics b/zoneinfo/Europe/Simferopol.ics
index e5e9237a..6f85d842 100644
--- a/zoneinfo/Europe/Simferopol.ics
+++ b/zoneinfo/Europe/Simferopol.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Simferopol
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Simferopol
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Simferopol
BEGIN:STANDARD
TZNAME:MSK
diff --git a/zoneinfo/Europe/Skopje.ics b/zoneinfo/Europe/Skopje.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Skopje.ics
+++ b/zoneinfo/Europe/Skopje.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Sofia.ics b/zoneinfo/Europe/Sofia.ics
index cd3fe083..43e07e57 100644
--- a/zoneinfo/Europe/Sofia.ics
+++ b/zoneinfo/Europe/Sofia.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Sofia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Sofia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Sofia
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Stockholm.ics b/zoneinfo/Europe/Stockholm.ics
index 352bcf74..954f87fe 100644
--- a/zoneinfo/Europe/Stockholm.ics
+++ b/zoneinfo/Europe/Stockholm.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Stockholm
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Stockholm
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Stockholm
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Tallinn.ics b/zoneinfo/Europe/Tallinn.ics
index c678807d..f4204339 100644
--- a/zoneinfo/Europe/Tallinn.ics
+++ b/zoneinfo/Europe/Tallinn.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Tallinn
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Tallinn
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Tallinn
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Tirane.ics b/zoneinfo/Europe/Tirane.ics
index fce87af7..d305aa3a 100644
--- a/zoneinfo/Europe/Tirane.ics
+++ b/zoneinfo/Europe/Tirane.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Tirane
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Tirane
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Tirane
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Tiraspol.ics b/zoneinfo/Europe/Tiraspol.ics
index e0f32d84..921d8a79 100644
--- a/zoneinfo/Europe/Tiraspol.ics
+++ b/zoneinfo/Europe/Tiraspol.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Chisinau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Chisinau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Chisinau
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Ulyanovsk.ics b/zoneinfo/Europe/Ulyanovsk.ics
index eaa998a4..4bd12c8e 100644
--- a/zoneinfo/Europe/Ulyanovsk.ics
+++ b/zoneinfo/Europe/Ulyanovsk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Ulyanovsk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Ulyanovsk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Ulyanovsk
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Europe/Uzhgorod.ics b/zoneinfo/Europe/Uzhgorod.ics
index 40d34061..4ae4f32c 100644
--- a/zoneinfo/Europe/Uzhgorod.ics
+++ b/zoneinfo/Europe/Uzhgorod.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Uzhgorod
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Uzhgorod
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Uzhgorod
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Vaduz.ics b/zoneinfo/Europe/Vaduz.ics
index 8d071ddf..093b0731 100644
--- a/zoneinfo/Europe/Vaduz.ics
+++ b/zoneinfo/Europe/Vaduz.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Zurich
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Zurich
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Zurich
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Vatican.ics b/zoneinfo/Europe/Vatican.ics
index 51108623..cb4d7d1b 100644
--- a/zoneinfo/Europe/Vatican.ics
+++ b/zoneinfo/Europe/Vatican.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Rome
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Rome
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Rome
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Vienna.ics b/zoneinfo/Europe/Vienna.ics
index 902e6f91..b34dfe6e 100644
--- a/zoneinfo/Europe/Vienna.ics
+++ b/zoneinfo/Europe/Vienna.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Vienna
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Vienna
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Vienna
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Vilnius.ics b/zoneinfo/Europe/Vilnius.ics
index 04b8721c..bb703a03 100644
--- a/zoneinfo/Europe/Vilnius.ics
+++ b/zoneinfo/Europe/Vilnius.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Vilnius
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Vilnius
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Vilnius
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Volgograd.ics b/zoneinfo/Europe/Volgograd.ics
index f3448341..241ba94e 100644
--- a/zoneinfo/Europe/Volgograd.ics
+++ b/zoneinfo/Europe/Volgograd.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Volgograd
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Volgograd
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Volgograd
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/Europe/Warsaw.ics b/zoneinfo/Europe/Warsaw.ics
index 3c65924d..e93dac14 100644
--- a/zoneinfo/Europe/Warsaw.ics
+++ b/zoneinfo/Europe/Warsaw.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Warsaw
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Warsaw
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Warsaw
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Zagreb.ics b/zoneinfo/Europe/Zagreb.ics
index 34b5583b..0e522cb6 100644
--- a/zoneinfo/Europe/Zagreb.ics
+++ b/zoneinfo/Europe/Zagreb.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Belgrade
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Belgrade
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Belgrade
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Europe/Zaporozhye.ics b/zoneinfo/Europe/Zaporozhye.ics
index b7b7eb54..d1c7a236 100644
--- a/zoneinfo/Europe/Zaporozhye.ics
+++ b/zoneinfo/Europe/Zaporozhye.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Zaporozhye
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Zaporozhye
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Zaporozhye
BEGIN:DAYLIGHT
TZNAME:EEST
diff --git a/zoneinfo/Europe/Zurich.ics b/zoneinfo/Europe/Zurich.ics
index 8d071ddf..093b0731 100644
--- a/zoneinfo/Europe/Zurich.ics
+++ b/zoneinfo/Europe/Zurich.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Zurich
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Zurich
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Zurich
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/GB-Eire.ics b/zoneinfo/GB-Eire.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/GB-Eire.ics
+++ b/zoneinfo/GB-Eire.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/GB.ics b/zoneinfo/GB.ics
index 567f26b6..0323f905 100644
--- a/zoneinfo/GB.ics
+++ b/zoneinfo/GB.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/London
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/London
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/London
BEGIN:DAYLIGHT
TZNAME:BST
diff --git a/zoneinfo/GMT+0.ics b/zoneinfo/GMT+0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/GMT+0.ics
+++ b/zoneinfo/GMT+0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/GMT-0.ics b/zoneinfo/GMT-0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/GMT-0.ics
+++ b/zoneinfo/GMT-0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/GMT.ics b/zoneinfo/GMT.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/GMT.ics
+++ b/zoneinfo/GMT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/GMT0.ics b/zoneinfo/GMT0.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/GMT0.ics
+++ b/zoneinfo/GMT0.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Greenwich.ics b/zoneinfo/Greenwich.ics
index 0b4e712c..ccd04894 100644
--- a/zoneinfo/Greenwich.ics
+++ b/zoneinfo/Greenwich.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/GMT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/GMT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/GMT
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/HST.ics b/zoneinfo/HST.ics
index 9028758f..164d263d 100644
--- a/zoneinfo/HST.ics
+++ b/zoneinfo/HST.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/HST
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/HST
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:HST
BEGIN:STANDARD
TZNAME:HST
diff --git a/zoneinfo/Hongkong.ics b/zoneinfo/Hongkong.ics
index 4bb4603f..3795c449 100644
--- a/zoneinfo/Hongkong.ics
+++ b/zoneinfo/Hongkong.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Hong_Kong
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Hong_Kong
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Hong_Kong
BEGIN:STANDARD
TZNAME:HKT
diff --git a/zoneinfo/Iceland.ics b/zoneinfo/Iceland.ics
index 8913b0ac..56942646 100644
--- a/zoneinfo/Iceland.ics
+++ b/zoneinfo/Iceland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Atlantic/Reykjavik
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Atlantic/Reykjavik
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Atlantic/Reykjavik
BEGIN:STANDARD
TZNAME:GMT
diff --git a/zoneinfo/Indian/Antananarivo.ics b/zoneinfo/Indian/Antananarivo.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Indian/Antananarivo.ics
+++ b/zoneinfo/Indian/Antananarivo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Indian/Chagos.ics b/zoneinfo/Indian/Chagos.ics
index 453c7cbb..03a84995 100644
--- a/zoneinfo/Indian/Chagos.ics
+++ b/zoneinfo/Indian/Chagos.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Chagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Chagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Chagos
BEGIN:STANDARD
TZNAME:+06
diff --git a/zoneinfo/Indian/Christmas.ics b/zoneinfo/Indian/Christmas.ics
index 56aa3c93..fc8e702d 100644
--- a/zoneinfo/Indian/Christmas.ics
+++ b/zoneinfo/Indian/Christmas.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Christmas
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Christmas
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Christmas
BEGIN:STANDARD
TZNAME:+07
diff --git a/zoneinfo/Indian/Cocos.ics b/zoneinfo/Indian/Cocos.ics
index dd4139c4..6035ad14 100644
--- a/zoneinfo/Indian/Cocos.ics
+++ b/zoneinfo/Indian/Cocos.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Cocos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Cocos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Cocos
BEGIN:STANDARD
TZNAME:+0630
diff --git a/zoneinfo/Indian/Comoro.ics b/zoneinfo/Indian/Comoro.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Indian/Comoro.ics
+++ b/zoneinfo/Indian/Comoro.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Indian/Kerguelen.ics b/zoneinfo/Indian/Kerguelen.ics
index a790cd7a..5b8d48a7 100644
--- a/zoneinfo/Indian/Kerguelen.ics
+++ b/zoneinfo/Indian/Kerguelen.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Kerguelen
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Kerguelen
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Kerguelen
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Indian/Mahe.ics b/zoneinfo/Indian/Mahe.ics
index b48681a0..622032a1 100644
--- a/zoneinfo/Indian/Mahe.ics
+++ b/zoneinfo/Indian/Mahe.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Mahe
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Mahe
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Mahe
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Indian/Maldives.ics b/zoneinfo/Indian/Maldives.ics
index 9487c988..f35e53c0 100644
--- a/zoneinfo/Indian/Maldives.ics
+++ b/zoneinfo/Indian/Maldives.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Maldives
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Maldives
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Maldives
BEGIN:STANDARD
TZNAME:+05
diff --git a/zoneinfo/Indian/Mauritius.ics b/zoneinfo/Indian/Mauritius.ics
index 9e99e940..c47f578d 100644
--- a/zoneinfo/Indian/Mauritius.ics
+++ b/zoneinfo/Indian/Mauritius.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Mauritius
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Mauritius
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Mauritius
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Indian/Mayotte.ics b/zoneinfo/Indian/Mayotte.ics
index 9eeda226..63e544b5 100644
--- a/zoneinfo/Indian/Mayotte.ics
+++ b/zoneinfo/Indian/Mayotte.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Nairobi
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Nairobi
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Nairobi
BEGIN:STANDARD
TZNAME:EAT
diff --git a/zoneinfo/Indian/Reunion.ics b/zoneinfo/Indian/Reunion.ics
index 5246269a..da30689b 100644
--- a/zoneinfo/Indian/Reunion.ics
+++ b/zoneinfo/Indian/Reunion.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Indian/Reunion
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Indian/Reunion
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Indian/Reunion
BEGIN:STANDARD
TZNAME:+04
diff --git a/zoneinfo/Iran.ics b/zoneinfo/Iran.ics
index bdbfb7ac..cfbab1fe 100644
--- a/zoneinfo/Iran.ics
+++ b/zoneinfo/Iran.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tehran
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tehran
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tehran
BEGIN:DAYLIGHT
TZNAME:+0430
diff --git a/zoneinfo/Israel.ics b/zoneinfo/Israel.ics
index f41a1c68..00e44fca 100644
--- a/zoneinfo/Israel.ics
+++ b/zoneinfo/Israel.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Jerusalem
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Jerusalem
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Jerusalem
BEGIN:DAYLIGHT
TZNAME:IDT
diff --git a/zoneinfo/Jamaica.ics b/zoneinfo/Jamaica.ics
index 1ef6b2d3..286f140f 100644
--- a/zoneinfo/Jamaica.ics
+++ b/zoneinfo/Jamaica.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Jamaica
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Jamaica
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Jamaica
BEGIN:STANDARD
TZNAME:EST
diff --git a/zoneinfo/Japan.ics b/zoneinfo/Japan.ics
index cbbad067..5c0806fc 100644
--- a/zoneinfo/Japan.ics
+++ b/zoneinfo/Japan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Tokyo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Tokyo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Tokyo
BEGIN:STANDARD
TZNAME:JST
diff --git a/zoneinfo/Kwajalein.ics b/zoneinfo/Kwajalein.ics
index 08b52696..5eaca9b7 100644
--- a/zoneinfo/Kwajalein.ics
+++ b/zoneinfo/Kwajalein.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Kwajalein
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Kwajalein
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Kwajalein
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Libya.ics b/zoneinfo/Libya.ics
index 6d31ae4a..72f0e425 100644
--- a/zoneinfo/Libya.ics
+++ b/zoneinfo/Libya.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Africa/Tripoli
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Africa/Tripoli
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Africa/Tripoli
BEGIN:STANDARD
TZNAME:EET
diff --git a/zoneinfo/MET.ics b/zoneinfo/MET.ics
index be1a9dd4..b06ca2a6 100644
--- a/zoneinfo/MET.ics
+++ b/zoneinfo/MET.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/MET
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/MET
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:MET
BEGIN:DAYLIGHT
TZNAME:MEST
diff --git a/zoneinfo/MST.ics b/zoneinfo/MST.ics
index 79847ad4..ae82c296 100644
--- a/zoneinfo/MST.ics
+++ b/zoneinfo/MST.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/MST
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/MST
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:MST
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/MST7MDT.ics b/zoneinfo/MST7MDT.ics
index 3e204499..9e3bb351 100644
--- a/zoneinfo/MST7MDT.ics
+++ b/zoneinfo/MST7MDT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/MST7MDT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/MST7MDT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:MST7MDT
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/Mexico/BajaNorte.ics b/zoneinfo/Mexico/BajaNorte.ics
index 2141774b..20014d51 100644
--- a/zoneinfo/Mexico/BajaNorte.ics
+++ b/zoneinfo/Mexico/BajaNorte.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Tijuana
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Tijuana
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Tijuana
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/Mexico/BajaSur.ics b/zoneinfo/Mexico/BajaSur.ics
index 79e4194b..d859310b 100644
--- a/zoneinfo/Mexico/BajaSur.ics
+++ b/zoneinfo/Mexico/BajaSur.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Mazatlan
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Mazatlan
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Mazatlan
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/Mexico/General.ics b/zoneinfo/Mexico/General.ics
index 8f72edb3..c869740c 100644
--- a/zoneinfo/Mexico/General.ics
+++ b/zoneinfo/Mexico/General.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Mexico_City
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Mexico_City
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Mexico_City
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/NZ-CHAT.ics b/zoneinfo/NZ-CHAT.ics
index e6f8db75..cdfaa3db 100644
--- a/zoneinfo/NZ-CHAT.ics
+++ b/zoneinfo/NZ-CHAT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Chatham
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Chatham
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Chatham
BEGIN:DAYLIGHT
TZNAME:+1345
diff --git a/zoneinfo/NZ.ics b/zoneinfo/NZ.ics
index 22f2072d..ae1b4b12 100644
--- a/zoneinfo/NZ.ics
+++ b/zoneinfo/NZ.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Auckland
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Auckland
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Auckland
BEGIN:DAYLIGHT
TZNAME:NZDT
diff --git a/zoneinfo/Navajo.ics b/zoneinfo/Navajo.ics
index 79d6ba54..76584cb4 100644
--- a/zoneinfo/Navajo.ics
+++ b/zoneinfo/Navajo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Denver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Denver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/PRC.ics b/zoneinfo/PRC.ics
index ee91b6ac..6ef4af39 100644
--- a/zoneinfo/PRC.ics
+++ b/zoneinfo/PRC.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Shanghai
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Shanghai
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Shanghai
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/PST8PDT.ics b/zoneinfo/PST8PDT.ics
index 375de779..16dc1a46 100644
--- a/zoneinfo/PST8PDT.ics
+++ b/zoneinfo/PST8PDT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/PST8PDT
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/PST8PDT
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:PST8PDT
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/Pacific/Apia.ics b/zoneinfo/Pacific/Apia.ics
index 8aaa928c..cab045c1 100644
--- a/zoneinfo/Pacific/Apia.ics
+++ b/zoneinfo/Pacific/Apia.ics
@@ -2,22 +2,14 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Apia
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Apia
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Apia
BEGIN:STANDARD
TZNAME:+13
-TZOFFSETFROM:+1400
+TZOFFSETFROM:+1300
TZOFFSETTO:+1300
-DTSTART:19700405T040000
-RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU
+DTSTART:19700101T000000
END:STANDARD
-BEGIN:DAYLIGHT
-TZNAME:+14
-TZOFFSETFROM:+1300
-TZOFFSETTO:+1400
-DTSTART:19700927T030000
-RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU
-END:DAYLIGHT
END:VTIMEZONE
END:VCALENDAR
diff --git a/zoneinfo/Pacific/Auckland.ics b/zoneinfo/Pacific/Auckland.ics
index 22f2072d..ae1b4b12 100644
--- a/zoneinfo/Pacific/Auckland.ics
+++ b/zoneinfo/Pacific/Auckland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Auckland
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Auckland
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Auckland
BEGIN:DAYLIGHT
TZNAME:NZDT
diff --git a/zoneinfo/Pacific/Bougainville.ics b/zoneinfo/Pacific/Bougainville.ics
index a1cae494..1fef9761 100644
--- a/zoneinfo/Pacific/Bougainville.ics
+++ b/zoneinfo/Pacific/Bougainville.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Bougainville
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Bougainville
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Bougainville
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Chatham.ics b/zoneinfo/Pacific/Chatham.ics
index e6f8db75..cdfaa3db 100644
--- a/zoneinfo/Pacific/Chatham.ics
+++ b/zoneinfo/Pacific/Chatham.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Chatham
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Chatham
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Chatham
BEGIN:DAYLIGHT
TZNAME:+1345
diff --git a/zoneinfo/Pacific/Chuuk.ics b/zoneinfo/Pacific/Chuuk.ics
index 771c4e5a..5a79b476 100644
--- a/zoneinfo/Pacific/Chuuk.ics
+++ b/zoneinfo/Pacific/Chuuk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Chuuk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Chuuk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Chuuk
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Pacific/Easter.ics b/zoneinfo/Pacific/Easter.ics
index 08ad2cfe..d9a2f772 100644
--- a/zoneinfo/Pacific/Easter.ics
+++ b/zoneinfo/Pacific/Easter.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Easter
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Easter
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Easter
BEGIN:STANDARD
TZNAME:-06
diff --git a/zoneinfo/Pacific/Efate.ics b/zoneinfo/Pacific/Efate.ics
index 5cf28c16..ec3f5d8a 100644
--- a/zoneinfo/Pacific/Efate.ics
+++ b/zoneinfo/Pacific/Efate.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Efate
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Efate
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Efate
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Enderbury.ics b/zoneinfo/Pacific/Enderbury.ics
index 0cb1ba88..6631f00c 100644
--- a/zoneinfo/Pacific/Enderbury.ics
+++ b/zoneinfo/Pacific/Enderbury.ics
@@ -2,9 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Enderbury
-LAST-MODIFIED:20210410T122212Z
-X-LIC-LOCATION:Pacific/Enderbury
+TZID:/citadel.org/20211207_1/Pacific/Kanton
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:Pacific/Kanton
BEGIN:STANDARD
TZNAME:+13
TZOFFSETFROM:+1300
diff --git a/zoneinfo/Pacific/Fakaofo.ics b/zoneinfo/Pacific/Fakaofo.ics
index 611e6354..7001fea4 100644
--- a/zoneinfo/Pacific/Fakaofo.ics
+++ b/zoneinfo/Pacific/Fakaofo.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Fakaofo
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Fakaofo
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Fakaofo
BEGIN:STANDARD
TZNAME:+13
diff --git a/zoneinfo/Pacific/Fiji.ics b/zoneinfo/Pacific/Fiji.ics
index 3f5867ff..484cd8be 100644
--- a/zoneinfo/Pacific/Fiji.ics
+++ b/zoneinfo/Pacific/Fiji.ics
@@ -2,16 +2,9 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Fiji
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Fiji
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Fiji
-BEGIN:STANDARD
-TZNAME:+12
-TZOFFSETFROM:+1300
-TZOFFSETTO:+1200
-DTSTART:19700118T030000
-RRULE:FREQ=YEARLY;BYMONTH=1;BYDAY=-2SU
-END:STANDARD
BEGIN:DAYLIGHT
TZNAME:+13
TZOFFSETFROM:+1200
@@ -19,5 +12,12 @@ TZOFFSETTO:+1300
DTSTART:19701108T020000
RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=2SU
END:DAYLIGHT
+BEGIN:STANDARD
+TZNAME:+12
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1200
+DTSTART:19700118T030000
+RRULE:FREQ=YEARLY;BYMONTH=1;BYDAY=-2SU
+END:STANDARD
END:VTIMEZONE
END:VCALENDAR
diff --git a/zoneinfo/Pacific/Funafuti.ics b/zoneinfo/Pacific/Funafuti.ics
index 5543da78..358fb707 100644
--- a/zoneinfo/Pacific/Funafuti.ics
+++ b/zoneinfo/Pacific/Funafuti.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Funafuti
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Funafuti
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Funafuti
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Galapagos.ics b/zoneinfo/Pacific/Galapagos.ics
index 22aa0ea0..7f4f9296 100644
--- a/zoneinfo/Pacific/Galapagos.ics
+++ b/zoneinfo/Pacific/Galapagos.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Galapagos
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Galapagos
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Galapagos
BEGIN:STANDARD
TZNAME:-06
diff --git a/zoneinfo/Pacific/Gambier.ics b/zoneinfo/Pacific/Gambier.ics
index 6bf45db6..e94fff84 100644
--- a/zoneinfo/Pacific/Gambier.ics
+++ b/zoneinfo/Pacific/Gambier.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Gambier
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Gambier
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Gambier
BEGIN:STANDARD
TZNAME:-09
diff --git a/zoneinfo/Pacific/Guadalcanal.ics b/zoneinfo/Pacific/Guadalcanal.ics
index c9da6fca..25cc2a79 100644
--- a/zoneinfo/Pacific/Guadalcanal.ics
+++ b/zoneinfo/Pacific/Guadalcanal.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Guadalcanal
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Guadalcanal
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Guadalcanal
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Guam.ics b/zoneinfo/Pacific/Guam.ics
index c646e2b7..6ad9f14e 100644
--- a/zoneinfo/Pacific/Guam.ics
+++ b/zoneinfo/Pacific/Guam.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Guam
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Guam
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Guam
BEGIN:STANDARD
TZNAME:ChST
diff --git a/zoneinfo/Pacific/Honolulu.ics b/zoneinfo/Pacific/Honolulu.ics
index 7c3f0781..c97c440e 100644
--- a/zoneinfo/Pacific/Honolulu.ics
+++ b/zoneinfo/Pacific/Honolulu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Honolulu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Honolulu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Honolulu
BEGIN:STANDARD
TZNAME:HST
diff --git a/zoneinfo/Pacific/Johnston.ics b/zoneinfo/Pacific/Johnston.ics
index 7c3f0781..c97c440e 100644
--- a/zoneinfo/Pacific/Johnston.ics
+++ b/zoneinfo/Pacific/Johnston.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Honolulu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Honolulu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Honolulu
BEGIN:STANDARD
TZNAME:HST
diff --git a/zoneinfo/Pacific/Kanton.ics b/zoneinfo/Pacific/Kanton.ics
new file mode 100644
index 00000000..6631f00c
--- /dev/null
+++ b/zoneinfo/Pacific/Kanton.ics
@@ -0,0 +1,15 @@
+BEGIN:VCALENDAR
+PRODID:-//citadel.org//NONSGML Citadel calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/citadel.org/20211207_1/Pacific/Kanton
+LAST-MODIFIED:20211207T194144Z
+X-LIC-LOCATION:Pacific/Kanton
+BEGIN:STANDARD
+TZNAME:+13
+TZOFFSETFROM:+1300
+TZOFFSETTO:+1300
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
diff --git a/zoneinfo/Pacific/Kiritimati.ics b/zoneinfo/Pacific/Kiritimati.ics
index e4a0076f..61329cf7 100644
--- a/zoneinfo/Pacific/Kiritimati.ics
+++ b/zoneinfo/Pacific/Kiritimati.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Kiritimati
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Kiritimati
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Kiritimati
BEGIN:STANDARD
TZNAME:+14
diff --git a/zoneinfo/Pacific/Kosrae.ics b/zoneinfo/Pacific/Kosrae.ics
index 34b4cd6f..af071c21 100644
--- a/zoneinfo/Pacific/Kosrae.ics
+++ b/zoneinfo/Pacific/Kosrae.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Kosrae
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Kosrae
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Kosrae
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Kwajalein.ics b/zoneinfo/Pacific/Kwajalein.ics
index 08b52696..5eaca9b7 100644
--- a/zoneinfo/Pacific/Kwajalein.ics
+++ b/zoneinfo/Pacific/Kwajalein.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Kwajalein
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Kwajalein
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Kwajalein
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Majuro.ics b/zoneinfo/Pacific/Majuro.ics
index 240964e3..91b62ca8 100644
--- a/zoneinfo/Pacific/Majuro.ics
+++ b/zoneinfo/Pacific/Majuro.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Majuro
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Majuro
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Majuro
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Marquesas.ics b/zoneinfo/Pacific/Marquesas.ics
index 807caa80..55347fcd 100644
--- a/zoneinfo/Pacific/Marquesas.ics
+++ b/zoneinfo/Pacific/Marquesas.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Marquesas
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Marquesas
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Marquesas
BEGIN:STANDARD
TZNAME:-0930
diff --git a/zoneinfo/Pacific/Midway.ics b/zoneinfo/Pacific/Midway.ics
index 0e9f2214..aec83b7a 100644
--- a/zoneinfo/Pacific/Midway.ics
+++ b/zoneinfo/Pacific/Midway.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pago_Pago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pago_Pago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pago_Pago
BEGIN:STANDARD
TZNAME:SST
diff --git a/zoneinfo/Pacific/Nauru.ics b/zoneinfo/Pacific/Nauru.ics
index 9d74f352..182671e7 100644
--- a/zoneinfo/Pacific/Nauru.ics
+++ b/zoneinfo/Pacific/Nauru.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Nauru
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Nauru
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Nauru
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Niue.ics b/zoneinfo/Pacific/Niue.ics
index 6534dbe9..1f9d6437 100644
--- a/zoneinfo/Pacific/Niue.ics
+++ b/zoneinfo/Pacific/Niue.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Niue
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Niue
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Niue
BEGIN:STANDARD
TZNAME:-11
diff --git a/zoneinfo/Pacific/Norfolk.ics b/zoneinfo/Pacific/Norfolk.ics
index c8022b80..1e19535a 100644
--- a/zoneinfo/Pacific/Norfolk.ics
+++ b/zoneinfo/Pacific/Norfolk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Norfolk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Norfolk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Norfolk
BEGIN:DAYLIGHT
TZNAME:+12
diff --git a/zoneinfo/Pacific/Noumea.ics b/zoneinfo/Pacific/Noumea.ics
index 79129781..a221353d 100644
--- a/zoneinfo/Pacific/Noumea.ics
+++ b/zoneinfo/Pacific/Noumea.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Noumea
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Noumea
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Noumea
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Pago_Pago.ics b/zoneinfo/Pacific/Pago_Pago.ics
index 0e9f2214..aec83b7a 100644
--- a/zoneinfo/Pacific/Pago_Pago.ics
+++ b/zoneinfo/Pacific/Pago_Pago.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pago_Pago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pago_Pago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pago_Pago
BEGIN:STANDARD
TZNAME:SST
diff --git a/zoneinfo/Pacific/Palau.ics b/zoneinfo/Pacific/Palau.ics
index 139c2427..321acf82 100644
--- a/zoneinfo/Pacific/Palau.ics
+++ b/zoneinfo/Pacific/Palau.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Palau
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Palau
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Palau
BEGIN:STANDARD
TZNAME:+09
diff --git a/zoneinfo/Pacific/Pitcairn.ics b/zoneinfo/Pacific/Pitcairn.ics
index e9d6bb3e..18647bc6 100644
--- a/zoneinfo/Pacific/Pitcairn.ics
+++ b/zoneinfo/Pacific/Pitcairn.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pitcairn
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pitcairn
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pitcairn
BEGIN:STANDARD
TZNAME:-08
diff --git a/zoneinfo/Pacific/Pohnpei.ics b/zoneinfo/Pacific/Pohnpei.ics
index fae96e28..dac85612 100644
--- a/zoneinfo/Pacific/Pohnpei.ics
+++ b/zoneinfo/Pacific/Pohnpei.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pohnpei
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pohnpei
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pohnpei
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Ponape.ics b/zoneinfo/Pacific/Ponape.ics
index fae96e28..dac85612 100644
--- a/zoneinfo/Pacific/Ponape.ics
+++ b/zoneinfo/Pacific/Ponape.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pohnpei
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pohnpei
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pohnpei
BEGIN:STANDARD
TZNAME:+11
diff --git a/zoneinfo/Pacific/Port_Moresby.ics b/zoneinfo/Pacific/Port_Moresby.ics
index f0fc208e..07460e5e 100644
--- a/zoneinfo/Pacific/Port_Moresby.ics
+++ b/zoneinfo/Pacific/Port_Moresby.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Port_Moresby
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Port_Moresby
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Port_Moresby
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Pacific/Rarotonga.ics b/zoneinfo/Pacific/Rarotonga.ics
index fc437657..91a921ce 100644
--- a/zoneinfo/Pacific/Rarotonga.ics
+++ b/zoneinfo/Pacific/Rarotonga.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Rarotonga
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Rarotonga
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Rarotonga
BEGIN:STANDARD
TZNAME:-10
diff --git a/zoneinfo/Pacific/Saipan.ics b/zoneinfo/Pacific/Saipan.ics
index c646e2b7..6ad9f14e 100644
--- a/zoneinfo/Pacific/Saipan.ics
+++ b/zoneinfo/Pacific/Saipan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Guam
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Guam
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Guam
BEGIN:STANDARD
TZNAME:ChST
diff --git a/zoneinfo/Pacific/Samoa.ics b/zoneinfo/Pacific/Samoa.ics
index 0e9f2214..aec83b7a 100644
--- a/zoneinfo/Pacific/Samoa.ics
+++ b/zoneinfo/Pacific/Samoa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pago_Pago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pago_Pago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pago_Pago
BEGIN:STANDARD
TZNAME:SST
diff --git a/zoneinfo/Pacific/Tahiti.ics b/zoneinfo/Pacific/Tahiti.ics
index 5c5f83a0..f572edde 100644
--- a/zoneinfo/Pacific/Tahiti.ics
+++ b/zoneinfo/Pacific/Tahiti.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Tahiti
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Tahiti
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Tahiti
BEGIN:STANDARD
TZNAME:-10
diff --git a/zoneinfo/Pacific/Tarawa.ics b/zoneinfo/Pacific/Tarawa.ics
index 041feb6e..8ede8f2e 100644
--- a/zoneinfo/Pacific/Tarawa.ics
+++ b/zoneinfo/Pacific/Tarawa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Tarawa
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Tarawa
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Tarawa
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Tongatapu.ics b/zoneinfo/Pacific/Tongatapu.ics
index e8540226..203aa8af 100644
--- a/zoneinfo/Pacific/Tongatapu.ics
+++ b/zoneinfo/Pacific/Tongatapu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Tongatapu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Tongatapu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Tongatapu
BEGIN:STANDARD
TZNAME:+13
diff --git a/zoneinfo/Pacific/Truk.ics b/zoneinfo/Pacific/Truk.ics
index 771c4e5a..5a79b476 100644
--- a/zoneinfo/Pacific/Truk.ics
+++ b/zoneinfo/Pacific/Truk.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Chuuk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Chuuk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Chuuk
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Pacific/Wake.ics b/zoneinfo/Pacific/Wake.ics
index fa590a6b..64a846b1 100644
--- a/zoneinfo/Pacific/Wake.ics
+++ b/zoneinfo/Pacific/Wake.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Wake
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Wake
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Wake
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Wallis.ics b/zoneinfo/Pacific/Wallis.ics
index 33421ecf..8b1bbe5d 100644
--- a/zoneinfo/Pacific/Wallis.ics
+++ b/zoneinfo/Pacific/Wallis.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Wallis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Wallis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Wallis
BEGIN:STANDARD
TZNAME:+12
diff --git a/zoneinfo/Pacific/Yap.ics b/zoneinfo/Pacific/Yap.ics
index 771c4e5a..5a79b476 100644
--- a/zoneinfo/Pacific/Yap.ics
+++ b/zoneinfo/Pacific/Yap.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Chuuk
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Chuuk
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Chuuk
BEGIN:STANDARD
TZNAME:+10
diff --git a/zoneinfo/Poland.ics b/zoneinfo/Poland.ics
index 3c65924d..e93dac14 100644
--- a/zoneinfo/Poland.ics
+++ b/zoneinfo/Poland.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Warsaw
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Warsaw
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Warsaw
BEGIN:DAYLIGHT
TZNAME:CEST
diff --git a/zoneinfo/Portugal.ics b/zoneinfo/Portugal.ics
index e60df94c..f3dc7908 100644
--- a/zoneinfo/Portugal.ics
+++ b/zoneinfo/Portugal.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Lisbon
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Lisbon
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Lisbon
BEGIN:STANDARD
TZNAME:WET
diff --git a/zoneinfo/ROC.ics b/zoneinfo/ROC.ics
index 0d976016..d836d436 100644
--- a/zoneinfo/ROC.ics
+++ b/zoneinfo/ROC.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Taipei
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Taipei
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Taipei
BEGIN:STANDARD
TZNAME:CST
diff --git a/zoneinfo/ROK.ics b/zoneinfo/ROK.ics
index 196673f7..746d0209 100644
--- a/zoneinfo/ROK.ics
+++ b/zoneinfo/ROK.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Seoul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Seoul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Seoul
BEGIN:STANDARD
TZNAME:KST
diff --git a/zoneinfo/Singapore.ics b/zoneinfo/Singapore.ics
index 90e65f2a..00e23374 100644
--- a/zoneinfo/Singapore.ics
+++ b/zoneinfo/Singapore.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Asia/Singapore
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Asia/Singapore
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Asia/Singapore
BEGIN:STANDARD
TZNAME:+08
diff --git a/zoneinfo/Turkey.ics b/zoneinfo/Turkey.ics
index 576ca49c..8234cbbb 100644
--- a/zoneinfo/Turkey.ics
+++ b/zoneinfo/Turkey.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Istanbul
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Istanbul
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Istanbul
BEGIN:STANDARD
TZNAME:+03
diff --git a/zoneinfo/UCT.ics b/zoneinfo/UCT.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/UCT.ics
+++ b/zoneinfo/UCT.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/US/Alaska.ics b/zoneinfo/US/Alaska.ics
index 021cbaa8..573012dd 100644
--- a/zoneinfo/US/Alaska.ics
+++ b/zoneinfo/US/Alaska.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Anchorage
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Anchorage
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Anchorage
BEGIN:DAYLIGHT
TZNAME:AKDT
diff --git a/zoneinfo/US/Aleutian.ics b/zoneinfo/US/Aleutian.ics
index b1fa8db9..f6af5b1c 100644
--- a/zoneinfo/US/Aleutian.ics
+++ b/zoneinfo/US/Aleutian.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Adak
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Adak
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Adak
BEGIN:DAYLIGHT
TZNAME:HDT
diff --git a/zoneinfo/US/Arizona.ics b/zoneinfo/US/Arizona.ics
index df6a2521..93db33c3 100644
--- a/zoneinfo/US/Arizona.ics
+++ b/zoneinfo/US/Arizona.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Phoenix
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Phoenix
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Phoenix
BEGIN:STANDARD
TZNAME:MST
diff --git a/zoneinfo/US/Central.ics b/zoneinfo/US/Central.ics
index bc29e43f..0bad1652 100644
--- a/zoneinfo/US/Central.ics
+++ b/zoneinfo/US/Central.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Chicago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Chicago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Chicago
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/US/East-Indiana.ics b/zoneinfo/US/East-Indiana.ics
index 7db2a7f7..15781f51 100644
--- a/zoneinfo/US/East-Indiana.ics
+++ b/zoneinfo/US/East-Indiana.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Indianapolis
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Indianapolis
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Indianapolis
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/US/Eastern.ics b/zoneinfo/US/Eastern.ics
index 29ac5969..3738a5bb 100644
--- a/zoneinfo/US/Eastern.ics
+++ b/zoneinfo/US/Eastern.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/New_York
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/New_York
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/New_York
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/US/Hawaii.ics b/zoneinfo/US/Hawaii.ics
index 7c3f0781..c97c440e 100644
--- a/zoneinfo/US/Hawaii.ics
+++ b/zoneinfo/US/Hawaii.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Honolulu
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Honolulu
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Honolulu
BEGIN:STANDARD
TZNAME:HST
diff --git a/zoneinfo/US/Indiana-Starke.ics b/zoneinfo/US/Indiana-Starke.ics
index 073fb48b..7c457cc5 100644
--- a/zoneinfo/US/Indiana-Starke.ics
+++ b/zoneinfo/US/Indiana-Starke.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Indiana/Knox
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Indiana/Knox
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Indiana/Knox
BEGIN:DAYLIGHT
TZNAME:CDT
diff --git a/zoneinfo/US/Michigan.ics b/zoneinfo/US/Michigan.ics
index e148a23d..c653a38b 100644
--- a/zoneinfo/US/Michigan.ics
+++ b/zoneinfo/US/Michigan.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Detroit
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Detroit
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Detroit
BEGIN:DAYLIGHT
TZNAME:EDT
diff --git a/zoneinfo/US/Mountain.ics b/zoneinfo/US/Mountain.ics
index 79d6ba54..76584cb4 100644
--- a/zoneinfo/US/Mountain.ics
+++ b/zoneinfo/US/Mountain.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Denver
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Denver
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Denver
BEGIN:DAYLIGHT
TZNAME:MDT
diff --git a/zoneinfo/US/Pacific.ics b/zoneinfo/US/Pacific.ics
index d495ce63..02d2810c 100644
--- a/zoneinfo/US/Pacific.ics
+++ b/zoneinfo/US/Pacific.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/America/Los_Angeles
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/America/Los_Angeles
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:America/Los_Angeles
BEGIN:DAYLIGHT
TZNAME:PDT
diff --git a/zoneinfo/US/Samoa.ics b/zoneinfo/US/Samoa.ics
index 0e9f2214..aec83b7a 100644
--- a/zoneinfo/US/Samoa.ics
+++ b/zoneinfo/US/Samoa.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Pacific/Pago_Pago
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Pacific/Pago_Pago
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Pacific/Pago_Pago
BEGIN:STANDARD
TZNAME:SST
diff --git a/zoneinfo/UTC.ics b/zoneinfo/UTC.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/UTC.ics
+++ b/zoneinfo/UTC.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/Universal.ics b/zoneinfo/Universal.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Universal.ics
+++ b/zoneinfo/Universal.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/W-SU.ics b/zoneinfo/W-SU.ics
index 9c539797..5b3a00f4 100644
--- a/zoneinfo/W-SU.ics
+++ b/zoneinfo/W-SU.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Europe/Moscow
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Europe/Moscow
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Europe/Moscow
BEGIN:STANDARD
TZNAME:MSK
diff --git a/zoneinfo/WET.ics b/zoneinfo/WET.ics
index ac65d36a..6232ccb5 100644
--- a/zoneinfo/WET.ics
+++ b/zoneinfo/WET.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/WET
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/WET
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:WET
BEGIN:DAYLIGHT
TZNAME:WEST
diff --git a/zoneinfo/Zulu.ics b/zoneinfo/Zulu.ics
index f4e51c9c..8240c7a1 100644
--- a/zoneinfo/Zulu.ics
+++ b/zoneinfo/Zulu.ics
@@ -2,8 +2,8 @@ BEGIN:VCALENDAR
PRODID:-//citadel.org//NONSGML Citadel calendar//EN
VERSION:2.0
BEGIN:VTIMEZONE
-TZID:/citadel.org/20210410_1/Etc/UTC
-LAST-MODIFIED:20210410T122212Z
+TZID:/citadel.org/20211207_1/Etc/UTC
+LAST-MODIFIED:20211207T194144Z
X-LIC-LOCATION:Etc/UTC
BEGIN:STANDARD
TZNAME:UTC
diff --git a/zoneinfo/zones.tab b/zoneinfo/zones.tab
index b1ac08cf..902c7056 100644
--- a/zoneinfo/zones.tab
+++ b/zoneinfo/zones.tab
@@ -456,6 +456,7 @@ PST8PDT
+0132800 +1444500 Pacific/Guam
+0211825 -1575130 Pacific/Honolulu
+0164500 -1693100 Pacific/Johnston
+-0024700 -1714300 Pacific/Kanton
+0015200 -1572000 Pacific/Kiritimati
+0051900 +1625900 Pacific/Kosrae
+0090500 +1672000 Pacific/Kwajalein
@@ -476,7 +477,7 @@ PST8PDT
+0151200 +1454500 Pacific/Saipan
-0173200 -1493400 Pacific/Tahiti
+0012500 +1730000 Pacific/Tarawa
--0211000 -1751000 Pacific/Tongatapu
+-0210800 -1751200 Pacific/Tongatapu
+0072500 +1514700 Pacific/Truk
+0191700 +1663700 Pacific/Wake
-0131800 -1761000 Pacific/Wallis