From 885c645ee48ae53467e244521c011c73bc106afb Mon Sep 17 00:00:00 2001 From: zecke Date: Fri, 29 Aug 2003 18:02:09 +0000 Subject: Fixes for base64 decoding and encoding of vCard --- (limited to 'library/backend/vcc.y') diff --git a/library/backend/vcc.y b/library/backend/vcc.y index 4c79368..bec2955 100644 --- a/library/backend/vcc.y +++ b/library/backend/vcc.y @@ -441,7 +441,7 @@ static void enterProps(const char *s) static void enterAttr(const char *s1, const char *s2) { - const char *p1, *p2; + const char *p1, *p2=0; p1 = lookupProp_(s1); if (s2) { VObject *a; @@ -813,7 +813,7 @@ static void finiLex() { /* This parses and converts the base64 format for binary encoding into * a decoded buffer (allocated with new). See RFC 1521. */ -static char * lexGetDataFromBase64() +static int lexGetDataFromBase64() { unsigned long bytesLen = 0, bytesMax = 0; int quadIx = 0, pad = 0; @@ -826,6 +826,7 @@ static char * lexGetDataFromBase64() DBG_(("db: lexGetDataFromBase64\n")); while (1) { c = lexGetc(); + lexSkipWhite(); if (c == '\n') { ++mime_lineNum; if (lexLookahead() == '\n') { @@ -848,8 +849,6 @@ static char * lexGetDataFromBase64() else if (c == '=') { b = 0; pad++; - } else if ((c == ' ') || (c == '\t')) { - continue; } else { /* error condition */ if (bytes) free(bytes); else if (oldBytes) free(oldBytes); @@ -858,14 +857,17 @@ static char * lexGetDataFromBase64() if (c != EOF) { c = lexGetc(); while (c != EOF) { - if (c == '\n' && lexLookahead() == '\n') { - ++mime_lineNum; - break; + if (c == '\n') { + lexSkipWhite(); + if(lexLookahead() == '\n') { + ++mime_lineNum; + break; + } } c = lexGetc(); } } - return NULL; + return c != EOF; } trip = (trip << 6) | b; if (++quadIx == 4) { @@ -911,7 +913,7 @@ static char * lexGetDataFromBase64() setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen); free(oldBytes); } - return 0; + return bytesLen; } static int match_begin_end_name(int end) { @@ -942,7 +944,7 @@ static char* lexGetQuotedPrintable() c = lexLookahead(); lexClearToken(); - while (c != EOF && c != ';') { + while (c != EOF && (c != ';' || !fieldedProp)) { if (c == '\n') { // break, leave '\n' on remaining chars. break; @@ -1032,11 +1034,8 @@ static int yylex() { lexPushLookaheadc(c); if (lexWithinMode(L_BASE64)) { /* get each char and convert to bin on the fly... */ - p = lexGetDataFromBase64(); -#if 0 - yylval.str = p; - return STRING; -#endif + yylval.str = NULL; + return lexGetDataFromBase64() ? STRING : 0; } else if (lexWithinMode(L_QUOTED_PRINTABLE)) { p = lexGetQuotedPrintable(); -- cgit v0.9.0.2