author | zautrix <zautrix> | 2004-06-29 11:59:46 (UTC) |
---|---|---|
committer | zautrix <zautrix> | 2004-06-29 11:59:46 (UTC) |
commit | da43dbdc6c82453228f34766fc74585615cba938 (patch) (side-by-side diff) | |
tree | 16576932cea08bf117b2d0320b0d5f66ee8ad093 /libkcal | |
parent | 627489ea2669d3997676bc3cee0f5d0d0c16c4d4 (diff) | |
download | kdepimpi-da43dbdc6c82453228f34766fc74585615cba938.zip kdepimpi-da43dbdc6c82453228f34766fc74585615cba938.tar.gz kdepimpi-da43dbdc6c82453228f34766fc74585615cba938.tar.bz2 |
New lib ical.Some minor changes as well.
-rw-r--r-- | libkcal/calendar.h | 1 | ||||
-rw-r--r-- | libkcal/calendarlocal.cpp | 31 | ||||
-rw-r--r-- | libkcal/calendarlocal.h | 1 | ||||
-rw-r--r-- | libkcal/icalformat.cpp | 8 | ||||
-rw-r--r-- | libkcal/icalformatimpl.cpp | 79 | ||||
-rw-r--r-- | libkcal/icalformatimpl.h | 2 | ||||
-rw-r--r-- | libkcal/vcalformat.cpp | 22 | ||||
-rw-r--r-- | libkcal/versit/port.h | 109 | ||||
-rw-r--r-- | libkcal/versit/vcc.c | 1817 | ||||
-rw-r--r-- | libkcal/versit/vcc.h | 12 | ||||
-rw-r--r-- | libkcal/versit/vobject.c | 363 | ||||
-rw-r--r-- | libkcal/versit/vobject.h | 173 |
12 files changed, 1415 insertions, 1203 deletions
diff --git a/libkcal/calendar.h b/libkcal/calendar.h index 7a85e74..7d23619 100644 --- a/libkcal/calendar.h +++ b/libkcal/calendar.h @@ -154,2 +154,3 @@ public: virtual bool addEventNoDup( Event *event ) = 0; + virtual bool addAnniversaryNoDup( Event *event ) = 0; virtual bool addEvent( Event *anEvent ) = 0; diff --git a/libkcal/calendarlocal.cpp b/libkcal/calendarlocal.cpp index 8ff8b14..3c572f0 100644 --- a/libkcal/calendarlocal.cpp +++ b/libkcal/calendarlocal.cpp @@ -98,2 +98,33 @@ void CalendarLocal::close() } + +bool CalendarLocal::addAnniversaryNoDup( Event *event ) +{ + QString cat; + bool isBirthday = true; + if( event->categoriesStr() == i18n( "Anniversary" ) ) { + isBirthday = false; + cat = i18n( "Anniversary" ); + } else if( event->categoriesStr() == i18n( "Birthday" ) ) { + isBirthday = true; + cat = i18n( "Birthday" ); + } else { + qDebug("addAnniversaryNoDup called without fitting category! "); + return false; + } + Event * eve; + for ( eve = mEventList.first(); eve ; eve = mEventList.next() ) { + if ( !(eve->categories().contains( cat ) )) + continue; + // now we have an event with fitting category + if ( eve->dtStart().date() != event->dtStart().date() ) + continue; + // now we have an event with fitting category+date + if ( eve->summary() != event->summary() ) + continue; + // now we have an event with fitting category+date+summary + return false; + } + return addEvent( event ); + +} bool CalendarLocal::addEventNoDup( Event *event ) diff --git a/libkcal/calendarlocal.h b/libkcal/calendarlocal.h index a17cf11..a2e50e3 100644 --- a/libkcal/calendarlocal.h +++ b/libkcal/calendarlocal.h @@ -71,2 +71,3 @@ class CalendarLocal : public Calendar */ + bool addAnniversaryNoDup( Event *event ); bool addEventNoDup( Event *event ); diff --git a/libkcal/icalformat.cpp b/libkcal/icalformat.cpp index 5893db5..f2e7dfc 100644 --- a/libkcal/icalformat.cpp +++ b/libkcal/icalformat.cpp @@ -419,3 +419,5 @@ ScheduleMessage *ICalFormat::parseScheduleMessage( Calendar *cal, } - + qDebug("icalclassify commented out "); + ScheduleMessage::Status status; +#if 0 @@ -424,3 +426,2 @@ ScheduleMessage *ICalFormat::parseScheduleMessage( Calendar *cal, - ScheduleMessage::Status status; @@ -444,3 +445,4 @@ ScheduleMessage *ICalFormat::parseScheduleMessage( Calendar *cal, } - +#endif + status = ScheduleMessage::RequestUpdate; return new ScheduleMessage(incidence,method,status); diff --git a/libkcal/icalformatimpl.cpp b/libkcal/icalformatimpl.cpp index e5c27a0..32a1337 100644 --- a/libkcal/icalformatimpl.cpp +++ b/libkcal/icalformatimpl.cpp @@ -192,6 +192,6 @@ icalcomponent *ICalFormatImpl::writeEvent(Event *event) case Event::Transparent: - icalcomponent_add_property(vevent, icalproperty_new_transp("TRANSPARENT")); + icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_TRANSPARENT)); break; case Event::Opaque: - icalcomponent_add_property(vevent, icalproperty_new_transp("OPAQUE")); + icalcomponent_add_property(vevent, icalproperty_new_transp(ICAL_TRANSP_OPAQUE)); break; @@ -324,16 +324,17 @@ void ICalFormatImpl::writeIncidence(icalcomponent *parent,Incidence *incidence) // secrecy - const char *classStr; + enum icalproperty_class classInt; switch (incidence->secrecy()) { case Incidence::SecrecyPublic: - classStr = "PUBLIC"; + classInt = ICAL_CLASS_PUBLIC; break; case Incidence::SecrecyConfidential: - classStr = "CONFIDENTIAL"; + classInt = ICAL_CLASS_CONFIDENTIAL; break; case Incidence::SecrecyPrivate: + classInt =ICAL_CLASS_PRIVATE ; default: - classStr = "PRIVATE"; + classInt =ICAL_CLASS_PRIVATE ; break; } - icalcomponent_add_property(parent,icalproperty_new_class(classStr)); + icalcomponent_add_property(parent,icalproperty_new_class(classInt)); @@ -523,3 +524,4 @@ icalproperty *ICalFormatImpl::writeAttachment(Attachment *att) { - icalattachtype* attach = icalattachtype_new(); +#if 0 + icalattachtype* attach = icalattachtype_new(); if (att->isURI()) @@ -528,5 +530,9 @@ icalproperty *ICalFormatImpl::writeAttachment(Attachment *att) icalattachtype_set_base64(attach, att->data(), 0); - +#endif + icalattach *attach; + if (att->isURI()) + attach = icalattach_new_from_url( att->uri().utf8().data()); + else + attach = icalattach_new_from_data ( (unsigned char *)att->data(), 0, 0); icalproperty *p = icalproperty_new_attach(attach); - if (!att->mimeType().isEmpty()) @@ -688,3 +694,3 @@ icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) icalproperty_action action; - icalattachtype *attach = 0; + icalattach *attach = 0; @@ -693,6 +699,4 @@ icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) action = ICAL_ACTION_PROCEDURE; - attach = icalattachtype_new(); - icalattachtype_set_url(attach,QFile::encodeName(alarm->programFile()).data()); + attach = icalattach_new_from_url( QFile::encodeName(alarm->programFile()).data() ); icalcomponent_add_property(a,icalproperty_new_attach(attach)); - icalattachtype_free(attach); if (!alarm->programArguments().isEmpty()) { @@ -704,6 +708,4 @@ icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) if (!alarm->audioFile().isEmpty()) { - attach = icalattachtype_new(); - icalattachtype_set_url(attach,QFile::encodeName( alarm->audioFile() ).data()); + attach = icalattach_new_from_url(QFile::encodeName( alarm->audioFile() ).data()); icalcomponent_add_property(a,icalproperty_new_attach(attach)); - icalattachtype_free(attach); } @@ -725,6 +727,4 @@ icalcomponent *ICalFormatImpl::writeAlarm(Alarm *alarm) for (QStringList::Iterator at = attachments.begin(); at != attachments.end(); ++at) { - attach = icalattachtype_new(); - icalattachtype_set_url(attach,QFile::encodeName( *at ).data()); + attach = icalattach_new_from_url(QFile::encodeName( *at ).data()); icalcomponent_add_property(a,icalproperty_new_attach(attach)); - icalattachtype_free(attach); } @@ -940,6 +940,4 @@ Event *ICalFormatImpl::readEvent(icalcomponent *vevent) - case ICAL_TRANSP_PROPERTY: // Transparency - transparency = QString::fromUtf8(icalproperty_get_transp(p)); - if( transparency == "TRANSPARENT" ) + if(icalproperty_get_transp(p) == ICAL_TRANSP_TRANSPARENT ) event->setTransparency( Event::Transparent ); @@ -1120,3 +1118,3 @@ Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) { - icalattachtype *a = icalproperty_get_attach(attach); + icalattach *a = icalproperty_get_attach(attach); icalparameter_value v = ICAL_VALUE_NONE; @@ -1125,3 +1123,3 @@ Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) Attachment *attachment = 0; - + /* icalparameter *vp = icalproperty_get_first_parameter(attach, ICAL_VALUE_PARAMETER); @@ -1133,10 +1131,8 @@ Attachment *ICalFormatImpl::readAttachment(icalproperty *attach) e = icalparameter_get_encoding(ep); - - if (v == ICAL_VALUE_BINARY && e == ICAL_ENCODING_BASE64) - attachment = new Attachment(icalattachtype_get_base64(a)); - else if ((v == ICAL_VALUE_NONE || v == ICAL_VALUE_URI) && (e == ICAL_ENCODING_NONE || e == ICAL_ENCODING_8BIT)) { - attachment = new Attachment(QString(icalattachtype_get_url(a))); - } else { - kdWarning(5800) << "Unsupported attachment format, discarding it!" << endl; - return 0; + */ + int isurl = icalattach_get_is_url (a); + if (isurl == 0) + attachment = new Attachment((const char*)icalattach_get_data(a)); + else { + attachment = new Attachment(QString(icalattach_get_url(a))); } @@ -1252,7 +1248,7 @@ void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence) - case ICAL_CLASS_PROPERTY: - text = icalproperty_get_class(p); - if (strcmp(text,"PUBLIC") == 0) { + case ICAL_CLASS_PROPERTY: { + int inttext = icalproperty_get_class(p); + if (inttext == ICAL_CLASS_PUBLIC ) { incidence->setSecrecy(Incidence::SecrecyPublic); - } else if (strcmp(text,"CONFIDENTIAL") == 0) { + } else if (inttext == ICAL_CLASS_CONFIDENTIAL ) { incidence->setSecrecy(Incidence::SecrecyConfidential); @@ -1261,2 +1257,3 @@ void ICalFormatImpl::readIncidence(icalcomponent *parent,Incidence *incidence) } + } break; @@ -1355,5 +1352,5 @@ void ICalFormatImpl::readCustomProperties(icalcomponent *parent,CustomProperties while (p) { - QString value = QString::fromUtf8(icalproperty_get_x(p)); - customProperties[icalproperty_get_name(p)] = value; + customProperties[icalproperty_get_x_name(p)] = value; + //qDebug("ICalFormatImpl::readCustomProperties %s %s",value.latin1(), icalproperty_get_x_name(p) ); @@ -1669,4 +1666,4 @@ void ICalFormatImpl::readAlarm(icalcomponent *alarm,Incidence *incidence) case ICAL_ATTACH_PROPERTY: { - icalattachtype *attach = icalproperty_get_attach(p); - QString url = QFile::decodeName(icalattachtype_get_url(attach)); + icalattach *attach = icalproperty_get_attach(p); + QString url = QFile::decodeName(icalattach_get_url(attach)); switch ( action ) { diff --git a/libkcal/icalformatimpl.h b/libkcal/icalformatimpl.h index 2f32365..203c302 100644 --- a/libkcal/icalformatimpl.h +++ b/libkcal/icalformatimpl.h @@ -57,3 +57,3 @@ class ICalFormatImpl { icalproperty *writeRecurrenceRule(Recurrence *); - icalproperty *writeAlarm(Alarm *alarm); + icalcomponent *writeAlarm(Alarm *alarm); diff --git a/libkcal/vcalformat.cpp b/libkcal/vcalformat.cpp index 59030d5..72a781a 100644 --- a/libkcal/vcalformat.cpp +++ b/libkcal/vcalformat.cpp @@ -350,5 +350,5 @@ VObject *VCalFormat::eventToVTodo(const Todo *anEvent) tmpStr.sprintf("%i",anEvent->pilotId()); - addPropValue(vtodo, KPilotIdProp, tmpStr.local8Bit()); + addPropValue(vtodo, XPilotIdProp, tmpStr.local8Bit()); tmpStr.sprintf("%i",anEvent->syncStatus()); - addPropValue(vtodo, KPilotStatusProp, tmpStr.local8Bit()); + addPropValue(vtodo, XPilotStatusProp, tmpStr.local8Bit()); } @@ -528,3 +528,3 @@ VObject* VCalFormat::eventToVEvent(const Event *anEvent) tmpStr2.truncate(tmpStr2.length()-1); - addPropValue(vevent, VCExDateProp, tmpStr2.local8Bit()); + addPropValue(vevent, VCExpDateProp, tmpStr2.local8Bit()); } @@ -643,5 +643,5 @@ VObject* VCalFormat::eventToVEvent(const Event *anEvent) tmpStr.sprintf("%i",anEvent->pilotId()); - addPropValue(vevent, KPilotIdProp, tmpStr.local8Bit()); + addPropValue(vevent, XPilotIdProp, tmpStr.local8Bit()); tmpStr.sprintf("%i",anEvent->syncStatus()); - addPropValue(vevent, KPilotStatusProp, tmpStr.local8Bit()); + addPropValue(vevent, XPilotStatusProp, tmpStr.local8Bit()); } @@ -851,3 +851,3 @@ Todo *VCalFormat::VTodoToEvent(VObject *vtodo) /* PILOT SYNC STUFF */ - if ((vo = isAPropertyOf(vtodo, KPilotIdProp))) { + if ((vo = isAPropertyOf(vtodo, XPilotIdProp))) { anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo)))); @@ -858,3 +858,3 @@ Todo *VCalFormat::VTodoToEvent(VObject *vtodo) - if ((vo = isAPropertyOf(vtodo, KPilotStatusProp))) { + if ((vo = isAPropertyOf(vtodo, XPilotStatusProp))) { anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo)))); @@ -1209,3 +1209,3 @@ Event* VCalFormat::VEventToEvent(VObject *vevent) // recurrence exceptions - if ((vo = isAPropertyOf(vevent, VCExDateProp)) != 0) { + if ((vo = isAPropertyOf(vevent, VCExpDateProp)) != 0) { s = fakeCString(vObjectUStringZValue(vo)); @@ -1373,3 +1373,3 @@ Event* VCalFormat::VEventToEvent(VObject *vevent) /* PILOT SYNC STUFF */ - if ((vo = isAPropertyOf(vevent, KPilotIdProp))) { + if ((vo = isAPropertyOf(vevent, XPilotIdProp))) { anEvent->setPilotId(atoi(s = fakeCString(vObjectUStringZValue(vo)))); @@ -1380,3 +1380,3 @@ Event* VCalFormat::VEventToEvent(VObject *vevent) - if ((vo = isAPropertyOf(vevent, KPilotStatusProp))) { + if ((vo = isAPropertyOf(vevent, XPilotStatusProp))) { anEvent->setSyncStatus(atoi(s = fakeCString(vObjectUStringZValue(vo)))); @@ -1524,3 +1524,3 @@ void VCalFormat::populate(VObject *vcal) - if ((curVOProp = isAPropertyOf(curVO, KPilotStatusProp)) != 0) { + if ((curVOProp = isAPropertyOf(curVO, XPilotStatusProp)) != 0) { char *s; diff --git a/libkcal/versit/port.h b/libkcal/versit/port.h index afc16dd..1768bee 100644 --- a/libkcal/versit/port.h +++ b/libkcal/versit/port.h @@ -1,36 +1,36 @@ /*************************************************************************** -(C) Copyright 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. - -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. +(C) Copyright 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. + +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. @@ -41,2 +41,3 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. + #if defined(__CPLUSPLUS__) || defined(__cplusplus) @@ -44,10 +45,20 @@ extern "C" { #endif - -#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard" -#define vCalendarClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCalendar" - -/* The above strings vCardClipboardFormat and vCalendarClipboardFormat -are globally unique IDs which can be used to generate clipboard format -ID's as per the requirements of a specific platform. For example, in -Windows they are used as the parameter in a call to RegisterClipboardFormat. + +/* some of these #defines are commented out because */ +/* Visual C++ sets them on the compiler command line instead */ + +/* #define _DEBUG */ +/* #define WIN32 */ +/* #define WIN16 */ +/* #define _WINDOWS */ +/* #define __MWERKS__ */ +/* #define INCLUDEMFC */ + +#define vCardClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCard" +#define vCalendarClipboardFormat "+//ISBN 1-887687-00-9::versit::PDI//vCalendar" + +/* The above strings vCardClipboardFormat and vCalendarClipboardFormat +are globally unique IDs which can be used to generate clipboard format +ID's as per the requirements of a specific platform. For example, in +Windows they are used as the parameter in a call to RegisterClipboardFormat. For example: @@ -58,14 +69,16 @@ For example: -#define vCardMimeType "text/x-vCard" -#define vCalendarMimeType "text/x-vCalendar" +#define vCardMimeType "text/x-vCard" +#define vCalendarMimeType "text/x-vCalendar" + +#define DLLEXPORT(t) t #ifndef FALSE -#define FALSE 0 +#define FALSE 0 #endif #ifndef TRUE -#define TRUE 1 +#define TRUE 1 #endif -#define Parse_Debug(t) - +#define stricmp strcasecmp + #if defined(__CPLUSPLUS__) || defined(__cplusplus) diff --git a/libkcal/versit/vcc.c b/libkcal/versit/vcc.c index 350cac3..9be752d 100644 --- a/libkcal/versit/vcc.c +++ b/libkcal/versit/vcc.c @@ -1,4 +1,3 @@ - -/* A Bison parser, made from ./vcc.y - by GNU Bison version 1.28 */ +/* A Bison parser, made from vcc.y + by GNU bison 1.35. */ @@ -6,26 +5,22 @@ -#ifdef _WIN32_ -#define strcasecmp _stricmp -#endif - -#define EQ 257 -#define COLON 258 -#define DOT 259 -#define SEMICOLON 260 -#define SPACE 261 -#define HTAB 262 -#define LINESEP 263 -#define NEWLINE 264 -#define BEGIN_VCARD 265 -#define END_VCARD 266 -#define BEGIN_VCAL 267 -#define END_VCAL 268 -#define BEGIN_VEVENT 269 -#define END_VEVENT 270 -#define BEGIN_VTODO 271 -#define END_VTODO 272 -#define ID 273 -#define STRING 274 - -#line 1 "./vcc.y" +# define EQ 257 +# define COLON 258 +# define DOT 259 +# define SEMICOLON 260 +# define SPACE 261 +# define HTAB 262 +# define LINESEP 263 +# define NEWLINE 264 +# define BEGIN_VCARD 265 +# define END_VCARD 266 +# define BEGIN_VCAL 267 +# define END_VCAL 268 +# define BEGIN_VEVENT 269 +# define END_VEVENT 270 +# define BEGIN_VTODO 271 +# define END_VTODO 272 +# define ID 273 +# define STRING 274 + +#line 1 "vcc.y" @@ -33,36 +28,36 @@ /*************************************************************************** -(C) Copyright 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. - -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. +(C) Copyright 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. + +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. @@ -76,3 +71,3 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. * can be commented out here to make it easier to trace through - * in a debugger. However, if a bug is found it should + * in a debugger. However, if a bug is found it should * be fixed in vcc.y and this file regenerated. @@ -88,2 +83,7 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. +#ifdef WIN32 +#define snprintf _snprintf +#define strcasecmp stricmp +#endif + /**** External Functions ****/ @@ -122,3 +122,2 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. #define yyrule mime_rule -#undef YYPREFIX #define YYPREFIX "mime_" @@ -130,6 +129,12 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. -#include <string.h> -#ifndef __FreeBSD__ -#include <malloc.h> +/* undef below if compile with MFC */ +/* #define INCLUDEMFC 1 */ + +#if defined(WIN32) || defined(_WIN32) +#ifdef INCLUDEMFC +#include <afx.h> #endif +#endif + +#include <string.h> #include <stdio.h> @@ -139,16 +144,7 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. -/* The following is a hack that I hope will get things compiling - * on SunOS 4.1.x systems - */ -#ifndef SEEK_SET -#define SEEK_SET 0 /* Seek from beginning of file. */ -#define SEEK_CUR 1 /* Seek from current position. */ -#define SEEK_END 2 /* Seek from end of file. */ -#endif - /**** Types, Constants ****/ -#define YYDEBUG 0 /* 1 to compile in some debugging code */ +#define YYDEBUG 1 /* 1 to compile in some debugging code */ #define MAXTOKEN 256 /* maximum token (line) length */ -#define YYSTACKSIZE 1000 /* ~unref ? */ +#define YYSTACKSIZE 50 /* ~unref ? */ #define MAXLEVEL 10 /* max # of nested objects parseable */ @@ -171,3 +167,3 @@ extern "C" { - /* static void Parse_Debug(const char *s);*/ + extern void Parse_Debug(const char *s); static void yyerror(char *s); @@ -179,3 +175,3 @@ extern "C" { int yyparse(); -static int yylex(); + enum LexMode { @@ -194,3 +190,2 @@ static int pushVObject(const char *prop); static VObject* popVObject(); -char* lexDataFromBase64(); static void lexPopMode(int top); @@ -200,4 +195,3 @@ static void enterProps(const char *s); static void enterAttr(const char *s1, const char *s2); -/* static void enterValues(const char *value); */ -static void appendValue(const char *value); +static void enterValues(const char *value); static void mime_error_(char *s); @@ -205,3 +199,4 @@ static void mime_error_(char *s); -#line 181 "./vcc.y" +#line 180 "vcc.y" +#ifndef YYSTYPE typedef union { @@ -209,9 +204,8 @@ typedef union { VObject *vobj; - } YYSTYPE; -#include <stdio.h> - -#ifndef __cplusplus -#ifndef __STDC__ -#define const + } yystype; +# define YYSTYPE yystype +# define YYSTYPE_IS_TRIVIAL 1 #endif +#ifndef YYDEBUG +# define YYDEBUG 0 #endif @@ -224,57 +218,61 @@ typedef union { +/* YYTRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */ #define YYTRANSLATE(x) ((unsigned)(x) <= 274 ? yytranslate[x] : 51) -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20 +/* YYTRANSLATE[YYLEX] -- Bison token number corresponding to YYLEX. */ +static const char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 3, 4, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20 }; -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 3, 7, 9, 11, 13, 14, 19, 20, - 24, 27, 29, 30, 36, 38, 39, 43, 45, 48, - 50, 53, 55, 59, 61, 62, 67, 69, 71, 72, - 73, 78, 79, 83, 86, 88, 90, 92, 94, 95, - 100, 101, 105, 106, 111, 112 +#if YYDEBUG +static const short yyprhs[] = +{ + 0, 0, 2, 3, 7, 9, 11, 13, 14, 19, + 20, 24, 27, 29, 30, 36, 38, 39, 43, 45, + 48, 50, 53, 55, 59, 61, 62, 67, 69, 71, + 72, 73, 78, 79, 83, 86, 88, 90, 92, 94, + 95, 100, 101, 105, 106, 111, 112 }; - -static const short yyrhs[] = { 22, - 0, 0, 24, 23, 22, 0, 24, 0, 25, 0, - 40, 0, 0, 11, 26, 28, 12, 0, 0, 11, - 27, 12, 0, 29, 28, 0, 29, 0, 0, 31, - 4, 30, 37, 9, 0, 1, 0, 0, 36, 32, - 33, 0, 36, 0, 34, 33, 0, 34, 0, 6, - 35, 0, 36, 0, 36, 3, 36, 0, 19, 0, - 0, 39, 6, 38, 37, 0, 39, 0, 20, 0, - 0, 0, 13, 41, 43, 14, 0, 0, 13, 42, - 14, 0, 44, 43, 0, 44, 0, 45, 0, 48, - 0, 28, 0, 0, 15, 46, 28, 16, 0, 0, - 15, 47, 16, 0, 0, 17, 49, 28, 18, 0, - 0, 17, 50, 18, 0 +static const short yyrhs[] = +{ + 22, 0, 0, 24, 23, 22, 0, 24, 0, 25, + 0, 40, 0, 0, 11, 26, 28, 12, 0, 0, + 11, 27, 12, 0, 29, 28, 0, 29, 0, 0, + 31, 4, 30, 37, 9, 0, 1, 0, 0, 36, + 32, 33, 0, 36, 0, 34, 33, 0, 34, 0, + 6, 35, 0, 36, 0, 36, 3, 36, 0, 19, + 0, 0, 39, 6, 38, 37, 0, 39, 0, 20, + 0, 0, 0, 13, 41, 43, 14, 0, 0, 13, + 42, 14, 0, 44, 43, 0, 44, 0, 45, 0, + 48, 0, 28, 0, 0, 15, 46, 28, 16, 0, + 0, 15, 47, 16, 0, 0, 17, 49, 28, 18, + 0, 0, 17, 50, 18, 0 }; @@ -283,9 +281,11 @@ static const short yyrhs[] = { 22, -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 209, 212, 215, 215, 219, 220, 223, 229, 234, 240, - 246, 247, 250, 254, 260, 263, 268, 268, 274, 275, - 278, 281, 285, 292, 295, 296, 296, 300, 301, 305, - 309, 311, 314, 317, 318, 321, 323, 324, 327, 334, - 339, 345, 351, 358, 363, 369 +#if YYDEBUG +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const short yyrline[] = +{ + 0, 208, 211, 211, 214, 218, 219, 222, 222, 233, + 233, 245, 246, 249, 249, 259, 262, 262, 267, 273, + 274, 277, 280, 284, 291, 294, 294, 295, 299, 300, + 303, 303, 309, 309, 315, 316, 319, 321, 322, 325, + 325, 337, 337, 349, 349, 361, 361 }; @@ -294,11 +294,14 @@ static const short yyrline[] = { 0, -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) +#if (YYDEBUG) || defined YYERROR_VERBOSE -static const char * const yytname[] = { "$","error","$undefined.","EQ","COLON", -"DOT","SEMICOLON","SPACE","HTAB","LINESEP","NEWLINE","BEGIN_VCARD","END_VCARD", -"BEGIN_VCAL","END_VCAL","BEGIN_VEVENT","END_VEVENT","BEGIN_VTODO","END_VTODO", -"ID","STRING","mime","vobjects","@1","vobject","vcard","@2","@3","items","item", -"@4","prop","@5","attr_params","attr_param","attr","name","values","@6","value", -"vcal","@7","@8","calitems","calitem","eventitem","@9","@10","todoitem","@11", -"@12", NULL +/* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */ +static const char *const yytname[] = +{ + "$", "error", "$undefined.", "EQ", "COLON", "DOT", "SEMICOLON", "SPACE", + "HTAB", "LINESEP", "NEWLINE", "BEGIN_VCARD", "END_VCARD", "BEGIN_VCAL", + "END_VCAL", "BEGIN_VEVENT", "END_VEVENT", "BEGIN_VTODO", "END_VTODO", + "ID", "STRING", "mime", "vobjects", "@1", "vobject", "vcard", "@2", + "@3", "items", "item", "@4", "prop", "@5", "attr_params", "attr_param", + "attr", "name", "values", "@6", "value", "vcal", "@7", "@8", "calitems", + "calitem", "eventitem", "@9", "@10", "todoitem", "@11", "@12", 0 }; @@ -306,48 +309,59 @@ static const char * const yytname[] = { "$","error","$undefined.","EQ","COLON" -static const short yyr1[] = { 0, - 21, 23, 22, 22, 24, 24, 26, 25, 27, 25, - 28, 28, 30, 29, 29, 32, 31, 31, 33, 33, - 34, 35, 35, 36, 38, 37, 37, 39, 39, 41, - 40, 42, 40, 43, 43, 44, 44, 44, 46, 45, - 47, 45, 49, 48, 50, 48 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const short yyr1[] = +{ + 0, 21, 23, 22, 22, 24, 24, 26, 25, 27, + 25, 28, 28, 30, 29, 29, 32, 31, 31, 33, + 33, 34, 35, 35, 36, 38, 37, 37, 39, 39, + 41, 40, 42, 40, 43, 43, 44, 44, 44, 46, + 45, 47, 45, 49, 48, 50, 48 }; -static const short yyr2[] = { 0, - 1, 0, 3, 1, 1, 1, 0, 4, 0, 3, - 2, 1, 0, 5, 1, 0, 3, 1, 2, 1, - 2, 1, 3, 1, 0, 4, 1, 1, 0, 0, - 4, 0, 3, 2, 1, 1, 1, 1, 0, 4, - 0, 3, 0, 4, 0, 3 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const short yyr2[] = +{ + 0, 1, 0, 3, 1, 1, 1, 0, 4, 0, + 3, 2, 1, 0, 5, 1, 0, 3, 1, 2, + 1, 2, 1, 3, 1, 0, 4, 1, 1, 0, + 0, 4, 0, 3, 2, 1, 1, 1, 1, 0, + 4, 0, 3, 0, 4, 0, 3 }; -static const short yydefact[] = { 0, - 7, 30, 1, 2, 5, 6, 0, 0, 0, 0, - 0, 15, 24, 0, 0, 0, 16, 10, 39, 43, - 38, 0, 0, 36, 37, 33, 3, 8, 11, 13, - 0, 0, 0, 0, 0, 31, 34, 29, 0, 17, - 20, 0, 42, 0, 46, 28, 0, 27, 21, 22, - 19, 40, 44, 14, 25, 0, 29, 23, 26, 0, - 0, 0 +/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE + doesn't specify something else to do. Zero means the default is an + error. */ +static const short yydefact[] = +{ + 0, 7, 30, 1, 2, 5, 6, 0, 0, 0, + 0, 0, 15, 24, 0, 0, 0, 16, 10, 39, + 43, 38, 0, 0, 36, 37, 33, 3, 8, 11, + 13, 0, 0, 0, 0, 0, 31, 34, 29, 0, + 17, 20, 0, 42, 0, 46, 28, 0, 27, 21, + 22, 19, 40, 44, 14, 25, 0, 29, 23, 26, + 0, 0, 0 }; -static const short yydefgoto[] = { 60, - 3, 11, 4, 5, 7, 8, 21, 15, 38, 16, - 31, 40, 41, 49, 17, 47, 57, 48, 6, 9, - 10, 22, 23, 24, 32, 33, 25, 34, 35 +static const short yydefgoto[] = +{ + 60, 3, 11, 4, 5, 7, 8, 21, 15, 38, + 16, 31, 40, 41, 49, 17, 47, 57, 48, 6, + 9, 10, 22, 23, 24, 32, 33, 25, 34, 35 }; -static const short yypact[] = { -9, - -6, -5,-32768, 7,-32768,-32768, 2, -1, 19, 15, - -9,-32768,-32768, 1, 0, 26, 27,-32768, 16, 17, --32768, 23, 9,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 33, 2, 24, 2, 25,-32768,-32768, 13, 22,-32768, - 33, 28,-32768, 29,-32768,-32768, 36, 40,-32768, 39, --32768,-32768,-32768,-32768,-32768, 22, 13,-32768,-32768, 48, - 49,-32768 +static const short yypact[] = +{ + -9, -6, -5,-32768, 7,-32768,-32768, 2, -1, 19, + 15, -9,-32768,-32768, 1, 0, 26, 27,-32768, 16, + 17,-32768, 23, 9,-32768,-32768,-32768,-32768,-32768,-32768, + -32768, 33, 2, 24, 2, 25,-32768,-32768, 13, 22, + -32768, 33, 28,-32768, 29,-32768,-32768, 36, 40,-32768, + 39,-32768,-32768,-32768,-32768,-32768, 22, 13,-32768,-32768, + 48, 49,-32768 }; -static const short yypgoto[] = {-32768, - 41,-32768,-32768,-32768,-32768,-32768, -7,-32768,-32768,-32768, --32768, 10,-32768,-32768, -34, -4,-32768,-32768,-32768,-32768, --32768, 31,-32768,-32768,-32768,-32768,-32768,-32768,-32768 +static const short yypgoto[] = +{ + -32768, 41,-32768,-32768,-32768,-32768,-32768, -7,-32768,-32768, + -32768,-32768, 10,-32768,-32768, -34, -4,-32768,-32768,-32768, + -32768,-32768, 31,-32768,-32768,-32768,-32768,-32768,-32768,-32768 }; @@ -358,25 +372,28 @@ static const short yypgoto[] = {-32768, -static const short yytable[] = { 14, - 12, 1, 12, 2, 50, -9, -4, 29, -32, 12, - 18, -12, 28, -12, -12, -12, -12, -12, 13, 12, - 13, 58, -35, 19, 42, 20, 44, 13, 26, 30, - -18, -41, 46, 19, -45, 20, 36, 13, 39, 43, - 13, 56, 45, 52, 54, 55, 53, 61, 62, 0, - 51, 27, 59, 37 +static const short yytable[] = +{ + 14, 12, 1, 12, 2, 50, -9, -4, 29, -32, + 12, 18, -12, 28, -12, -12, -12, -12, -12, 13, + 12, 13, 58, -35, 19, 42, 20, 44, 13, 26, + 30, -18, -41, 46, 19, -45, 20, 36, 13, 39, + 43, 13, 56, 45, 52, 54, 55, 53, 61, 62, + 0, 51, 27, 59, 37 }; -static const short yycheck[] = { 7, - 1, 11, 1, 13, 39, 12, 0, 15, 14, 1, - 12, 12, 12, 14, 15, 16, 17, 18, 19, 1, - 19, 56, 14, 15, 32, 17, 34, 19, 14, 4, - 4, 16, 20, 15, 18, 17, 14, 19, 6, 16, - 19, 3, 18, 16, 9, 6, 18, 0, 0, -1, - 41, 11, 57, 23 +static const short yycheck[] = +{ + 7, 1, 11, 1, 13, 39, 12, 0, 15, 14, + 1, 12, 12, 12, 14, 15, 16, 17, 18, 19, + 1, 19, 56, 14, 15, 32, 17, 34, 19, 14, + 4, 4, 16, 20, 15, 18, 17, 14, 19, 6, + 16, 19, 3, 18, 16, 9, 6, 18, 0, 0, + -1, 41, 11, 57, 23 }; /* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ +#line 3 "/usr/share/bison/bison.simple" /* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software + Foundation, Inc. @@ -402,58 +419,127 @@ static const short yycheck[] = { 7, -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ +/* This is the parser code that is written into each bison parser when + the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +#if ! defined (yyoverflow) || defined (YYERROR_VERBOSE) + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || defined (YYERROR_VERBOSE) */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; +# if YYLSP_NEEDED + YYLTYPE yyls; +# endif +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# if YYLSP_NEEDED +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAX) +# else +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAX) +# endif + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include <alloca.h> -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include <malloc.h> #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include <malloc.h> */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ + + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ @@ -466,5 +552,4 @@ static const short yycheck[] = { 7, #define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ @@ -472,6 +557,8 @@ static const short yycheck[] = { 7, #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ + { \ + yychar = (Token); \ + yylval = (Value); \ yychar1 = YYTRANSLATE (yychar); \ @@ -481,3 +568,6 @@ do \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up"); \ + YYERROR; \ + } \ while (0) @@ -487,55 +577,72 @@ while (0) -#ifndef YYPURE -#define YYLEX yylex() -#endif -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) -#endif -#else /* not YYLSP_NEEDED */ -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). -/* If nonreentrant, generate the variables here */ + When YYLLOC_DEFAULT is run, CURRENT is set the location of the + first token. By default, to implement support for ranges, extend + its range to the last symbol. */ -#ifndef YYPURE - -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ - -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; #endif -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ - -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ -#endif - -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +/* YYLEX -- calling `yylex' with the right arguments. */ + +#if YYPURE +# if YYLSP_NEEDED +# ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) +# else +# define YYLEX yylex (&yylval, &yylloc) +# endif +# else /* !YYLSP_NEEDED */ +# ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, YYLEX_PARAM) +# else +# define YYLEX yylex (&yylval) +# endif +# endif /* !YYLSP_NEEDED */ +#else /* !YYPURE */ +# define YYLEX yylex () +#endif /* !YYPURE */ + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ #if YYMAXDEPTH == 0 -#undef YYMAXDEPTH +# undef YYMAXDEPTH #endif @@ -543,50 +650,59 @@ int yydebug; /* nonzero means print parse trace */ #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus - -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; +#ifdef YYERROR_VERBOSE - while (i-- > 0) - *t++ = *f++; -} +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; -#else /* __cplusplus */ + while (*yys++ != '\0') + continue; -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (char *to, char *from, unsigned int count) + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif { - register char *t = to; - register char *f = from; - register int i = count; + register char *yyd = yydest; + register const char *yys = yysrc; - while (i-- > 0) - *t++ = *f++; -} + while ((*yyd++ = *yys++) != '\0') + continue; -#endif + return yyd - 1; +} +# endif +# endif #endif -#line 217 "/usr/share/bison.simple" +#line 315 "/usr/share/bison/bison.simple" + @@ -599,72 +715,117 @@ __yy_memcpy (char *to, char *from, unsigned int count) #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +# define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +# define YYPARSE_PARAM_DECL +# else +# define YYPARSE_PARAM_ARG YYPARSE_PARAM +# define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +# endif +#else /* !YYPARSE_PARAM */ +# define YYPARSE_PARAM_ARG +# define YYPARSE_PARAM_DECL +#endif /* !YYPARSE_PARAM */ /* Prevent warning if -Wstrict-prototypes. */ -#if defined (__GNUC__) && ! defined (__cplusplus) -#ifdef YYPARSE_PARAM +#ifdef __GNUC__ +# ifdef YYPARSE_PARAM int yyparse (void *); -#else +# else int yyparse (void); +# endif #endif + +/* YY_DECL_VARIABLES -- depending whether we use a pure parser, + variables are global, or local to YYPARSE. */ + +#define YY_DECL_NON_LSP_VARIABLES \ +/* The lookahead symbol. */ \ +int yychar; \ + \ +/* The semantic value of the lookahead symbol. */ \ +YYSTYPE yylval; \ + \ +/* Number of parse errors so far. */ \ +int yynerrs; + +#if YYLSP_NEEDED +# define YY_DECL_VARIABLES \ +YY_DECL_NON_LSP_VARIABLES \ + \ +/* Location data for the lookahead symbol. */ \ +YYLTYPE yylloc; +#else +# define YY_DECL_VARIABLES \ +YY_DECL_NON_LSP_VARIABLES #endif + +/* If nonreentrant, generate the variables here. */ + +#if !YYPURE +YY_DECL_VARIABLES +#endif /* !YYPURE */ + int -yyparse(YYPARSE_PARAM_ARG) +yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { + /* If reentrant, generate the variables here. */ +#if YYPURE + YY_DECL_VARIABLES +#endif /* !YYPURE */ + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yychar1 = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ - - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ +#if YYLSP_NEEDED + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; YYLTYPE *yyls = yylsa; YYLTYPE *yylsp; +#endif -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) +#if YYLSP_NEEDED +# define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) #else -#define YYPOPSTACK (yyvsp--, yyssp--) +# define YYPOPSTACK (yyvsp--, yyssp--) #endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; +#if YYLSP_NEEDED + YYLTYPE yyloc; +#endif + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); @@ -680,14 +841,20 @@ yyparse(YYPARSE_PARAM_ARG) - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED +#if YYLSP_NEEDED yylsp = yyls; #endif + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; + yysetstate: + *yyssp = yystate; @@ -695,50 +862,41 @@ yynewstate: { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif - /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif - - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. */ +# if YYLSP_NEEDED + YYLTYPE *yyls1 = yyls; + /* This used to be a conditional around just the two extra args, + but that might be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); + yyls = yyls1; +# else + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); +# endif + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + goto yyoverflowlab; yystacksize *= 2; @@ -746,28 +904,29 @@ yynewstate: yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); +# if YYLSP_NEEDED + YYSTACK_RELOCATE (yyls); +# endif +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; +#if YYLSP_NEEDED + yylsp = yyls + yysize - 1; #endif -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); @@ -777,9 +936,11 @@ yynewstate: -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: @@ -802,6 +963,3 @@ yynewstate: { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; @@ -816,6 +974,3 @@ yynewstate: -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + YYDPRINTF ((stderr, "Now at end of input.\n")); } @@ -823,14 +978,17 @@ yynewstate: { - yychar1 = YYTRANSLATE(yychar); + yychar1 = YYTRANSLATE (yychar); -#if YYDEBUG != 0 +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables + which are defined only if `YYDEBUG' is set. */ if (yydebug) { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT + YYFPRINTF (stderr, "Next token is %d (%s", + yychar, yytname[yychar1]); + /* Give the individual parser a way to print the precise + meaning of a token, for further debugging info. */ +# ifdef YYPRINT YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); +# endif + YYFPRINTF (stderr, ")\n"); } @@ -866,7 +1024,4 @@ yynewstate: /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %d (%s), ", + yychar, yytname[yychar1])); @@ -877,3 +1032,3 @@ yynewstate: *++yyvsp = yylval; -#ifdef YYLSP_NEEDED +#if YYLSP_NEEDED *++yylsp = yylloc; @@ -881,4 +1036,6 @@ yynewstate: - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; @@ -887,5 +1044,7 @@ yynewstate: -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; @@ -893,21 +1052,43 @@ yydefault: goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ -#if YYDEBUG != 0 + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to the semantic value of + the lookahead token. This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + +#if YYLSP_NEEDED + /* Similarly for the default location. Let the user run additional + commands if for instance locations are ranges. */ + yyloc = yylsp[1-yylen]; + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); +#endif + +#if YYDEBUG + /* We have to keep this `#if YYDEBUG', since we use variables which + are defined only if `YYDEBUG' is set. */ if (yydebug) { - int i; + int yyi; - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); + YYFPRINTF (stderr, "Reducing via rule %d (line %d), ", + yyn, yyrline[yyn]); /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); + for (yyi = yyprhs[yyn]; yyrhs[yyi] > 0; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]); } @@ -915,3 +1096,2 @@ yyreduce: - switch (yyn) { @@ -919,11 +1099,11 @@ yyreduce: case 2: -#line 213 "./vcc.y" -{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; ; - break;} +#line 212 "vcc.y" +{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; } + break; case 4: -#line 216 "./vcc.y" -{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; ; - break;} +#line 215 "vcc.y" +{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; } + break; case 7: -#line 225 "./vcc.y" +#line 224 "vcc.y" { @@ -931,6 +1111,6 @@ case 7: if (!pushVObject(VCCardProp)) YYERROR; - ; - break;} + } + break; case 8: -#line 230 "./vcc.y" +#line 229 "vcc.y" { @@ -938,6 +1118,6 @@ case 8: yyval.vobj = popVObject(); - ; - break;} + } + break; case 9: -#line 235 "./vcc.y" +#line 234 "vcc.y" { @@ -945,6 +1125,6 @@ case 9: if (!pushVObject(VCCardProp)) YYERROR; - ; - break;} + } + break; case 10: -#line 240 "./vcc.y" +#line 239 "vcc.y" { @@ -952,12 +1132,12 @@ case 10: yyval.vobj = popVObject(); - ; - break;} + } + break; case 13: -#line 251 "./vcc.y" +#line 250 "vcc.y" { lexPushMode(L_VALUES); - ; - break;} + } + break; case 14: -#line 255 "./vcc.y" +#line 254 "vcc.y" { @@ -966,24 +1146,24 @@ case 14: lexPopMode(0); - ; - break;} + } + break; case 16: -#line 264 "./vcc.y" +#line 263 "vcc.y" { enterProps(yyvsp[0].str); - ; - break;} + } + break; case 18: -#line 269 "./vcc.y" +#line 268 "vcc.y" { enterProps(yyvsp[0].str); - ; - break;} + } + break; case 22: -#line 282 "./vcc.y" +#line 281 "vcc.y" { enterAttr(yyvsp[0].str,0); - ; - break;} + } + break; case 23: -#line 286 "./vcc.y" +#line 285 "vcc.y" { @@ -991,34 +1171,34 @@ case 23: - ; - break;} + } + break; case 25: -#line 295 "./vcc.y" -{ appendValue(yyvsp[-1].str); ; - break;} +#line 294 "vcc.y" +{ enterValues(yyvsp[-1].str); } + break; case 27: -#line 297 "./vcc.y" -{ appendValue(yyvsp[0].str); ; - break;} +#line 296 "vcc.y" +{ enterValues(yyvsp[0].str); } + break; case 29: -#line 302 "./vcc.y" -{ yyval.str = 0; ; - break;} +#line 300 "vcc.y" +{ yyval.str = 0; } + break; case 30: -#line 307 "./vcc.y" -{ if (!pushVObject(VCCalProp)) YYERROR; ; - break;} +#line 305 "vcc.y" +{ if (!pushVObject(VCCalProp)) YYERROR; } + break; case 31: -#line 310 "./vcc.y" -{ yyval.vobj = popVObject(); ; - break;} +#line 308 "vcc.y" +{ yyval.vobj = popVObject(); } + break; case 32: -#line 312 "./vcc.y" -{ if (!pushVObject(VCCalProp)) YYERROR; ; - break;} +#line 310 "vcc.y" +{ if (!pushVObject(VCCalProp)) YYERROR; } + break; case 33: -#line 314 "./vcc.y" -{ yyval.vobj = popVObject(); ; - break;} +#line 312 "vcc.y" +{ yyval.vobj = popVObject(); } + break; case 39: -#line 329 "./vcc.y" +#line 327 "vcc.y" { @@ -1026,6 +1206,6 @@ case 39: if (!pushVObject(VCEventProp)) YYERROR; - ; - break;} + } + break; case 40: -#line 335 "./vcc.y" +#line 333 "vcc.y" { @@ -1033,6 +1213,6 @@ case 40: popVObject(); - ; - break;} + } + break; case 41: -#line 340 "./vcc.y" +#line 338 "vcc.y" { @@ -1040,6 +1220,6 @@ case 41: if (!pushVObject(VCEventProp)) YYERROR; - ; - break;} + } + break; case 42: -#line 345 "./vcc.y" +#line 343 "vcc.y" { @@ -1047,6 +1227,6 @@ case 42: popVObject(); - ; - break;} + } + break; case 43: -#line 353 "./vcc.y" +#line 351 "vcc.y" { @@ -1054,6 +1234,6 @@ case 43: if (!pushVObject(VCTodoProp)) YYERROR; - ; - break;} + } + break; case 44: -#line 359 "./vcc.y" +#line 357 "vcc.y" { @@ -1061,6 +1241,6 @@ case 44: popVObject(); - ; - break;} + } + break; case 45: -#line 364 "./vcc.y" +#line 362 "vcc.y" { @@ -1068,6 +1248,6 @@ case 45: if (!pushVObject(VCTodoProp)) YYERROR; - ; - break;} + } + break; case 46: -#line 369 "./vcc.y" +#line 367 "vcc.y" { @@ -1075,11 +1255,12 @@ case 46: popVObject(); - ; - break;} + } + break; } - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" +#line 705 "/usr/share/bison/bison.simple" + + yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED +#if YYLSP_NEEDED yylsp -= yylen; @@ -1087,10 +1268,10 @@ case 46: -#if YYDEBUG != 0 +#if YYDEBUG if (yydebug) { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); } @@ -1099,24 +1280,9 @@ case 46: *++yyvsp = yyval; - -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } +#if YYLSP_NEEDED + *++yylsp = yyloc; #endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ @@ -1132,6 +1298,9 @@ case 46: -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { @@ -1144,47 +1313,56 @@ yyerrlab: /* here on detecting error */ { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("parse error, unexpected ") + 1; + yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "parse error, unexpected "); + yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("parse error; also virtual memory exhausted"); } else -#endif /* YYERROR_VERBOSE */ - yyerror("parse error"); +#endif /* defined (YYERROR_VERBOSE) */ + yyerror ("parse error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + +/*--------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action | +`--------------------------------------------------*/ +yyerrlab1: if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ @@ -1193,8 +1371,4 @@ yyerrlab1: /* here on error raised explicitly by an action */ YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif - + YYDPRINTF ((stderr, "Discarding token %d (%s).\n", + yychar, yytname[yychar1])); yychar = YYEMPTY; @@ -1202,4 +1376,4 @@ yyerrlab1: /* here on error raised explicitly by an action */ - /* Else will try to reuse lookahead token - after shifting the error token. */ + /* Else will try to reuse lookahead token after shifting the error + token. */ @@ -1209,4 +1383,8 @@ yyerrlab1: /* here on error raised explicitly by an action */ -yyerrdefault: /* current state does not do anything special for the error token. */ +/*-------------------------------------------------------------------. +| yyerrdefault -- current state does not do anything special for the | +| error token. | +`-------------------------------------------------------------------*/ +yyerrdefault: #if 0 @@ -1214,12 +1392,20 @@ yyerrdefault: /* current state does not do anything special for the error token should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; + + /* If its default is to accept any token, ok. Otherwise pop it. */ + yyn = yydefact[yystate]; + if (yyn) + goto yydefault; #endif -yyerrpop: /* pop the current state because it cannot handle the error token */ - if (yyssp == yyss) YYABORT; +/*---------------------------------------------------------------. +| yyerrpop -- pop the current state because it cannot handle the | +| error token | +`---------------------------------------------------------------*/ +yyerrpop: + if (yyssp == yyss) + YYABORT; yyvsp--; yystate = *--yyssp; -#ifdef YYLSP_NEEDED +#if YYLSP_NEEDED yylsp--; @@ -1227,10 +1413,10 @@ yyerrpop: /* pop the current state because it cannot handle the error token */ -#if YYDEBUG != 0 +#if YYDEBUG if (yydebug) { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); + short *yyssp1 = yyss - 1; + YYFPRINTF (stderr, "Error: state stack now"); + while (yyssp1 != yyssp) + YYFPRINTF (stderr, " %d", *++yyssp1); + YYFPRINTF (stderr, "\n"); } @@ -1238,4 +1424,6 @@ yyerrpop: /* pop the current state because it cannot handle the error token */ +/*--------------. +| yyerrhandle. | +`--------------*/ yyerrhandle: - yyn = yypact[yystate]; @@ -1262,9 +1450,6 @@ yyerrhandle: -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED +#if YYLSP_NEEDED *++yylsp = yylloc; @@ -1275,29 +1460,34 @@ yyerrhandle: - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +/*---------------------------------------------. +| yyoverflowab -- parser overflow comes here. | +`---------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 375 "./vcc.y" +#line 373 "vcc.y" -/****************************************************************************/ static int pushVObject(const char *prop) @@ -1321,3 +1511,2 @@ static int pushVObject(const char *prop) -/****************************************************************************/ /* This pops the recently built vCard off the stack and returns it. */ @@ -1337,55 +1526,40 @@ static VObject* popVObject() -/* static void enterValues(const char *value) */ -/* { */ -/* if (fieldedProp && *fieldedProp) { */ -/* if (value) { */ -/* addPropValue(curProp,*fieldedProp,value); */ -/* } */ - /* else this field is empty, advance to next field */ -/* fieldedProp++; */ -/* } */ -/* else { */ -/* if (value) { */ -/* setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); */ -/* } */ -/* } */ -/* deleteStr(value); */ -/* } */ - -static void appendValue(const char *value) -{ - char *p1, *p2; - wchar_t *p3; - int i; - - if (fieldedProp && *fieldedProp) { - if (value) { - addPropValue(curProp, *fieldedProp, value); +static void enterValues(const char *value) + { + if (fieldedProp && *fieldedProp) { + if (value) { + addPropValue(curProp,*fieldedProp,value); + } + /* else this field is empty, advance to next field */ + fieldedProp++; + } + else { + if (value) { + char *p1, *p2; + wchar_t *p3; + int i; + + /* If the property already has a string value, we append this one, + using ';' to separate the values. */ + if (vObjectUStringZValue(curProp)) { + p1 = fakeCString(vObjectUStringZValue(curProp)); + p2 = malloc((strlen(p1)+strlen(value)+1)); + strcpy(p2, p1); + deleteStr(p1); + + i = strlen(p2); + p2[i] = ';'; + p2[i+1] = '\0'; + p2 = strcat(p2, value); + p3 = (wchar_t *) vObjectUStringZValue(curProp); + free(p3); + setVObjectUStringZValue_(curProp,fakeUnicode(p2,0)); + deleteStr(p2); + } else { + setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); + } + } } - /* else this field is empty, advance to next field */ - fieldedProp++; - } else { - if (value) { - if (vObjectUStringZValue(curProp)) { - p1 = fakeCString(vObjectUStringZValue(curProp)); - p2 = malloc(sizeof(char *) * (strlen(p1)+strlen(value)+1)); - strcpy(p2, p1); - deleteStr(p1); - - i = strlen(p2); - p2[i] = ','; - p2[i+1] = '\0'; - p2 = strcat(p2, value); - p3 = (wchar_t *) vObjectUStringZValue(curProp); - free(p3); - setVObjectUStringZValue_(curProp,fakeUnicode(p2,0)); - deleteStr(p2); - } else { - setVObjectUStringZValue_(curProp,fakeUnicode(value,0)); - } + deleteStr(value); } - } - deleteStr(value); -} - @@ -1399,3 +1573,3 @@ static void enterAttr(const char *s1, const char *s2) { - const char *p1=0L, *p2=0L; + const char *p1, *p2; p1 = lookupProp_(s1); @@ -1409,6 +1583,6 @@ static void enterAttr(const char *s1, const char *s2) addProp(curProp,p1); - if (strcasecmp(p1,VCBase64Prop) == 0 || (s2 && strcasecmp(p2,VCBase64Prop)==0)) + if (stricmp(p1,VCBase64Prop) == 0 || (s2 && stricmp(p2,VCBase64Prop)==0)) lexPushMode(L_BASE64); - else if (strcasecmp(p1,VCQuotedPrintableProp) == 0 - || (s2 && strcasecmp(p2,VCQuotedPrintableProp)==0)) + else if (stricmp(p1,VCQuotedPrintableProp) == 0 + || (s2 && stricmp(p2,VCQuotedPrintableProp)==0)) lexPushMode(L_QUOTED_PRINTABLE); @@ -1425,3 +1599,7 @@ struct LexBuf { /* input */ +#ifdef INCLUDEMFC + CFile *inputFile; +#else FILE *inputFile; +#endif char *inputString; @@ -1471,3 +1649,3 @@ static int lexWithinMode(enum LexMode mode) { -static int lexGetc_() +static char lexGetc_() { @@ -1479,6 +1657,8 @@ static int lexGetc_() else { - if (!feof(lexBuf.inputFile)) - return fgetc(lexBuf.inputFile); - else - return EOF; +#ifdef INCLUDEMFC + char result; + return lexBuf.inputFile->Read(&result, 1) == 1 ? result : EOF; +#else + return fgetc(lexBuf.inputFile); +#endif } @@ -1521,7 +1701,5 @@ static int lexLookahead() { else if (c == '\n') { - int a; - if (lexBuf.len > 1) - a = lexBuf.buf[lexBuf.getPtr]; - else - a = lexGeta_(1); + int a = (lexBuf.len>1)? + lexBuf.buf[lexBuf.getPtr+1]: + lexGeta_(1); if (a == '\r') { @@ -1558,4 +1736,2 @@ static void lexAppendc(int c) { - /* not sure if I am doing this right to fix purify report -- PGB */ - lexBuf.strs = (char *) realloc(lexBuf.strs, (size_t) lexBuf.strsLen + 1); lexBuf.strs[lexBuf.strsLen] = c; @@ -1588,6 +1764,3 @@ static char* lexGetWord() { c = lexLookahead(); - /* some "words" have a space in them, like "NEEDS ACTION". - this may be an oversight of the spec, but it is true nevertheless. - while (c != EOF && !strchr("\t\n ;:=",c)) { */ - while (c != EOF && !strchr("\n;:=",c)) { + while (c != EOF && !strchr("\t\n ;:=",c)) { lexAppendc(c); @@ -1600,18 +1773,2 @@ static char* lexGetWord() { -void lexPushLookahead(char *s, int len) { - int putptr; - if (len == 0) len = strlen(s); - putptr = (int)lexBuf.getPtr - len; - /* this function assumes that length of word to push back - / is not greater than MAX_LEX_LOOKAHEAD. - */ - if (putptr < 0) putptr += MAX_LEX_LOOKAHEAD; - lexBuf.getPtr = putptr; - while (*s) { - lexBuf.buf[putptr] = *s++; - putptr = (putptr + 1) % MAX_LEX_LOOKAHEAD; - } - lexBuf.len += len; - } - static void lexPushLookaheadc(int c) { @@ -1724,13 +1881,2 @@ static char* lexGet1Value() { -char* lexGetStrUntil(char *termset) { - int c = lexLookahead(); - lexClearToken(); - while (c != EOF && !strchr(termset,c)) { - lexAppendc(c); - lexSkipLookahead(); - c = lexLookahead(); - } - lexAppendc(0); - return c==EOF?0:lexStr(); - } @@ -1740,6 +1886,6 @@ static int match_begin_name(int end) { if (n) { - if (!strcasecmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD; - else if (!strcasecmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL; - else if (!strcasecmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT; - else if (!strcasecmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO; + if (!stricmp(n,"vcard")) token = end?END_VCARD:BEGIN_VCARD; + else if (!stricmp(n,"vcalendar")) token = end?END_VCAL:BEGIN_VCAL; + else if (!stricmp(n,"vevent")) token = end?END_VEVENT:BEGIN_VEVENT; + else if (!stricmp(n,"vtodo")) token = end?END_VTODO:BEGIN_VTODO; deleteStr(n); @@ -1751,3 +1897,7 @@ static int match_begin_name(int end) { +#ifdef INCLUDEMFC +void initLex(const char *inputstring, unsigned long inputlen, CFile *inputfile) +#else void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile) +#endif { @@ -1776,3 +1926,2 @@ static void finiLex() { -/****************************************************************************/ /* This parses and converts the base64 format for binary encoding into @@ -1959,3 +2108,3 @@ EndString: -static int yylex() { +int yylex() { @@ -1967,3 +2116,5 @@ static int yylex() { lexPushLookaheadc(c); +#ifdef _SUPPORT_LINE_FOLDING handleMoreRFC822LineBreak(c); +#endif lexSkipLookahead(); @@ -2010,3 +2161,2 @@ static int yylex() { } - else { @@ -2019,3 +2169,3 @@ static int yylex() { /* ignoring linesep immediately after colon. */ - c = lexLookahead(); +/* c = lexLookahead(); while (strchr("\n",c)) { @@ -2024,3 +2174,3 @@ static int yylex() { ++mime_lineNum; - } + }*/ DBG_(("db: COLON\n")); @@ -2034,5 +2184,5 @@ static int yylex() { return EQ; - /* ignore tabs/newlines in this mode. We can't ignore - * spaces, because values like NEEDS ACTION have a space. */ - case '\t': continue; + /* ignore whitespace in this mode */ + case '\t': + case ' ': continue; case '\n': { @@ -2043,14 +2193,11 @@ static int yylex() { break; - default: { - lexPushLookaheadc(c); - /* pending lutz : why linker error with isalpha(c)? */ - /*if ( isalpha(c) || c == ' ') { */ - if ( ( c >= 'A' && c <= 'Z') || ( c >= 'a' && c <= 'z') || c == ' ') { - + default: { + lexPushLookaheadc(c); + if (isalpha(c)) { char *t = lexGetWord(); yylval.str = t; - if (!strcasecmp(t, "begin")) { + if (!stricmp(t, "begin")) { return match_begin_end_name(0); } - else if (!strcasecmp(t,"end")) { + else if (!stricmp(t,"end")) { return match_begin_end_name(1); @@ -2063,5 +2210,5 @@ static int yylex() { else { - /* unknown token */ + /* unknow token */ return 0; - } + } break; @@ -2071,3 +2218,2 @@ static int yylex() { } - return 0; @@ -2077,3 +2223,3 @@ static int yylex() { /***************************************************************************/ -/*** Public Functions ****/ +/*** Public Functions ****/ /***************************************************************************/ @@ -2095,4 +2241,3 @@ static VObject* Parse_MIMEHelper() -/****************************************************************************/ -VObject* Parse_MIME(const char *input, unsigned long len) +DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len) { @@ -2103,5 +2248,21 @@ VObject* Parse_MIME(const char *input, unsigned long len) +#if INCLUDEMFC + +DLLEXPORT(VObject*) Parse_MIME_FromFile(CFile *file) + { + unsigned long startPos; + VObject *result; + + initLex(0,-1,file); + startPos = file->GetPosition(); + if (!(result = Parse_MIMEHelper())) + file->Seek(startPos, CFile::begin); + return result; + } + +#else + VObject* Parse_MIME_FromFile(FILE *file) { - VObject *result; + VObject *result; long startPos; @@ -2116,3 +2277,3 @@ VObject* Parse_MIME_FromFile(FILE *file) -VObject* Parse_MIME_FromFileName(const char *fname) +DLLEXPORT(VObject*) Parse_MIME_FromFileName(char *fname) { @@ -2125,4 +2286,4 @@ VObject* Parse_MIME_FromFileName(const char *fname) else { - char msg[255]; - sprintf(msg, "can't open file '%s' for reading\n", fname); + char msg[256]; + snprintf(msg, sizeof(msg), "can't open file '%s' for reading\n", fname); mime_error_(msg); @@ -2132,7 +2293,3 @@ VObject* Parse_MIME_FromFileName(const char *fname) -/****************************************************************************/ -void YYDebug(const char *s) -{ - Parse_Debug(s); -} +#endif @@ -2141,3 +2298,3 @@ static MimeErrorHandler mimeErrorHandler; -void registerMimeErrorHandler(MimeErrorHandler me) +DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler me) { diff --git a/libkcal/versit/vcc.h b/libkcal/versit/vcc.h index 03886d1..0e52034 100644 --- a/libkcal/versit/vcc.h +++ b/libkcal/versit/vcc.h @@ -50,6 +50,6 @@ typedef void (*MimeErrorHandler)(char *); -extern void registerMimeErrorHandler(MimeErrorHandler); +extern DLLEXPORT(void) registerMimeErrorHandler(MimeErrorHandler); -extern VObject* Parse_MIME(const char *input, unsigned long len); -extern VObject* Parse_MIME_FromFileName(const char* fname); +extern DLLEXPORT(VObject*) Parse_MIME(const char *input, unsigned long len); +extern DLLEXPORT(VObject*) Parse_MIME_FromFileName(char* fname); @@ -57,3 +57,3 @@ extern VObject* Parse_MIME_FromFileName(const char* fname); /* NOTE regarding Parse_MIME_FromFile -The function below, Parse_MIME_FromFile, come in two flavors, +The function above, Parse_MIME_FromFile, comes in two flavors, neither of which is exported from the DLL. Each version takes @@ -68,3 +68,7 @@ will get a link error. +#if INCLUDEMFC +extern VObject* Parse_MIME_FromFile(CFile *file); +#else extern VObject* Parse_MIME_FromFile(FILE *file); +#endif diff --git a/libkcal/versit/vobject.c b/libkcal/versit/vobject.c index 637efb2..3fac63e 100644 --- a/libkcal/versit/vobject.c +++ b/libkcal/versit/vobject.c @@ -44,14 +44,15 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. -#include <stdlib.h> +#ifdef WIN32 +#define snprintf _snprintf +#define strcasecmp stricmp +#endif #include "vobject.h" +#include <stdlib.h> #include <string.h> #include <stdio.h> -#ifdef _WIN32_ +#include <fcntl.h> - #define strcasecmp _stricmp -#endif - -#define NAME_OF(o) o->id +#define NAME_OF(o) o->id #define VALUE_TYPE(o) o->valType @@ -64,2 +65,27 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. +typedef union ValueItem { + const char *strs; + const wchar_t *ustrs; + unsigned int i; + unsigned long l; + void *any; + VObject *vobj; + } ValueItem; + +struct VObject { + VObject *next; + const char *id; + VObject *prop; + unsigned short valType; + ValueItem val; + }; + +typedef struct StrItem StrItem; + +struct StrItem { + StrItem *next; + const char *s; + unsigned int refCnt; + }; + const char** fieldedProp; @@ -78,3 +104,3 @@ const char** fieldedProp; -VObject* newVObject_(const char *id) +DLLEXPORT(VObject*) newVObject_(const char *id) { @@ -89,3 +115,3 @@ VObject* newVObject_(const char *id) -VObject* newVObject(const char *id) +DLLEXPORT(VObject*) newVObject(const char *id) { @@ -94,12 +120,9 @@ VObject* newVObject(const char *id) -void deleteVObject(VObject *p) +DLLEXPORT(void) deleteVObject(VObject *p) { - if (p->id) unUseStr(p->id); - if (p) free(p); - p = NULL; } -char* dupStr(const char *s, unsigned int size) +DLLEXPORT(char*) dupStr(const char *s, unsigned int size) { @@ -120,7 +143,5 @@ char* dupStr(const char *s, unsigned int size) -void deleteStr(const char *p) +DLLEXPORT(void) deleteStr(const char *p) { - if (p) - free((void*)p); - p = NULL; + if (p) free((void*)p); } @@ -139,5 +160,3 @@ static void deleteStrItem(StrItem *p) { - if (p) - free((void*)p); - p = NULL; + free((void*)p); } @@ -149,3 +168,3 @@ static void deleteStrItem(StrItem *p) -const char* vObjectName(VObject *o) +DLLEXPORT(const char*) vObjectName(VObject *o) { @@ -154,3 +173,3 @@ const char* vObjectName(VObject *o) -void setVObjectName(VObject *o, const char* id) +DLLEXPORT(void) setVObjectName(VObject *o, const char* id) { @@ -159,3 +178,3 @@ void setVObjectName(VObject *o, const char* id) -const char* vObjectStringZValue(VObject *o) +DLLEXPORT(const char*) vObjectStringZValue(VObject *o) { @@ -164,3 +183,3 @@ const char* vObjectStringZValue(VObject *o) -void setVObjectStringZValue(VObject *o, const char *s) +DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s) { @@ -170,3 +189,3 @@ void setVObjectStringZValue(VObject *o, const char *s) -void setVObjectStringZValue_(VObject *o, const char *s) +DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s) { @@ -176,3 +195,3 @@ void setVObjectStringZValue_(VObject *o, const char *s) -const wchar_t* vObjectUStringZValue(VObject *o) +DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o) { @@ -181,3 +200,3 @@ const wchar_t* vObjectUStringZValue(VObject *o) -void setVObjectUStringZValue(VObject *o, const wchar_t *s) +DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s) { @@ -187,3 +206,3 @@ void setVObjectUStringZValue(VObject *o, const wchar_t *s) -void setVObjectUStringZValue_(VObject *o, const wchar_t *s) +DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s) { @@ -193,3 +212,3 @@ void setVObjectUStringZValue_(VObject *o, const wchar_t *s) -unsigned int vObjectIntegerValue(VObject *o) +DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o) { @@ -198,3 +217,3 @@ unsigned int vObjectIntegerValue(VObject *o) -void setVObjectIntegerValue(VObject *o, unsigned int i) +DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i) { @@ -204,3 +223,3 @@ void setVObjectIntegerValue(VObject *o, unsigned int i) -unsigned long vObjectLongValue(VObject *o) +DLLEXPORT(unsigned long) vObjectLongValue(VObject *o) { @@ -209,3 +228,3 @@ unsigned long vObjectLongValue(VObject *o) -void setVObjectLongValue(VObject *o, unsigned long l) +DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l) { @@ -215,3 +234,3 @@ void setVObjectLongValue(VObject *o, unsigned long l) -void* vObjectAnyValue(VObject *o) +DLLEXPORT(void*) vObjectAnyValue(VObject *o) { @@ -220,3 +239,3 @@ void* vObjectAnyValue(VObject *o) -void setVObjectAnyValue(VObject *o, void *t) +DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t) { @@ -226,3 +245,3 @@ void setVObjectAnyValue(VObject *o, void *t) -VObject* vObjectVObjectValue(VObject *o) +DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o) { @@ -231,3 +250,3 @@ VObject* vObjectVObjectValue(VObject *o) -void setVObjectVObjectValue(VObject *o, VObject *p) +DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p) { @@ -237,3 +256,3 @@ void setVObjectVObjectValue(VObject *o, VObject *p) -int vObjectValueType(VObject *o) +DLLEXPORT(int) vObjectValueType(VObject *o) { @@ -247,3 +266,3 @@ int vObjectValueType(VObject *o) -VObject* addVObjectProp(VObject *o, VObject *p) +DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p) { @@ -282,3 +301,3 @@ VObject* addVObjectProp(VObject *o, VObject *p) -VObject* addProp(VObject *o, const char *id) +DLLEXPORT(VObject*) addProp(VObject *o, const char *id) { @@ -287,3 +306,3 @@ VObject* addProp(VObject *o, const char *id) -VObject* addProp_(VObject *o, const char *id) +DLLEXPORT(VObject*) addProp_(VObject *o, const char *id) { @@ -292,3 +311,3 @@ VObject* addProp_(VObject *o, const char *id) -void addList(VObject **o, VObject *p) +DLLEXPORT(void) addList(VObject **o, VObject *p) { @@ -307,3 +326,3 @@ void addList(VObject **o, VObject *p) -VObject* nextVObjectInList(VObject *o) +DLLEXPORT(VObject*) nextVObjectInList(VObject *o) { @@ -312,3 +331,3 @@ VObject* nextVObjectInList(VObject *o) -VObject* setValueWithSize_(VObject *prop, void *val, unsigned int size) +DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size) { @@ -321,5 +340,5 @@ VObject* setValueWithSize_(VObject *prop, void *val, unsigned int size) -VObject* setValueWithSize(VObject *prop, void *val, unsigned int size) +DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size) { - void *p = dupStr(val,size); + void *p = dupStr((const char *)val,size); return setValueWithSize_(prop,p,p?size:0); @@ -327,3 +346,3 @@ VObject* setValueWithSize(VObject *prop, void *val, unsigned int size) -void initPropIterator(VObjectIterator *i, VObject *o) +DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o) { @@ -333,3 +352,3 @@ void initPropIterator(VObjectIterator *i, VObject *o) -void initVObjectIterator(VObjectIterator *i, VObject *o) +DLLEXPORT(void) initVObjectIterator(VObjectIterator *i, VObject *o) { @@ -339,3 +358,3 @@ void initVObjectIterator(VObjectIterator *i, VObject *o) -int moreIteration(VObjectIterator *i) +DLLEXPORT(int) moreIteration(VObjectIterator *i) { @@ -344,3 +363,3 @@ int moreIteration(VObjectIterator *i) -VObject* nextVObject(VObjectIterator *i) +DLLEXPORT(VObject*) nextVObject(VObjectIterator *i) { @@ -359,3 +378,3 @@ VObject* nextVObject(VObjectIterator *i) -VObject* isAPropertyOf(VObject *o, const char *id) +DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id) { @@ -365,3 +384,3 @@ VObject* isAPropertyOf(VObject *o, const char *id) VObject *each = nextVObject(&i); - if (!strcasecmp(id,each->id)) + if (!stricmp(id,each->id)) return each; @@ -371,3 +390,3 @@ VObject* isAPropertyOf(VObject *o, const char *id) -VObject* addGroup(VObject *o, const char *g) +DLLEXPORT(VObject*) addGroup(VObject *o, const char *g) { @@ -412,3 +431,3 @@ VObject* addGroup(VObject *o, const char *g) -VObject* addPropValue(VObject *o, const char *p, const char *v) +DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v) { @@ -420,3 +439,3 @@ VObject* addPropValue(VObject *o, const char *p, const char *v) -VObject* addPropSizedValue_(VObject *o, const char *p, const char *v, +DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size) @@ -429,3 +448,3 @@ VObject* addPropSizedValue_(VObject *o, const char *p, const char *v, -VObject* addPropSizedValue(VObject *o, const char *p, const char *v, +DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size) @@ -530,3 +549,3 @@ void printVObject(FILE *fp,VObject *o) -void printVObjectToFile(char *fname,VObject *o) +DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o) { @@ -539,3 +558,3 @@ void printVObjectToFile(char *fname,VObject *o) -void printVObjectsToFile(char *fname,VObject *list) +DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list) { @@ -551,3 +570,3 @@ void printVObjectsToFile(char *fname,VObject *list) -void cleanVObject(VObject *o) +DLLEXPORT(void) cleanVObject(VObject *o) { @@ -575,3 +594,3 @@ void cleanVObject(VObject *o) case VCVT_RAW: - /* assume they are all allocated by malloc. */ + /* assume they are all allocated by malloc. */ free((char*)STRINGZ_VALUE_OF(o)); @@ -585,3 +604,3 @@ void cleanVObject(VObject *o) -void cleanVObjects(VObject *list) +DLLEXPORT(void) cleanVObjects(VObject *list) { @@ -612,65 +631,61 @@ static unsigned int hashStr(const char *s) -const char* lookupStr(const char *s) +DLLEXPORT(const char*) lookupStr(const char *s) { - char *newS; - - StrItem *t; - unsigned int h = hashStr(s); - if ((t = strTbl[h]) != 0) { - do { - if (strcasecmp(t->s,s) == 0) { - t->refCnt++; - return t->s; - } - t = t->next; - } while (t); - } - newS = dupStr(s,0); - strTbl[h] = newStrItem(newS,strTbl[h]); - return newS; + StrItem *t; + unsigned int h = hashStr(s); + if ((t = strTbl[h]) != 0) { + do { + if (stricmp(t->s,s) == 0) { + t->refCnt++; + return t->s; + } + t = t->next; + } while (t); + } + s = dupStr(s,0); + strTbl[h] = newStrItem(s,strTbl[h]); + return s; } -void unUseStr(const char *s) +DLLEXPORT(void) unUseStr(const char *s) { - StrItem *cur, *prev; - + StrItem *t, *p; unsigned int h = hashStr(s); - cur = strTbl[h]; - prev = cur; - while (cur != 0) { - if (strcasecmp(cur->s,s) == 0) { - cur->refCnt--; - /* if that was the last reference to this string, kill it. */ - if (cur->refCnt == 0) { - if (cur == strTbl[h]) { - strTbl[h] = cur->next; - deleteStr(prev->s); - deleteStrItem(prev); - } else { - prev->next = cur->next; - deleteStr(cur->s); - deleteStrItem(cur); - } - return; + if ((t = strTbl[h]) != 0) { + p = t; + do { + if (stricmp(t->s,s) == 0) { + t->refCnt--; + if (t->refCnt == 0) { + if (p == strTbl[h]) { + strTbl[h] = t->next; + } + else { + p->next = t->next; + } + deleteStr(t->s); + deleteStrItem(t); + return; + } + } + p = t; + t = t->next; + } while (t); } - } - prev = cur; - cur = cur->next; - } } -void cleanStrTbl() +DLLEXPORT(void) cleanStrTbl() { - int i; - for (i=0; i<STRTBLSIZE;i++) { - StrItem *t = strTbl[i]; - while (t) { - StrItem *p; - deleteStr(t->s); - p = t; - t = t->next; - deleteStrItem(p); - } - strTbl[i] = 0; - } + int i; + for (i=0; i<STRTBLSIZE;i++) { + StrItem *t = strTbl[i]; + while (t) { + StrItem *p; + deleteStr(t->s); + p = t; + t = t->next; + deleteStrItem(p); + } while (t); + strTbl[i] = 0; + } } @@ -809,3 +824,3 @@ static struct PreDefProp propNames[] = { { VCExNumProp, 0, 0, 0 }, - { VCExDateProp, 0, 0, 0 }, + { VCExpDateProp, 0, 0, 0 }, { VCExpectProp, 0, 0, 0 }, @@ -923,3 +938,3 @@ static struct PreDefProp* lookupPropInfo(const char* str) for (i = 0; propNames[i].name; i++) - if (strcasecmp(str, propNames[i].name) == 0) { + if (stricmp(str, propNames[i].name) == 0) { return &propNames[i]; @@ -931,3 +946,3 @@ static struct PreDefProp* lookupPropInfo(const char* str) -const char* lookupProp_(const char* str) +DLLEXPORT(const char*) lookupProp_(const char* str) { @@ -936,3 +951,3 @@ const char* lookupProp_(const char* str) for (i = 0; propNames[i].name; i++) - if (strcasecmp(str, propNames[i].name) == 0) { + if (stricmp(str, propNames[i].name) == 0) { const char* s; @@ -945,3 +960,3 @@ const char* lookupProp_(const char* str) -const char* lookupProp(const char* str) +DLLEXPORT(const char*) lookupProp(const char* str) { @@ -950,3 +965,3 @@ const char* lookupProp(const char* str) for (i = 0; propNames[i].name; i++) - if (strcasecmp(str, propNames[i].name) == 0) { + if (stricmp(str, propNames[i].name) == 0) { const char *s; @@ -974,7 +989,3 @@ typedef struct OFile { - -/* vCalendar files need crlf linebreaks. The disabled functions didn't provide - that. */ #if 0 - static void appendsOFile(OFile *fp, const char *s) @@ -997,6 +1008,3 @@ stuff: if (OFILE_REALLOC_SIZE <= slen) fp->limit += slen; - if (fp->s) - fp->s = realloc(fp->s,fp->limit); - else - fp->s = malloc(fp->limit); + fp->s = (char *) realloc(fp->s,fp->limit); if (fp->s) goto stuff; @@ -1025,3 +1033,3 @@ stuff: fp->limit = fp->limit + OFILE_REALLOC_SIZE; - fp->s = realloc(fp->s,fp->limit); + fp->s = (char *) realloc(fp->s,fp->limit); if (fp->s) goto stuff; @@ -1034,5 +1042,3 @@ stuff: } - #else - static void appendcOFile_(OFile *fp, char c) @@ -1117,3 +1123,3 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) while (cur < len) { - /* collect the triplet of bytes into 'trip' */ + /* collect the triplet of bytes into 'trip' */ trip = 0; @@ -1129,3 +1135,3 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) if ((3 - i) < (cur - len)) - quad[i] = '='; /* pad char */ + quad[i] = '='; /* pad char */ else if (b < 26) quad[i] = (char)b + 'A'; @@ -1147,15 +1153,30 @@ static int writeBase64(OFile *fp, unsigned char *s, long len) -/* this function really sucks. Too basic. */ -static void writeQPString(OFile *fp, const char *s, int qp) +static void writeString(OFile *fp, const char *s) +{ + appendsOFile(fp,s); +} + +static void writeQPString(OFile *fp, const char *s) { + char buf[4]; + int count=0; const char *p = s; + while (*p) { - if (*p == '\n') { - if (p[1]) appendsOFile(fp,"=0A="); - } - if (*p == '=' && qp) - appendsOFile(fp,"=3D"); - else - appendcOFile(fp,*p); - p++; + /* break up lines biggger than 75 chars */ + if(count >=74){ + count=0; + appendsOFile(fp,"=\n"); + } + + /* escape any non ASCII characters and '=' as per rfc1521 */ + if (*p<= 0x1f || *p >=0x7f || *p == '=' ) { + sprintf(buf,"=%02X",(unsigned char)*p); + appendsOFile(fp,buf); + count+=3; + } else { + appendcOFile(fp,*p); + count++; + } + p++; } @@ -1163,5 +1184,7 @@ static void writeQPString(OFile *fp, const char *s, int qp) + + static void writeVObject_(OFile *fp, VObject *o); -static void writeValue(OFile *fp, VObject *o, unsigned long size) +static void writeValue(OFile *fp, VObject *o, unsigned long size,int quote) { @@ -1171,6 +1194,4 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size) char *s = fakeCString(USTRINGZ_VALUE_OF(o)); - if (isAPropertyOf(o, VCQuotedPrintableProp)) - writeQPString(fp, s, 1); - else - writeQPString(fp, s, 0); + if(quote) writeQPString(fp, s); + else writeString(fp,s); deleteStr(s); @@ -1179,6 +1200,4 @@ static void writeValue(OFile *fp, VObject *o, unsigned long size) case VCVT_STRINGZ: { - if (isAPropertyOf(o, VCQuotedPrintableProp)) - writeQPString(fp, STRINGZ_VALUE_OF(o), 1); - else - writeQPString(fp, STRINGZ_VALUE_OF(o), 0); + if(quote) writeQPString(fp, STRINGZ_VALUE_OF(o)); + else writeString(fp,STRINGZ_VALUE_OF(o)); break; @@ -1222,3 +1241,3 @@ static void writeAttrValue(OFile *fp, VObject *o) appendcOFile(fp,'='); - writeValue(fp,o,0); + writeValue(fp,o,0,0); } @@ -1232,6 +1251,5 @@ static void writeGroup(OFile *fp, VObject *o) while ((o=isAPropertyOf(o,VCGroupingProp)) != 0) { - strncpy(buf2,STRINGZ_VALUE_OF(o),sizeof(buf2)); - buf2[sizeof(buf2)] = '\0'; - strncat(buf2,".",sizeof(buf2)-strlen(buf2)-1); - strncat(buf2,buf1,sizeof(buf2)-strlen(buf2)-1); + strcpy(buf2,STRINGZ_VALUE_OF(o)); + strcat(buf2,"."); + strcat(buf2,buf1); strcpy(buf1,buf2); @@ -1245,3 +1263,3 @@ static int inList(const char **list, const char *s) while (*list) { - if (strcasecmp(*list,s) == 0) return 1; + if (stricmp(*list,s) == 0) return 1; list++; @@ -1253,2 +1271,3 @@ static void writeProp(OFile *fp, VObject *o) { + int isQuoted=0; if (NAME_OF(o)) { @@ -1272,4 +1291,6 @@ static void writeProp(OFile *fp, VObject *o) s = NAME_OF(eachProp); - if (strcasecmp(VCGroupingProp,s) && !inList(fields_,s)) + if (stricmp(VCGroupingProp,s) && !inList(fields_,s)) writeAttrValue(fp,eachProp); + if (stricmp(VCQPProp,s)==0 || stricmp(VCQuotedPrintableProp,s)==0) + isQuoted=1; } @@ -1281,5 +1302,5 @@ static void writeProp(OFile *fp, VObject *o) while (*fields) { - VObject *tl = isAPropertyOf(o,*fields); + VObject *t = isAPropertyOf(o,*fields); i++; - if (tl) n = i; + if (t) n = i; fields++; @@ -1288,3 +1309,3 @@ static void writeProp(OFile *fp, VObject *o) for (i=0;i<n;i++) { - writeValue(fp,isAPropertyOf(o,*fields),0); + writeValue(fp,isAPropertyOf(o,*fields),0,isQuoted); fields++; @@ -1300,3 +1321,3 @@ static void writeProp(OFile *fp, VObject *o) appendcOFile(fp,':'); - writeValue(fp,o,size); + writeValue(fp,o,size,isQuoted); } @@ -1337,3 +1358,3 @@ void writeVObject(FILE *fp, VObject *o) -void writeVObjectToFile(char *fname, VObject *o) +DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o) { @@ -1346,3 +1367,3 @@ void writeVObjectToFile(char *fname, VObject *o) -void writeVObjectsToFile(char *fname, VObject *list) +DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list) { @@ -1358,3 +1379,3 @@ void writeVObjectsToFile(char *fname, VObject *list) -char* writeMemVObject(char *s, int *len, VObject *o) +DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o) { @@ -1368,3 +1389,3 @@ char* writeMemVObject(char *s, int *len, VObject *o) -char* writeMemVObjects(char *s, int *len, VObject *list) +DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list) { @@ -1384,3 +1405,3 @@ char* writeMemVObjects(char *s, int *len, VObject *list) ----------------------------------------------------------------------*/ -wchar_t* fakeUnicode(const char *ps, int *bytes) +DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes) { @@ -1407,3 +1428,3 @@ wchar_t* fakeUnicode(const char *ps, int *bytes) -int uStrLen(const wchar_t *u) +DLLEXPORT(int) uStrLen(const wchar_t *u) { @@ -1414,3 +1435,3 @@ int uStrLen(const wchar_t *u) -char* fakeCString(const wchar_t *u) +DLLEXPORT(char*) fakeCString(const wchar_t *u) { @@ -1418,3 +1439,3 @@ char* fakeCString(const wchar_t *u) int len = uStrLen(u) + 1; - t = s = (char*)malloc(len+1); + t = s = (char*)malloc(len); while (*u) { diff --git a/libkcal/versit/vobject.h b/libkcal/versit/vobject.h index 0ec8b31..85c299e 100644 --- a/libkcal/versit/vobject.h +++ b/libkcal/versit/vobject.h @@ -144,3 +144,3 @@ extern "C" { #define VCExNumProp "EXNUM" -#define VCExDateProp "EXDATE" +#define VCExpDateProp "EXDATE" #define VCExpectProp "EXPECT" @@ -249,6 +249,6 @@ extern "C" { -/* extensions for KOrganizer / KPilot */ -#define KPilotIdProp "X-PILOTID" -#define KPilotStatusProp "X-PILOTSTAT" +/* Extensions */ +#define XPilotIdProp "X-PILOTID" +#define XPilotStatusProp "X-PILOTSTAT" /* extensions for iMIP / iTIP */ @@ -257,30 +257,4 @@ extern "C" { #define ICRequestStatusProp "X-REQUEST-STATUS" - typedef struct VObject VObject; -typedef union ValueItem { - const char *strs; - const wchar_t *ustrs; - unsigned int i; - unsigned long l; - void *any; - VObject *vobj; - } ValueItem; - -struct VObject { - VObject *next; - const char *id; - VObject *prop; - unsigned short valType; - ValueItem val; - }; - -typedef struct StrItem StrItem; - -struct StrItem { - StrItem *next; - const char *s; - unsigned int refCnt; - }; - typedef struct VObjectIterator { @@ -290,66 +264,66 @@ typedef struct VObjectIterator { -extern VObject* newVObject(const char *id); -extern void deleteVObject(VObject *p); -extern char* dupStr(const char *s, unsigned int size); -extern void deleteStr(const char *p); -extern void unUseStr(const char *s); - -extern void setVObjectName(VObject *o, const char* id); -extern void setVObjectStringZValue(VObject *o, const char *s); -extern void setVObjectStringZValue_(VObject *o, const char *s); -extern void setVObjectUStringZValue(VObject *o, const wchar_t *s); -extern void setVObjectUStringZValue_(VObject *o, const wchar_t *s); -extern void setVObjectIntegerValue(VObject *o, unsigned int i); -extern void setVObjectLongValue(VObject *o, unsigned long l); -extern void setVObjectAnyValue(VObject *o, void *t); -extern VObject* setValueWithSize(VObject *prop, void *val, unsigned int size); -extern VObject* setValueWithSize_(VObject *prop, void *val, unsigned int size); - -extern const char* vObjectName(VObject *o); -extern const char* vObjectStringZValue(VObject *o); -extern const wchar_t* vObjectUStringZValue(VObject *o); -extern unsigned int vObjectIntegerValue(VObject *o); -extern unsigned long vObjectLongValue(VObject *o); -extern void* vObjectAnyValue(VObject *o); -extern VObject* vObjectVObjectValue(VObject *o); -extern void setVObjectVObjectValue(VObject *o, VObject *p); - -extern VObject* addVObjectProp(VObject *o, VObject *p); -extern VObject* addProp(VObject *o, const char *id); -extern VObject* addProp_(VObject *o, const char *id); -extern VObject* addPropValue(VObject *o, const char *p, const char *v); -extern VObject* addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size); -extern VObject* addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size); -extern VObject* addGroup(VObject *o, const char *g); -extern void addList(VObject **o, VObject *p); - -extern VObject* isAPropertyOf(VObject *o, const char *id); - -extern VObject* nextVObjectInList(VObject *o); -extern void initPropIterator(VObjectIterator *i, VObject *o); -extern int moreIteration(VObjectIterator *i); -extern VObject* nextVObject(VObjectIterator *i); - -extern char* writeMemVObject(char *s, int *len, VObject *o); -extern char* writeMemVObjects(char *s, int *len, VObject *list); - -extern const char* lookupStr(const char *s); -extern void cleanStrTbl(); - -extern void cleanVObject(VObject *o); -extern void cleanVObjects(VObject *list); - -extern const char* lookupProp(const char* str); -extern const char* lookupProp_(const char* str); - -extern wchar_t* fakeUnicode(const char *ps, int *bytes); -extern int uStrLen(const wchar_t *u); -extern char* fakeCString(const wchar_t *u); - -extern void printVObjectToFile(char *fname,VObject *o); -extern void printVObjectsToFile(char *fname,VObject *list); -extern void writeVObjectToFile(char *fname, VObject *o); -extern void writeVObjectsToFile(char *fname, VObject *list); - -extern int vObjectValueType(VObject *o); +extern DLLEXPORT(VObject*) newVObject(const char *id); +extern DLLEXPORT(void) deleteVObject(VObject *p); +extern DLLEXPORT(char*) dupStr(const char *s, unsigned int size); +extern DLLEXPORT(void) deleteStr(const char *p); +extern DLLEXPORT(void) unUseStr(const char *s); + +extern DLLEXPORT(void) setVObjectName(VObject *o, const char* id); +extern DLLEXPORT(void) setVObjectStringZValue(VObject *o, const char *s); +extern DLLEXPORT(void) setVObjectStringZValue_(VObject *o, const char *s); +extern DLLEXPORT(void) setVObjectUStringZValue(VObject *o, const wchar_t *s); +extern DLLEXPORT(void) setVObjectUStringZValue_(VObject *o, const wchar_t *s); +extern DLLEXPORT(void) setVObjectIntegerValue(VObject *o, unsigned int i); +extern DLLEXPORT(void) setVObjectLongValue(VObject *o, unsigned long l); +extern DLLEXPORT(void) setVObjectAnyValue(VObject *o, void *t); +extern DLLEXPORT(VObject*) setValueWithSize(VObject *prop, void *val, unsigned int size); +extern DLLEXPORT(VObject*) setValueWithSize_(VObject *prop, void *val, unsigned int size); + +extern DLLEXPORT(const char*) vObjectName(VObject *o); +extern DLLEXPORT(const char*) vObjectStringZValue(VObject *o); +extern DLLEXPORT(const wchar_t*) vObjectUStringZValue(VObject *o); +extern DLLEXPORT(unsigned int) vObjectIntegerValue(VObject *o); +extern DLLEXPORT(unsigned long) vObjectLongValue(VObject *o); +extern DLLEXPORT(void*) vObjectAnyValue(VObject *o); +extern DLLEXPORT(VObject*) vObjectVObjectValue(VObject *o); +extern DLLEXPORT(void) setVObjectVObjectValue(VObject *o, VObject *p); + +extern DLLEXPORT(VObject*) addVObjectProp(VObject *o, VObject *p); +extern DLLEXPORT(VObject*) addProp(VObject *o, const char *id); +extern DLLEXPORT(VObject*) addProp_(VObject *o, const char *id); +extern DLLEXPORT(VObject*) addPropValue(VObject *o, const char *p, const char *v); +extern DLLEXPORT(VObject*) addPropSizedValue_(VObject *o, const char *p, const char *v, unsigned int size); +extern DLLEXPORT(VObject*) addPropSizedValue(VObject *o, const char *p, const char *v, unsigned int size); +extern DLLEXPORT(VObject*) addGroup(VObject *o, const char *g); +extern DLLEXPORT(void) addList(VObject **o, VObject *p); + +extern DLLEXPORT(VObject*) isAPropertyOf(VObject *o, const char *id); + +extern DLLEXPORT(VObject*) nextVObjectInList(VObject *o); +extern DLLEXPORT(void) initPropIterator(VObjectIterator *i, VObject *o); +extern DLLEXPORT(int) moreIteration(VObjectIterator *i); +extern DLLEXPORT(VObject*) nextVObject(VObjectIterator *i); + +extern DLLEXPORT(char*) writeMemVObject(char *s, int *len, VObject *o); +extern DLLEXPORT(char*) writeMemVObjects(char *s, int *len, VObject *list); + +extern DLLEXPORT(const char*) lookupStr(const char *s); +extern DLLEXPORT(void) cleanStrTbl(); + +extern DLLEXPORT(void) cleanVObject(VObject *o); +extern DLLEXPORT(void) cleanVObjects(VObject *list); + +extern DLLEXPORT(const char*) lookupProp(const char* str); +extern DLLEXPORT(const char*) lookupProp_(const char* str); + +extern DLLEXPORT(wchar_t*) fakeUnicode(const char *ps, int *bytes); +extern DLLEXPORT(int) uStrLen(const wchar_t *u); +extern DLLEXPORT(char*) fakeCString(const wchar_t *u); + +extern DLLEXPORT(void) printVObjectToFile(char *fname,VObject *o); +extern DLLEXPORT(void) printVObjectsToFile(char *fname,VObject *list); +extern DLLEXPORT(void) writeVObjectToFile(char *fname, VObject *o); +extern DLLEXPORT(void) writeVObjectsToFile(char *fname, VObject *list); + +extern DLLEXPORT(int) vObjectValueType(VObject *o); @@ -373,2 +347,13 @@ extern const char** fieldedProp; +/* NOTE regarding printVObject and writeVObject + +The functions below are not exported from the DLL because they +take a FILE* as a parameter, which cannot be passed across a DLL +interface (at least that is my experience). Instead you can use +their companion functions which take file names or pointers +to memory. However, if you are linking this code into +your build directly then you may find them a more convenient API +and you can go ahead and use them. If you try to use them with +the DLL LIB you will get a link error. +*/ extern void printVObject(FILE *fp,VObject *o); |