summaryrefslogtreecommitdiff
authorzecke <zecke>2004-09-14 22:50:22 (UTC)
committer zecke <zecke>2004-09-14 22:50:22 (UTC)
commitd46a01de16c8ad65b00c76beda547970f7972b62 (patch) (side-by-side diff)
tree3ce4b630f5cd45c230c0a4f4ff92993a9c4f4f6c
parent271a3753d1b71a85e5463b357abbfe46fce51732 (diff)
downloadopie-d46a01de16c8ad65b00c76beda547970f7972b62.zip
opie-d46a01de16c8ad65b00c76beda547970f7972b62.tar.gz
opie-d46a01de16c8ad65b00c76beda547970f7972b62.tar.bz2
Be able to properly import vCard from Cell Phones
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--library/backend/vcc.y53
-rw-r--r--library/backend/vcc_yacc.cpp328
-rw-r--r--library/backend/vobject.cpp11
3 files changed, 212 insertions, 180 deletions
diff --git a/library/backend/vcc.y b/library/backend/vcc.y
index eca7c32..00e8fed 100644
--- a/library/backend/vcc.y
+++ b/library/backend/vcc.y
@@ -49,8 +49,10 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
*/
/* debugging utilities */
+#define __DEBUG 1
+
#if __DEBUG
#define DBG_(x) printf x
#else
#define DBG_(x)
@@ -134,8 +136,9 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
/* (includes outermost) */
/**** Global Variables ****/
+int q_DontDecodeBase64Photo = 0;
int mime_lineNum, mime_numErrors; /* yyerror() can use these */
static VObject* vObjList;
static VObject *curProp;
static VObject *curObj;
@@ -157,8 +160,9 @@ extern "C" {
int yyparse();
enum LexMode {
L_NORMAL,
+ L_PARAMWORD,
L_VCARD,
L_VCAL,
L_VEVENT,
L_VTODO,
@@ -288,12 +292,16 @@ attr_param: SEMICOLON attr
attr: name
{
enterAttr($1,0);
}
- | name EQ name
+ | name EQ
{
- enterAttr($1,$3);
-
+ lexPushMode(L_PARAMWORD);
+ }
+ name
+ {
+ lexPopMode(0);
+ enterAttr($1,$4);
}
;
name: ID
@@ -450,12 +458,17 @@ static void enterAttr(const char *s1, const char *s2)
setVObjectStringZValue(a,p2);
}
else
addProp(curProp,p1);
- if (qstricmp(p1,VCBase64Prop) == 0 || (s2 && qstricmp(p2,VCBase64Prop)==0))
+ /* Lookup strings so we can quickly use pointer comparison */
+ static const char* base64 = lookupProp_(VCBase64Prop);
+ static const char* qp = lookupProp_(VCQuotedPrintableProp);
+ static const char* photo = lookupProp_(VCPhotoProp);
+ static const char* encoding = lookupProp_(VCEncodingProp);
+ if ((!q_DontDecodeBase64Photo || vObjectName(curProp) != photo)
+ && (p1 == base64 || p1 == encoding && p2 == base64))
lexPushMode(L_BASE64);
- else if (qstricmp(p1,VCQuotedPrintableProp) == 0
- || (s2 && qstricmp(p2,VCQuotedPrintableProp)==0))
+ else if (p1 == qp || p1 == encoding && p2 == qp)
lexPushMode(L_QUOTED_PRINTABLE);
deleteStr(s1); deleteStr(s2);
}
@@ -640,8 +653,22 @@ static char* lexGetWord() {
lexAppendc(0);
return lexStr();
}
+static char* lexGetParamWord()
+{
+ int c;
+ lexClearToken();
+ c = lexLookahead();
+ while (c >= ' ' && c < 127 && !strchr("[]:=,.;",c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return lexStr();
+}
+
static void lexPushLookaheadc(int c) {
int putptr;
/* can't putback EOF, because it never leaves lookahead buffer */
if (c == EOF) return;
@@ -1009,22 +1036,22 @@ static int yylex() {
int lexmode = LEXMODE();
if (lexmode == L_VALUES) {
int c = lexGetc();
+ int c2;
if (c == ';' && fieldedProp) {
DBG_(("db: SEMICOLON\n"));
lexPushLookaheadc(c);
handleMoreRFC822LineBreak(c);
lexSkipLookahead();
return SEMICOLON;
}
- else if (strchr("\n",c)) {
+ else if (strchr("\n",c) && (c2 = lexLookahead()) != ' ' && c2 != '\t') {
++mime_lineNum;
/* consume all line separator(s) adjacent to each other */
- c = lexLookahead();
- while (strchr("\n",c)) {
+ while (strchr("\n",c2)) {
lexSkipLookahead();
- c = lexLookahead();
+ c2 = lexLookahead();
++mime_lineNum;
}
DBG_(("db: LINESEP\n"));
return LINESEP;
@@ -1053,10 +1080,12 @@ static int yylex() {
return STRING;
}
else return 0;
}
- }
- else {
+ } else if (lexmode == L_PARAMWORD) {
+ yylval.str = lexGetParamWord();
+ return ID;
+ } else {
/* normal mode */
while (1) {
int c = lexGetc();
switch(c) {
diff --git a/library/backend/vcc_yacc.cpp b/library/backend/vcc_yacc.cpp
index bc05f87..68f11b5 100644
--- a/library/backend/vcc_yacc.cpp
+++ b/library/backend/vcc_yacc.cpp
@@ -1,40 +1,15 @@
#ifndef lint
-/*static char yysccsid[] = "from: @(#)yaccpar 1.9 (Berkeley) 02/21/93";*/
-static char yyrcsid[] = "$Id$";
+static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93";
#endif
#define YYBYACC 1
#define YYMAJOR 1
#define YYMINOR 9
#define yyclearin (yychar=(-1))
#define yyerrok (yyerrflag=0)
#define YYRECOVERING (yyerrflag!=0)
-#define yyparse vccparse
-#define yylex vcclex
-#define yyerror vccerror
-#define yychar vccchar
-#define yyval vccval
-#define yylval vcclval
-#define yydebug vccdebug
-#define yynerrs vccnerrs
-#define yyerrflag vccerrflag
-#define yyss vccss
-#define yyssp vccssp
-#define yyvs vccvs
-#define yyvsp vccvsp
-#define yylhs vcclhs
-#define yylen vcclen
-#define yydefred vccdefred
-#define yydgoto vccdgoto
-#define yysindex vccsindex
-#define yyrindex vccrindex
-#define yygindex vccgindex
-#define yytable vcctable
-#define yycheck vcccheck
-#define yyname vccname
-#define yyrule vccrule
-#define YYPREFIX "vcc"
-#line 1 "backend/vcc.y"
+#define YYPREFIX "yy"
+#line 1 "vcc.y"
/***************************************************************************
(C) Copyright 1996 Apple Computer, Inc., AT&T Corp., International
@@ -85,8 +60,10 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
*/
/* debugging utilities */
+#define __DEBUG 1
+
#if __DEBUG
#define DBG_(x) printf x
#else
#define DBG_(x)
@@ -154,29 +131,25 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
-/*#ifdef PALMTOPCENTER
-*/
-/*#include <qpe/vobject_p.h>
-*/
-/*#else
-*/
+/*#ifdef PALMTOPCENTER */
+/*#include <qpe/vobject_p.h> */
+/*#else */
#include "vobject_p.h"
-/*#endif
-*/
+/*#endif */
/**** Types, Constants ****/
#define YYDEBUG 0 /* 1 to compile in some debugging code */
#define MAXTOKEN 256 /* maximum token (line) length */
-#define YYSTACKSIZE 100 /* ~unref ?
-*/
+#define YYSTACKSIZE 100 /* ~unref ? */
#define MAXLEVEL 10 /* max # of nested objects parseable */
/* (includes outermost) */
/**** Global Variables ****/
+int q_DontDecodeBase64Photo = 0;
int mime_lineNum, mime_numErrors; /* yyerror() can use these */
static VObject* vObjList;
static VObject *curProp;
static VObject *curObj;
@@ -198,8 +171,9 @@ extern "C" {
int yyparse();
enum LexMode {
L_NORMAL,
+ L_PARAMWORD,
L_VCARD,
L_VCAL,
L_VEVENT,
L_VTODO,
@@ -220,14 +194,14 @@ static void enterValues(const char *value);
#define mime_error yyerror
void mime_error(char *s);
void mime_error_(char *s);
-#line 189 "backend/vcc.y"
+#line 193 "vcc.y"
typedef union {
char *str;
VObject *vobj;
} YYSTYPE;
-#line 225 "y.tab.c"
+#line 204 "y.tab.c"
#define EQ 257
#define COLON 258
#define DOT 259
#define SEMICOLON 260
@@ -245,84 +219,84 @@ typedef union {
#define END_VTODO 272
#define ID 273
#define STRING 274
#define YYERRCODE 256
-short vcclhs[] = { -1,
+short yylhs[] = { -1,
0, 6, 6, 5, 5, 8, 3, 9, 3, 7,
7, 13, 10, 10, 15, 11, 11, 14, 14, 16,
- 17, 17, 1, 18, 12, 12, 2, 2, 20, 4,
- 21, 4, 19, 19, 22, 22, 22, 25, 23, 26,
- 23, 27, 24, 28, 24,
+ 17, 18, 17, 1, 19, 12, 12, 2, 2, 21,
+ 4, 22, 4, 20, 20, 23, 23, 23, 26, 24,
+ 27, 24, 28, 25, 29, 25,
};
-short vcclen[] = { 2,
+short yylen[] = { 2,
1, 2, 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,
+ 1, 0, 4, 1, 0, 4, 1, 1, 0, 0,
+ 4, 0, 3, 2, 1, 1, 1, 1, 0, 4,
+ 0, 3, 0, 4, 0, 3,
};
-short vccdefred[] = { 0,
+short yydefred[] = { 0,
0, 0, 0, 4, 5, 3, 0, 0, 0, 0,
- 0, 2, 14, 23, 0, 0, 11, 0, 9, 0,
- 0, 0, 0, 34, 35, 36, 32, 0, 7, 10,
- 12, 0, 0, 0, 0, 30, 33, 0, 0, 19,
- 0, 0, 41, 0, 45, 0, 20, 18, 27, 0,
- 0, 39, 43, 0, 24, 13, 22, 0, 25,
+ 0, 2, 14, 24, 0, 0, 11, 0, 9, 0,
+ 0, 0, 0, 35, 36, 37, 33, 0, 7, 10,
+ 12, 0, 0, 0, 0, 31, 34, 0, 0, 19,
+ 0, 0, 42, 0, 46, 0, 20, 18, 28, 0,
+ 0, 40, 44, 22, 25, 13, 0, 0, 23, 26,
};
-short vccdgoto[] = { 3,
+short yydgoto[] = { 3,
15, 50, 4, 5, 6, 7, 22, 8, 9, 17,
- 18, 51, 41, 39, 28, 40, 47, 58, 23, 10,
- 11, 24, 25, 26, 32, 33, 34, 35,
+ 18, 51, 41, 39, 28, 40, 47, 57, 58, 23,
+ 10, 11, 24, 25, 26, 32, 33, 34, 35,
};
-short vccsindex[] = { -262,
- 0, 0, 0, 0, 0, 0, -262, -252, -219, -249,
- -256, 0, 0, 0, 0, -227, 0, -242, 0, 0,
- 0, -252, -254, 0, 0, 0, 0, -208, 0, 0,
- 0, -252, -228, -252, -213, 0, 0, -212, -208, 0,
- -214, -233, 0, -224, 0, -195, 0, 0, 0, -197,
- -199, 0, 0, -212, 0, 0, 0, -214, 0,
+short yysindex[] = { -255,
+ 0, 0, 0, 0, 0, 0, -255, -215, -257, -234,
+ -245, 0, 0, 0, 0, -242, 0, -210, 0, 0,
+ 0, -215, -253, 0, 0, 0, 0, -247, 0, 0,
+ 0, -215, -227, -215, -226, 0, 0, -221, -247, 0,
+ -211, -237, 0, -218, 0, -204, 0, 0, 0, -198,
+ -199, 0, 0, 0, 0, 0, -221, -211, 0, 0,
};
-short vccrindex[] = { 0,
- -222, -238, 0, 0, 0, 0, 65, 0, 0, 0,
- 0, 0, 0, 0, -215, 0, 0, 0, 0, -220,
- -218, -260, 0, 0, 0, 0, 0, 0, 0, 0,
+short yyrindex[] = { 0,
+ -216, -239, 0, 0, 0, 0, 65, 0, 0, 0,
+ 0, 0, 0, 0, -213, 0, 0, 0, 0, -214,
+ -212, -264, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, -192, 0,
- -250, 0, 0, 0, 0, -202, 0, 0, 0, -196,
- 0, 0, 0, 0, 0, 0, 0, -250, 0,
+ -252, 0, 0, 0, 0, -209, 0, 0, 0, -196,
+ 0, 0, 0, 0, 0, 0, 0, -252, 0, 0,
};
-short vccgindex[] = { 0,
- 3, 0, 0, 0, 61, 0, -7, 0, 0, -16,
+short yygindex[] = { 0,
+ -36, 0, 0, 0, 61, 0, -7, 0, 0, -16,
0, 11, 0, 0, 0, 31, 0, 0, 0, 0,
- 0, 48, 0, 0, 0, 0, 0, 0,
+ 0, 0, 48, 0, 0, 0, 0, 0, 0,
};
#define YYTABLESIZE 71
-short vcctable[] = { 30,
- 16, 13, 1, 13, 2, 30, 13, 37, 37, 28,
- 37, 27, 28, 36, 20, 31, 21, 29, 14, 20,
- 14, 21, 13, 14, 42, 30, 44, 30, 13, 31,
- 29, 13, 29, 6, 29, 38, 52, 42, 29, 14,
- 46, 43, 17, 8, 15, 14, 19, 53, 14, 40,
- 6, 38, 38, 44, 42, 21, 57, 21, 45, 49,
- 14, 54, 55, 56, 1, 16, 26, 12, 59, 48,
+short yytable[] = { 30,
+ 16, 46, 13, 38, 38, 30, 38, 29, 19, 1,
+ 29, 2, 38, 13, 36, 20, 30, 21, 13, 14,
+ 59, 13, 27, 29, 42, 30, 44, 30, 32, 30,
+ 14, 30, 52, 30, 20, 14, 21, 13, 14, 6,
+ 13, 39, 43, 43, 17, 45, 15, 31, 21, 8,
+ 21, 14, 54, 53, 14, 41, 6, 14, 39, 45,
+ 43, 55, 49, 56, 1, 16, 27, 12, 60, 48,
37,
};
-short vcccheck[] = { 16,
- 8, 256, 265, 256, 267, 22, 256, 268, 269, 260,
- 271, 268, 263, 268, 269, 258, 271, 256, 273, 269,
- 273, 271, 256, 273, 32, 42, 34, 44, 256, 268,
- 269, 256, 271, 256, 273, 256, 270, 256, 266, 273,
- 38, 270, 258, 266, 260, 273, 266, 272, 273, 270,
- 273, 260, 273, 272, 273, 258, 54, 260, 272, 274,
- 273, 257, 260, 263, 0, 258, 263, 7, 58, 39,
+short yycheck[] = { 16,
+ 8, 38, 256, 268, 269, 22, 271, 260, 266, 265,
+ 263, 267, 260, 256, 268, 269, 256, 271, 256, 273,
+ 57, 256, 268, 266, 32, 42, 34, 44, 268, 269,
+ 273, 271, 270, 273, 269, 273, 271, 256, 273, 256,
+ 256, 256, 270, 256, 258, 272, 260, 258, 258, 266,
+ 260, 273, 257, 272, 273, 270, 273, 273, 273, 272,
+ 273, 260, 274, 263, 0, 258, 263, 7, 58, 39,
23,
};
#define YYFINAL 3
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
#define YYMAXTOKEN 274
#if YYDEBUG
-char *vccname[] = {
+char *yyname[] = {
"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -331,9 +305,9 @@ char *vccname[] = {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"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",
};
-char *vccrule[] = {
+char *yyrule[] = {
"$accept : mime",
"mime : vobjects",
"vobjects : vobjects vobject",
"vobjects : vobject",
@@ -354,32 +328,33 @@ char *vccrule[] = {
"attr_params : attr_params attr_param",
"attr_params : attr_param",
"attr_param : SEMICOLON attr",
"attr : name",
-"attr : name EQ name",
-"name : ID",
"$$5 :",
-"values : value SEMICOLON $$5 values",
+"attr : name EQ $$5 name",
+"name : ID",
+"$$6 :",
+"values : value SEMICOLON $$6 values",
"values : value",
"value : STRING",
"value :",
-"$$6 :",
-"vcal : BEGIN_VCAL $$6 calitems END_VCAL",
"$$7 :",
-"vcal : BEGIN_VCAL $$7 END_VCAL",
+"vcal : BEGIN_VCAL $$7 calitems END_VCAL",
+"$$8 :",
+"vcal : BEGIN_VCAL $$8 END_VCAL",
"calitems : calitems calitem",
"calitems : calitem",
"calitem : eventitem",
"calitem : todoitem",
"calitem : items",
-"$$8 :",
-"eventitem : BEGIN_VEVENT $$8 items END_VEVENT",
"$$9 :",
-"eventitem : BEGIN_VEVENT $$9 END_VEVENT",
+"eventitem : BEGIN_VEVENT $$9 items END_VEVENT",
"$$10 :",
-"todoitem : BEGIN_VTODO $$10 items END_VTODO",
+"eventitem : BEGIN_VEVENT $$10 END_VEVENT",
"$$11 :",
-"todoitem : BEGIN_VTODO $$11 END_VTODO",
+"todoitem : BEGIN_VTODO $$11 items END_VTODO",
+"$$12 :",
+"todoitem : BEGIN_VTODO $$12 END_VTODO",
};
#endif
#ifdef YYSTACKSIZE
#undef YYMAXDEPTH
@@ -402,9 +377,9 @@ YYSTYPE yyval;
YYSTYPE yylval;
short yyss[YYSTACKSIZE];
YYSTYPE yyvs[YYSTACKSIZE];
#define yystacksize YYSTACKSIZE
-#line 382 "backend/vcc.y"
+#line 390 "vcc.y"
/*------------------------------------*/
static int pushVObject(const char *prop)
{
@@ -475,12 +450,17 @@ static void enterAttr(const char *s1, const char *s2)
setVObjectStringZValue(a,p2);
}
else
addProp(curProp,p1);
- if (qstricmp(p1,VCBase64Prop) == 0 || (s2 && qstricmp(p2,VCBase64Prop)==0))
+ /* Lookup strings so we can quickly use pointer comparison */
+ static const char* base64 = lookupProp_(VCBase64Prop);
+ static const char* qp = lookupProp_(VCQuotedPrintableProp);
+ static const char* photo = lookupProp_(VCPhotoProp);
+ static const char* encoding = lookupProp_(VCEncodingProp);
+ if ((!q_DontDecodeBase64Photo || vObjectName(curProp) != photo)
+ && (p1 == base64 || p1 == encoding && p2 == base64))
lexPushMode(L_BASE64);
- else if (qstricmp(p1,VCQuotedPrintableProp) == 0
- || (s2 && qstricmp(p2,VCQuotedPrintableProp)==0))
+ else if (p1 == qp || p1 == encoding && p2 == qp)
lexPushMode(L_QUOTED_PRINTABLE);
deleteStr(s1); deleteStr(s2);
}
@@ -665,8 +645,22 @@ static char* lexGetWord() {
lexAppendc(0);
return lexStr();
}
+static char* lexGetParamWord()
+{
+ int c;
+ lexClearToken();
+ c = lexLookahead();
+ while (c >= ' ' && c < 127 && !strchr("[]:=,.;",c)) {
+ lexAppendc(c);
+ lexSkipLookahead();
+ c = lexLookahead();
+ }
+ lexAppendc(0);
+ return lexStr();
+}
+
static void lexPushLookaheadc(int c) {
int putptr;
/* can't putback EOF, because it never leaves lookahead buffer */
if (c == EOF) return;
@@ -1034,22 +1028,22 @@ static int yylex() {
int lexmode = LEXMODE();
if (lexmode == L_VALUES) {
int c = lexGetc();
+ int c2;
if (c == ';' && fieldedProp) {
DBG_(("db: SEMICOLON\n"));
lexPushLookaheadc(c);
handleMoreRFC822LineBreak(c);
lexSkipLookahead();
return SEMICOLON;
}
- else if (strchr("\n",c)) {
+ else if (strchr("\n",c) && (c2 = lexLookahead()) != ' ' && c2 != '\t') {
++mime_lineNum;
/* consume all line separator(s) adjacent to each other */
- c = lexLookahead();
- while (strchr("\n",c)) {
+ while (strchr("\n",c2)) {
lexSkipLookahead();
- c = lexLookahead();
+ c2 = lexLookahead();
++mime_lineNum;
}
DBG_(("db: LINESEP\n"));
return LINESEP;
@@ -1078,10 +1072,12 @@ static int yylex() {
return STRING;
}
else return 0;
}
- }
- else {
+ } else if (lexmode == L_PARAMWORD) {
+ yylval.str = lexGetParamWord();
+ return ID;
+ } else {
/* normal mode */
while (1) {
int c = lexGetc();
switch(c) {
@@ -1241,19 +1237,15 @@ void mime_error_(char *s)
mimeErrorHandler(s);
}
}
-#line 1241 "y.tab.c"
+#line 1242 "y.tab.c"
#define YYABORT goto yyabort
#define YYREJECT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
int
-#if defined(__STDC__)
-yyparse(void)
-#else
yyparse()
-#endif
{
register int yym, yyn, yystate;
#if YYDEBUG
register char *yys;
@@ -1275,9 +1267,9 @@ yyparse()
yyvsp = yyvs;
*yyssp = yystate = 0;
yyloop:
- if ((yyn = yydefred[yystate]) != 0) goto yyreduce;
+ if (yyn = yydefred[yystate]) goto yyreduce;
if (yychar < 0)
{
if ((yychar = yylex()) < 0) yychar = 0;
#if YYDEBUG
@@ -1315,8 +1307,12 @@ yyloop:
yyn = yytable[yyn];
goto yyreduce;
}
if (yyerrflag) goto yyinrecovery;
+#ifdef lint
+ goto yynewerror;
+#endif
+yynewerror:
yyerror("syntax error");
#ifdef lint
goto yyerrlab;
#endif
@@ -1383,167 +1379,173 @@ yyreduce:
yyval = yyvsp[1-yym];
switch (yyn)
{
case 2:
-#line 221 "backend/vcc.y"
+#line 225 "vcc.y"
{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; }
break;
case 3:
-#line 223 "backend/vcc.y"
+#line 227 "vcc.y"
{ addList(&vObjList, yyvsp[0].vobj); curObj = 0; }
break;
case 6:
-#line 232 "backend/vcc.y"
+#line 236 "vcc.y"
{
lexPushMode(L_VCARD);
if (!pushVObject(VCCardProp)) YYERROR;
}
break;
case 7:
-#line 237 "backend/vcc.y"
+#line 241 "vcc.y"
{
lexPopMode(0);
yyval.vobj = popVObject();
}
break;
case 8:
-#line 242 "backend/vcc.y"
+#line 246 "vcc.y"
{
lexPushMode(L_VCARD);
if (!pushVObject(VCCardProp)) YYERROR;
}
break;
case 9:
-#line 247 "backend/vcc.y"
+#line 251 "vcc.y"
{
lexPopMode(0);
yyval.vobj = popVObject();
}
break;
case 12:
-#line 258 "backend/vcc.y"
+#line 262 "vcc.y"
{
lexPushMode(L_VALUES);
}
break;
case 13:
-#line 262 "backend/vcc.y"
+#line 266 "vcc.y"
{
if (lexWithinMode(L_BASE64) || lexWithinMode(L_QUOTED_PRINTABLE))
lexPopMode(0);
lexPopMode(0);
}
break;
case 15:
-#line 271 "backend/vcc.y"
+#line 275 "vcc.y"
{
enterProps(yyvsp[0].str);
}
break;
case 17:
-#line 276 "backend/vcc.y"
+#line 280 "vcc.y"
{
enterProps(yyvsp[0].str);
}
break;
case 21:
-#line 289 "backend/vcc.y"
+#line 293 "vcc.y"
{
enterAttr(yyvsp[0].str,0);
}
break;
case 22:
-#line 293 "backend/vcc.y"
+#line 297 "vcc.y"
{
- enterAttr(yyvsp[-2].str,yyvsp[0].str);
-
+ lexPushMode(L_PARAMWORD);
+ }
+break;
+case 23:
+#line 301 "vcc.y"
+{
+ lexPopMode(0);
+ enterAttr(yyvsp[-3].str,yyvsp[0].str);
}
break;
-case 24:
-#line 302 "backend/vcc.y"
+case 25:
+#line 310 "vcc.y"
{ enterValues(yyvsp[-1].str); }
break;
-case 26:
-#line 304 "backend/vcc.y"
+case 27:
+#line 312 "vcc.y"
{ enterValues(yyvsp[0].str); }
break;
-case 28:
-#line 309 "backend/vcc.y"
+case 29:
+#line 317 "vcc.y"
{ yyval.str = 0; }
break;
-case 29:
-#line 314 "backend/vcc.y"
+case 30:
+#line 322 "vcc.y"
{ if (!pushVObject(VCCalProp)) YYERROR; }
break;
-case 30:
-#line 317 "backend/vcc.y"
+case 31:
+#line 325 "vcc.y"
{ yyval.vobj = popVObject(); }
break;
-case 31:
-#line 319 "backend/vcc.y"
+case 32:
+#line 327 "vcc.y"
{ if (!pushVObject(VCCalProp)) YYERROR; }
break;
-case 32:
-#line 321 "backend/vcc.y"
+case 33:
+#line 329 "vcc.y"
{ yyval.vobj = popVObject(); }
break;
-case 38:
-#line 336 "backend/vcc.y"
+case 39:
+#line 344 "vcc.y"
{
lexPushMode(L_VEVENT);
if (!pushVObject(VCEventProp)) YYERROR;
}
break;
-case 39:
-#line 342 "backend/vcc.y"
+case 40:
+#line 350 "vcc.y"
{
lexPopMode(0);
popVObject();
}
break;
-case 40:
-#line 347 "backend/vcc.y"
+case 41:
+#line 355 "vcc.y"
{
lexPushMode(L_VEVENT);
if (!pushVObject(VCEventProp)) YYERROR;
}
break;
-case 41:
-#line 352 "backend/vcc.y"
+case 42:
+#line 360 "vcc.y"
{
lexPopMode(0);
popVObject();
}
break;
-case 42:
-#line 360 "backend/vcc.y"
+case 43:
+#line 368 "vcc.y"
{
lexPushMode(L_VTODO);
if (!pushVObject(VCTodoProp)) YYERROR;
}
break;
-case 43:
-#line 366 "backend/vcc.y"
+case 44:
+#line 374 "vcc.y"
{
lexPopMode(0);
popVObject();
}
break;
-case 44:
-#line 371 "backend/vcc.y"
+case 45:
+#line 379 "vcc.y"
{
lexPushMode(L_VTODO);
if (!pushVObject(VCTodoProp)) YYERROR;
}
break;
-case 45:
-#line 376 "backend/vcc.y"
+case 46:
+#line 384 "vcc.y"
{
lexPopMode(0);
popVObject();
}
break;
-#line 1541 "y.tab.c"
+#line 1548 "y.tab.c"
}
yyssp -= yym;
yystate = *yyssp;
yyvsp -= yym;
diff --git a/library/backend/vobject.cpp b/library/backend/vobject.cpp
index 9263c3a..592d116 100644
--- a/library/backend/vobject.cpp
+++ b/library/backend/vobject.cpp
@@ -1102,17 +1102,18 @@ static void writeEncString(OFile *fp, const char *s, bool nosemi)
break;
}
}
-static bool includesUnprintable(VObject *o)
+static bool includesUnprintable(VObject *o, bool nosemi)
{
if (o) {
if (VALUE_TYPE(o) == VCVT_STRINGZ) {
const char *p = STRINGZ_VALUE_OF(o);
if (p) {
while (*p) {
if (*p==' ' && (!p[1] || p[1]=='\n') // RFC 1521: spaces at ends need quoting
- || qpReplaceChar(*p) )
+ || qpReplaceChar(*p)
+ || *p==';' && nosemi )
return TRUE;
p++;
}
}
@@ -1160,9 +1161,9 @@ static void writeAttrValue(OFile *fp, VObject *o)
if (NAME_OF(o)) {
struct PreDefProp *pi;
pi = lookupPropInfo(NAME_OF(o));
if (pi && ((pi->flags & PD_INTERNAL) != 0)) return;
- if ( includesUnprintable(o) )
+ if ( includesUnprintable(o,TRUE) )
appendsOFileEncCs(fp);
appendcOFile(fp,';');
appendsOFile(fp,NAME_OF(o));
} else {
@@ -1228,9 +1229,9 @@ static void writeProp(OFile *fp, VObject *o)
/* output prop as fields */
bool printable = TRUE;
while (*fields && printable) {
VObject *t = isAPropertyOf(o,*fields);
- if (includesUnprintable(t))
+ if (includesUnprintable(t,TRUE))
printable = FALSE;
fields++;
}
fields = fields_;
@@ -1253,9 +1254,9 @@ static void writeProp(OFile *fp, VObject *o)
}
if (VALUE_TYPE(o)) {
- if ( includesUnprintable(o) )
+ if ( includesUnprintable(o,FALSE) )
appendsOFileEncCs(fp);
unsigned long size = 0;
VObject *p = isAPropertyOf(o,VCDataSizeProp);
if (p) size = LONG_VALUE_OF(p);