Diffstat (limited to 'library/backend/vcc_yacc.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | library/backend/vcc_yacc.cpp | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/library/backend/vcc_yacc.cpp b/library/backend/vcc_yacc.cpp index 5f53aef..4006bc2 100644 --- a/library/backend/vcc_yacc.cpp +++ b/library/backend/vcc_yacc.cpp | |||
@@ -452,25 +452,25 @@ static void enterValues(const char *value) | |||
452 | } | 452 | } |
453 | deleteStr(value); | 453 | deleteStr(value); |
454 | } | 454 | } |
455 | 455 | ||
456 | static void enterProps(const char *s) | 456 | static void enterProps(const char *s) |
457 | { | 457 | { |
458 | curProp = addGroup(curObj,s); | 458 | curProp = addGroup(curObj,s); |
459 | deleteStr(s); | 459 | deleteStr(s); |
460 | } | 460 | } |
461 | 461 | ||
462 | static void enterAttr(const char *s1, const char *s2) | 462 | static void enterAttr(const char *s1, const char *s2) |
463 | { | 463 | { |
464 | const char *p1, *p2; | 464 | const char *p1, *p2=0; |
465 | p1 = lookupProp_(s1); | 465 | p1 = lookupProp_(s1); |
466 | if (s2) { | 466 | if (s2) { |
467 | VObject *a; | 467 | VObject *a; |
468 | p2 = lookupProp_(s2); | 468 | p2 = lookupProp_(s2); |
469 | a = addProp(curProp,p1); | 469 | a = addProp(curProp,p1); |
470 | setVObjectStringZValue(a,p2); | 470 | setVObjectStringZValue(a,p2); |
471 | } | 471 | } |
472 | else | 472 | else |
473 | addProp(curProp,p1); | 473 | addProp(curProp,p1); |
474 | if (qstricmp(p1,VCBase64Prop) == 0 || (s2 && qstricmp(p2,VCBase64Prop)==0)) | 474 | if (qstricmp(p1,VCBase64Prop) == 0 || (s2 && qstricmp(p2,VCBase64Prop)==0)) |
475 | lexPushMode(L_BASE64); | 475 | lexPushMode(L_BASE64); |
476 | else if (qstricmp(p1,VCQuotedPrintableProp) == 0 | 476 | else if (qstricmp(p1,VCQuotedPrintableProp) == 0 |
@@ -824,77 +824,79 @@ void initLex(const char *inputstring, unsigned long inputlen, FILE *inputfile) | |||
824 | 824 | ||
825 | } | 825 | } |
826 | 826 | ||
827 | static void finiLex() { | 827 | static void finiLex() { |
828 | free(lexBuf.strs); | 828 | free(lexBuf.strs); |
829 | } | 829 | } |
830 | 830 | ||
831 | 831 | ||
832 | /*-----------------------------------*/ | 832 | /*-----------------------------------*/ |
833 | /* This parses and converts the base64 format for binary encoding into | 833 | /* This parses and converts the base64 format for binary encoding into |
834 | * a decoded buffer (allocated with new). See RFC 1521. | 834 | * a decoded buffer (allocated with new). See RFC 1521. |
835 | */ | 835 | */ |
836 | static char * lexGetDataFromBase64() | 836 | static int lexGetDataFromBase64() |
837 | { | 837 | { |
838 | unsigned long bytesLen = 0, bytesMax = 0; | 838 | unsigned long bytesLen = 0, bytesMax = 0; |
839 | int quadIx = 0, pad = 0; | 839 | int quadIx = 0, pad = 0; |
840 | unsigned long trip = 0; | 840 | unsigned long trip = 0; |
841 | unsigned char b; | 841 | unsigned char b; |
842 | int c; | 842 | int c; |
843 | unsigned char *bytes = NULL; | 843 | unsigned char *bytes = NULL; |
844 | unsigned char *oldBytes = NULL; | 844 | unsigned char *oldBytes = NULL; |
845 | 845 | ||
846 | DBG_(("db: lexGetDataFromBase64\n")); | 846 | DBG_(("db: lexGetDataFromBase64\n")); |
847 | while (1) { | 847 | while (1) { |
848 | c = lexGetc(); | 848 | c = lexGetc(); |
849 | lexSkipWhite(); | ||
849 | if (c == '\n') { | 850 | if (c == '\n') { |
850 | ++mime_lineNum; | 851 | ++mime_lineNum; |
851 | if (lexLookahead() == '\n') { | 852 | if (lexLookahead() == '\n') { |
852 | /* a '\n' character by itself means end of data */ | 853 | /* a '\n' character by itself means end of data */ |
853 | break; | 854 | break; |
854 | } | 855 | } |
855 | else continue; /* ignore '\n' */ | 856 | else continue; /* ignore '\n' */ |
856 | } | 857 | } |
857 | else { | 858 | else { |
858 | if ((c >= 'A') && (c <= 'Z')) | 859 | if ((c >= 'A') && (c <= 'Z')) |
859 | b = (unsigned char)(c - 'A'); | 860 | b = (unsigned char)(c - 'A'); |
860 | else if ((c >= 'a') && (c <= 'z')) | 861 | else if ((c >= 'a') && (c <= 'z')) |
861 | b = (unsigned char)(c - 'a') + 26; | 862 | b = (unsigned char)(c - 'a') + 26; |
862 | else if ((c >= '0') && (c <= '9')) | 863 | else if ((c >= '0') && (c <= '9')) |
863 | b = (unsigned char)(c - '0') + 52; | 864 | b = (unsigned char)(c - '0') + 52; |
864 | else if (c == '+') | 865 | else if (c == '+') |
865 | b = 62; | 866 | b = 62; |
866 | else if (c == '/') | 867 | else if (c == '/') |
867 | b = 63; | 868 | b = 63; |
868 | else if (c == '=') { | 869 | else if (c == '=') { |
869 | b = 0; | 870 | b = 0; |
870 | pad++; | 871 | pad++; |
871 | } else if ((c == ' ') || (c == '\t')) { | ||
872 | continue; | ||
873 | } else { /* error condition */ | 872 | } else { /* error condition */ |
874 | if (bytes) free(bytes); | 873 | if (bytes) free(bytes); |
875 | else if (oldBytes) free(oldBytes); | 874 | else if (oldBytes) free(oldBytes); |
876 | // error recovery: skip until 2 adjacent newlines. | 875 | // error recovery: skip until 2 adjacent newlines. |
877 | DBG_(("db: invalid character 0x%x '%c'\n", c,c)); | 876 | DBG_(("db: invalid character 0x%x '%c'\n", c,c)); |
878 | if (c != EOF) { | 877 | if (c != EOF) { |
879 | c = lexGetc(); | 878 | c = lexGetc(); |
880 | while (c != EOF) { | 879 | while (c != EOF) { |
881 | if (c == '\n' && lexLookahead() == '\n') { | 880 | if (c == '\n') { |
882 | ++mime_lineNum; | 881 | lexSkipWhite(); |
883 | break; | 882 | if(lexLookahead() == '\n') { |
883 | ++mime_lineNum; | ||
884 | break; | ||
885 | } | ||
884 | } | 886 | } |
885 | c = lexGetc(); | 887 | c = lexGetc(); |
886 | } | 888 | } |
887 | } | 889 | } |
888 | return NULL; | 890 | return c != EOF; |
889 | } | 891 | } |
890 | trip = (trip << 6) | b; | 892 | trip = (trip << 6) | b; |
891 | if (++quadIx == 4) { | 893 | if (++quadIx == 4) { |
892 | unsigned char outBytes[3]; | 894 | unsigned char outBytes[3]; |
893 | int numOut; | 895 | int numOut; |
894 | int i; | 896 | int i; |
895 | for (i = 0; i < 3; i++) { | 897 | for (i = 0; i < 3; i++) { |
896 | outBytes[2-i] = (unsigned char)(trip & 0xFF); | 898 | outBytes[2-i] = (unsigned char)(trip & 0xFF); |
897 | trip >>= 8; | 899 | trip >>= 8; |
898 | } | 900 | } |
899 | numOut = 3 - pad; | 901 | numOut = 3 - pad; |
900 | if (bytesLen + numOut > bytesMax) { | 902 | if (bytesLen + numOut > bytesMax) { |
@@ -922,25 +924,25 @@ static char * lexGetDataFromBase64() | |||
922 | } /* while */ | 924 | } /* while */ |
923 | DBG_(("db: bytesLen = %d\n", bytesLen)); | 925 | DBG_(("db: bytesLen = %d\n", bytesLen)); |
924 | /* kludge: all this won't be necessary if we have tree form | 926 | /* kludge: all this won't be necessary if we have tree form |
925 | representation */ | 927 | representation */ |
926 | if (bytes) { | 928 | if (bytes) { |
927 | setValueWithSize(curProp,bytes,(unsigned int)bytesLen); | 929 | setValueWithSize(curProp,bytes,(unsigned int)bytesLen); |
928 | free(bytes); | 930 | free(bytes); |
929 | } | 931 | } |
930 | else if (oldBytes) { | 932 | else if (oldBytes) { |
931 | setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen); | 933 | setValueWithSize(curProp,oldBytes,(unsigned int)bytesLen); |
932 | free(oldBytes); | 934 | free(oldBytes); |
933 | } | 935 | } |
934 | return 0; | 936 | return bytesLen; |
935 | } | 937 | } |
936 | 938 | ||
937 | static int match_begin_end_name(int end) { | 939 | static int match_begin_end_name(int end) { |
938 | int token; | 940 | int token; |
939 | lexSkipWhite(); | 941 | lexSkipWhite(); |
940 | if (lexLookahead() != ':') return ID; | 942 | if (lexLookahead() != ':') return ID; |
941 | lexSkipLookahead(); | 943 | lexSkipLookahead(); |
942 | lexSkipWhite(); | 944 | lexSkipWhite(); |
943 | token = match_begin_name(end); | 945 | token = match_begin_name(end); |
944 | if (token == ID) { | 946 | if (token == ID) { |
945 | lexPushLookaheadc(':'); | 947 | lexPushLookaheadc(':'); |
946 | DBG_(("db: ID '%s'\n", yylval.str)); | 948 | DBG_(("db: ID '%s'\n", yylval.str)); |
@@ -953,25 +955,25 @@ static int match_begin_end_name(int end) { | |||
953 | return token; | 955 | return token; |
954 | } | 956 | } |
955 | return 0; | 957 | return 0; |
956 | } | 958 | } |
957 | 959 | ||
958 | static char* lexGetQuotedPrintable() | 960 | static char* lexGetQuotedPrintable() |
959 | { | 961 | { |
960 | int c; | 962 | int c; |
961 | lexSkipWhite(); | 963 | lexSkipWhite(); |
962 | c = lexLookahead(); | 964 | c = lexLookahead(); |
963 | lexClearToken(); | 965 | lexClearToken(); |
964 | 966 | ||
965 | while (c != EOF && c != ';') { | 967 | while (c != EOF && (c != ';' || !fieldedProp)) { |
966 | if (c == '\n') { | 968 | if (c == '\n') { |
967 | // break, leave '\n' on remaining chars. | 969 | // break, leave '\n' on remaining chars. |
968 | break; | 970 | break; |
969 | } else if (c == '=') { | 971 | } else if (c == '=') { |
970 | int cur = 0; | 972 | int cur = 0; |
971 | int next; | 973 | int next; |
972 | 974 | ||
973 | lexSkipLookahead(); // skip '=' | 975 | lexSkipLookahead(); // skip '=' |
974 | next = lexLookahead(); | 976 | next = lexLookahead(); |
975 | 977 | ||
976 | if (next == '\n') { | 978 | if (next == '\n') { |
977 | // skip and only skip the \n | 979 | // skip and only skip the \n |
@@ -1043,29 +1045,26 @@ static int yylex() { | |||
1043 | lexSkipLookahead(); | 1045 | lexSkipLookahead(); |
1044 | c = lexLookahead(); | 1046 | c = lexLookahead(); |
1045 | ++mime_lineNum; | 1047 | ++mime_lineNum; |
1046 | } | 1048 | } |
1047 | DBG_(("db: LINESEP\n")); | 1049 | DBG_(("db: LINESEP\n")); |
1048 | return LINESEP; | 1050 | return LINESEP; |
1049 | } | 1051 | } |
1050 | else { | 1052 | else { |
1051 | char *p = 0; | 1053 | char *p = 0; |
1052 | lexPushLookaheadc(c); | 1054 | lexPushLookaheadc(c); |
1053 | if (lexWithinMode(L_BASE64)) { | 1055 | if (lexWithinMode(L_BASE64)) { |
1054 | /* get each char and convert to bin on the fly... */ | 1056 | /* get each char and convert to bin on the fly... */ |
1055 | p = lexGetDataFromBase64(); | 1057 | yylval.str = NULL; |
1056 | #if 0 | 1058 | return lexGetDataFromBase64() ? STRING : 0; |
1057 | yylval.str = p; | ||
1058 | return STRING; | ||
1059 | #endif | ||
1060 | } | 1059 | } |
1061 | else if (lexWithinMode(L_QUOTED_PRINTABLE)) { | 1060 | else if (lexWithinMode(L_QUOTED_PRINTABLE)) { |
1062 | p = lexGetQuotedPrintable(); | 1061 | p = lexGetQuotedPrintable(); |
1063 | } | 1062 | } |
1064 | else { | 1063 | else { |
1065 | #ifdef _SUPPORT_LINE_FOLDING | 1064 | #ifdef _SUPPORT_LINE_FOLDING |
1066 | p = lexGet1Value(); | 1065 | p = lexGet1Value(); |
1067 | #else | 1066 | #else |
1068 | p = lexGetStrUntil(";\n"); | 1067 | p = lexGetStrUntil(";\n"); |
1069 | #endif | 1068 | #endif |
1070 | } | 1069 | } |
1071 | if (p) { | 1070 | if (p) { |
@@ -1229,25 +1228,25 @@ void mime_error(char *s) | |||
1229 | sprintf(msg,"%s at line %d", s, mime_lineNum); | 1228 | sprintf(msg,"%s at line %d", s, mime_lineNum); |
1230 | mimeErrorHandler(msg); | 1229 | mimeErrorHandler(msg); |
1231 | } | 1230 | } |
1232 | } | 1231 | } |
1233 | 1232 | ||
1234 | void mime_error_(char *s) | 1233 | void mime_error_(char *s) |
1235 | { | 1234 | { |
1236 | if (mimeErrorHandler) { | 1235 | if (mimeErrorHandler) { |
1237 | mimeErrorHandler(s); | 1236 | mimeErrorHandler(s); |
1238 | } | 1237 | } |
1239 | } | 1238 | } |
1240 | 1239 | ||
1241 | #line 1240 "y.tab.c" | 1240 | #line 1241 "y.tab.c" |
1242 | #define YYABORT goto yyabort | 1241 | #define YYABORT goto yyabort |
1243 | #define YYREJECT goto yyabort | 1242 | #define YYREJECT goto yyabort |
1244 | #define YYACCEPT goto yyaccept | 1243 | #define YYACCEPT goto yyaccept |
1245 | #define YYERROR goto yyerrlab | 1244 | #define YYERROR goto yyerrlab |
1246 | int | 1245 | int |
1247 | #if defined(__STDC__) | 1246 | #if defined(__STDC__) |
1248 | yyparse(void) | 1247 | yyparse(void) |
1249 | #else | 1248 | #else |
1250 | yyparse() | 1249 | yyparse() |
1251 | #endif | 1250 | #endif |
1252 | { | 1251 | { |
1253 | register int yym, yyn, yystate; | 1252 | register int yym, yyn, yystate; |
@@ -1529,25 +1528,25 @@ case 44: | |||
1529 | { | 1528 | { |
1530 | lexPushMode(L_VTODO); | 1529 | lexPushMode(L_VTODO); |
1531 | if (!pushVObject(VCTodoProp)) YYERROR; | 1530 | if (!pushVObject(VCTodoProp)) YYERROR; |
1532 | } | 1531 | } |
1533 | break; | 1532 | break; |
1534 | case 45: | 1533 | case 45: |
1535 | #line 376 "backend/vcc.y" | 1534 | #line 376 "backend/vcc.y" |
1536 | { | 1535 | { |
1537 | lexPopMode(0); | 1536 | lexPopMode(0); |
1538 | popVObject(); | 1537 | popVObject(); |
1539 | } | 1538 | } |
1540 | break; | 1539 | break; |
1541 | #line 1540 "y.tab.c" | 1540 | #line 1541 "y.tab.c" |
1542 | } | 1541 | } |
1543 | yyssp -= yym; | 1542 | yyssp -= yym; |
1544 | yystate = *yyssp; | 1543 | yystate = *yyssp; |
1545 | yyvsp -= yym; | 1544 | yyvsp -= yym; |
1546 | yym = yylhs[yyn]; | 1545 | yym = yylhs[yyn]; |
1547 | if (yystate == 0 && yym == 0) | 1546 | if (yystate == 0 && yym == 0) |
1548 | { | 1547 | { |
1549 | #if YYDEBUG | 1548 | #if YYDEBUG |
1550 | if (yydebug) | 1549 | if (yydebug) |
1551 | printf("%sdebug: after reduction, shifting from state 0 to\ | 1550 | printf("%sdebug: after reduction, shifting from state 0 to\ |
1552 | state %d\n", YYPREFIX, YYFINAL); | 1551 | state %d\n", YYPREFIX, YYFINAL); |
1553 | #endif | 1552 | #endif |