-rw-r--r-- | library/backend/vcc_yacc.cpp | 127 |
1 files changed, 73 insertions, 54 deletions
diff --git a/library/backend/vcc_yacc.cpp b/library/backend/vcc_yacc.cpp index b2b0c14..5649522 100644 --- a/library/backend/vcc_yacc.cpp +++ b/library/backend/vcc_yacc.cpp | |||
@@ -159,5 +159,5 @@ DFARS 252.227-7013 or 48 CFR 52.227-19, as applicable. | |||
159 | /*#include <qpe/vobject_p.h> */ | 159 | /*#include <qpe/vobject_p.h> */ |
160 | /*#else */ | 160 | /*#else */ |
161 | #include <qtopia/private/vobject_p.h> | 161 | #include "vobject_p.h" |
162 | /*#endif */ | 162 | /*#endif */ |
163 | 163 | ||
@@ -744,14 +744,20 @@ static char* lexGet1Value() { | |||
744 | c = lexLookahead(); | 744 | c = lexLookahead(); |
745 | lexClearToken(); | 745 | lexClearToken(); |
746 | while (c != EOF && c != ';') { | 746 | while (c != EOF && (c != ';' || !fieldedProp)) { |
747 | if (c == '\\' ) { | 747 | if (c == '\\' ) { |
748 | int a; | 748 | int a; |
749 | lexSkipLookahead(); | 749 | lexSkipLookahead(); |
750 | a = lexLookahead(); | 750 | a = lexLookahead(); |
751 | if ( a != ';' ) { | 751 | if ( a == ';' ) { |
752 | lexAppendc('\\'); | ||
753 | } else { | ||
754 | lexAppendc( ';' ); | 752 | lexAppendc( ';' ); |
755 | lexSkipLookahead(); | 753 | lexSkipLookahead(); |
754 | } else if ( a == '\n' ) { | ||
755 | lexAppendc( '\n' ); | ||
756 | lexSkipLookahead(); | ||
757 | } else if ( a == '\\' ) { | ||
758 | lexAppendc( '\\' ); | ||
759 | lexSkipLookahead(); | ||
760 | } else { | ||
761 | lexAppendc('\\'); | ||
756 | } | 762 | } |
757 | } else if (c == '\n') { | 763 | } else if (c == '\n') { |
@@ -952,58 +958,69 @@ static int match_begin_end_name(int end) { | |||
952 | static char* lexGetQuotedPrintable() | 958 | static char* lexGetQuotedPrintable() |
953 | { | 959 | { |
954 | int cur; | 960 | int c; |
955 | 961 | lexSkipWhite(); | |
962 | c = lexLookahead(); | ||
956 | lexClearToken(); | 963 | lexClearToken(); |
957 | do { | 964 | |
958 | cur = lexGetc(); | 965 | while (c != EOF && c != ';') { |
959 | switch (cur) { | 966 | if (c == '\n') { |
960 | case '=': { | 967 | // break, leave '\n' on remaining chars. |
961 | int c = 0; | ||
962 | int next[2]; | ||
963 | int i; | ||
964 | for (i = 0; i < 2; i++) { | ||
965 | next[i] = lexGetc(); | ||
966 | if (next[i] >= '0' && next[i] <= '9') | ||
967 | c = c * 16 + next[i] - '0'; | ||
968 | else if (next[i] >= 'A' && next[i] <= 'F') | ||
969 | c = c * 16 + next[i] - 'A' + 10; | ||
970 | else | ||
971 | break; | 968 | break; |
969 | } else if (c == '=') { | ||
970 | int cur = 0; | ||
971 | int next; | ||
972 | |||
973 | lexSkipLookahead(); // skip '=' | ||
974 | next = lexLookahead(); | ||
975 | |||
976 | if (next == '\n') { | ||
977 | // skip and only skip the \n | ||
978 | lexSkipLookahead(); | ||
979 | c = lexLookahead(); | ||
980 | ++mime_lineNum; // aid in error reporting | ||
981 | continue; | ||
982 | } else if (next >= '0' && next <= '9') { | ||
983 | cur = next - '0'; | ||
984 | } else if (next >= 'A' && next <= 'F') { | ||
985 | cur = next - 'A' + 10; | ||
986 | } else { | ||
987 | // we have been sent buggy stuff. doesn't matter | ||
988 | // what we do so long as we keep going. | ||
989 | // should probably spit an error here | ||
990 | lexSkipLookahead(); | ||
991 | c = lexLookahead(); | ||
992 | continue; | ||
972 | } | 993 | } |
973 | if (i == 0) { | 994 | |
974 | /* single '=' follow by LINESEP is continuation sign? */ | 995 | lexSkipLookahead(); // skip A-Z0-9 |
975 | if (next[0] == '\n') { | 996 | next = lexLookahead(); |
976 | ++mime_lineNum; | 997 | |
977 | } | 998 | cur = cur * 16; |
978 | else { | 999 | // this time really just expecting 0-9A-F |
979 | lexPushLookaheadc('='); | 1000 | if (next >= '0' && next <= '9') { |
980 | goto EndString; | 1001 | cur += next - '0'; |
981 | } | 1002 | } else if (next >= 'A' && next <= 'F') { |
1003 | cur += next - 'A' + 10; | ||
1004 | } else { | ||
1005 | // we have been sent buggy stuff. doesn't matter | ||
1006 | // what we do so long as we keep going. | ||
1007 | // should probably spit an error here | ||
1008 | lexSkipLookahead(); | ||
1009 | c = lexLookahead(); | ||
1010 | continue; | ||
982 | } | 1011 | } |
983 | else if (i == 1) { | 1012 | |
984 | lexPushLookaheadc(next[1]); | 1013 | // got a valid escaped =. append it. |
985 | lexPushLookaheadc(next[0]); | 1014 | lexSkipLookahead(); // skip second 0-9A-F |
986 | lexAppendc('='); | 1015 | lexAppendc(cur); |
987 | } else { | 1016 | } else { |
988 | lexAppendc(c); | 1017 | lexSkipLookahead(); // skip whatever we just read. |
1018 | lexAppendc(c); // and append it. | ||
989 | } | 1019 | } |
990 | break; | 1020 | c = lexLookahead(); |
991 | } /* '=' */ | ||
992 | case '\n': { | ||
993 | lexPushLookaheadc('\n'); | ||
994 | goto EndString; | ||
995 | } | 1021 | } |
996 | case (int)EOF: | ||
997 | break; | ||
998 | default: | ||
999 | lexAppendc(cur); | ||
1000 | break; | ||
1001 | } /* switch */ | ||
1002 | } while (cur != (int)EOF); | ||
1003 | |||
1004 | EndString: | ||
1005 | lexAppendc(0); | 1022 | lexAppendc(0); |
1006 | return lexStr(); | 1023 | return c==EOF?0:lexStr(); |
1007 | } /* LexQuotedPrintable */ | 1024 | } |
1008 | 1025 | ||
1009 | static int yylex() { | 1026 | static int yylex() { |
@@ -1012,5 +1029,5 @@ static int yylex() { | |||
1012 | if (lexmode == L_VALUES) { | 1029 | if (lexmode == L_VALUES) { |
1013 | int c = lexGetc(); | 1030 | int c = lexGetc(); |
1014 | if (c == ';') { | 1031 | if (c == ';' && fieldedProp) { |
1015 | DBG_(("db: SEMICOLON\n")); | 1032 | DBG_(("db: SEMICOLON\n")); |
1016 | lexPushLookaheadc(c); | 1033 | lexPushLookaheadc(c); |
@@ -1066,4 +1083,5 @@ static int yylex() { | |||
1066 | /* consume all line separator(s) adjacent to each other */ | 1083 | /* consume all line separator(s) adjacent to each other */ |
1067 | /* ignoring linesep immediately after colon. */ | 1084 | /* ignoring linesep immediately after colon. */ |
1085 | /* I don't see this in the spec, and it breaks null values -- WA | ||
1068 | c = lexLookahead(); | 1086 | c = lexLookahead(); |
1069 | while (strchr("\n",c)) { | 1087 | while (strchr("\n",c)) { |
@@ -1072,4 +1090,5 @@ static int yylex() { | |||
1072 | ++mime_lineNum; | 1090 | ++mime_lineNum; |
1073 | } | 1091 | } |
1092 | */ | ||
1074 | DBG_(("db: COLON\n")); | 1093 | DBG_(("db: COLON\n")); |
1075 | return COLON; | 1094 | return COLON; |
@@ -1218,5 +1237,5 @@ void mime_error_(char *s) | |||
1218 | } | 1237 | } |
1219 | 1238 | ||
1220 | #line 1221 "y.tab.c" | 1239 | #line 1240 "y.tab.c" |
1221 | #define YYABORT goto yyabort | 1240 | #define YYABORT goto yyabort |
1222 | #define YYREJECT goto yyabort | 1241 | #define YYREJECT goto yyabort |
@@ -1518,5 +1537,5 @@ case 45: | |||
1518 | } | 1537 | } |
1519 | break; | 1538 | break; |
1520 | #line 1521 "y.tab.c" | 1539 | #line 1540 "y.tab.c" |
1521 | } | 1540 | } |
1522 | yyssp -= yym; | 1541 | yyssp -= yym; |