summaryrefslogtreecommitdiff
path: root/library/backend/vcc_yacc.cpp
Unidiff
Diffstat (limited to 'library/backend/vcc_yacc.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/vcc_yacc.cpp33
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
456static void enterProps(const char *s) 456static 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
462static void enterAttr(const char *s1, const char *s2) 462static 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
827static void finiLex() { 827static 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 */
836static char * lexGetDataFromBase64() 836static 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
937static int match_begin_end_name(int end) { 939static 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
958static char* lexGetQuotedPrintable() 960static 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
1234void mime_error_(char *s) 1233void 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
1246int 1245int
1247#if defined(__STDC__) 1246#if defined(__STDC__)
1248yyparse(void) 1247yyparse(void)
1249#else 1248#else
1250yyparse() 1249yyparse()
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 }
1533break; 1532break;
1534case 45: 1533case 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 }
1540break; 1539break;
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