The richedit input stream can be either RTF or plain text, depending upon a flag with the EM_STREAMIN message. This patch basically bypasses all the token formatting when the stream is plain text. It fixes Actel Designer (FPGA design software). I was rather surprised to see the use of global variables here, but I followed the pattern and added one more while cringing. Changelog: Add richedit support for a plain text stream.
Index: dlls/richedit/reader.c =================================================================== RCS file: /home/wine/wine/dlls/richedit/reader.c,v retrieving revision 1.7 diff -u -r1.7 reader.c --- dlls/richedit/reader.c 31 May 2002 23:25:51 -0000 1.7 +++ dlls/richedit/reader.c 7 Jul 2002 16:18:18 -0000 @@ -123,6 +123,7 @@ int rtfMajor; int rtfMinor; int rtfParam; +int rtfFormat; char *rtfTextBuf = (char *) NULL; int rtfTextLen; @@ -540,9 +541,8 @@ (*p) (); /* give read hook a look at token */ /* Silently discard newlines, carriage returns, nulls. */ - if (!(rtfClass == rtfText - && (rtfMajor == '\n' || rtfMajor == '\r' - || rtfMajor == '\0'))) + if (!(rtfClass == rtfText && rtfFormat != SF_TEXT + && (rtfMajor == '\r' || rtfMajor == '\n' || rtfMajor == '\0'))) break; } return (rtfClass); @@ -604,6 +604,18 @@ TRACE("\n"); + if (rtfFormat == SF_TEXT) { + rtfMajor = GetChar (); + rtfMinor = rtfSC_nothing; + rtfParam = rtfNoParam; + rtfTextBuf[rtfTextLen = 0] = '\0'; + if (rtfMajor == EOF) + rtfClass = rtfEOF; + else + rtfClass = rtfText; + return; + } + /* first check for pushed token from RTFUngetToken() */ if (pushedClass >= 0) Index: dlls/richedit/richedit.c =================================================================== RCS file: /home/wine/wine/dlls/richedit/richedit.c,v retrieving revision 1.20 diff -u -r1.20 richedit.c --- dlls/richedit/richedit.c 31 May 2002 23:25:51 -0000 1.20 +++ dlls/richedit/richedit.c 7 Jul 2002 16:18:18 -0000 @@ -175,6 +175,7 @@ /* setup the RTF parser */ RTFSetEditStream(( EDITSTREAM*)lParam); + rtfFormat = wParam&(SF_TEXT|SF_RTF); WriterInit(); RTFInit (); BeginFile(); Index: dlls/richedit/text-writer.c =================================================================== RCS file: /home/wine/wine/dlls/richedit/text-writer.c,v retrieving revision 1.4 diff -u -r1.4 text-writer.c --- dlls/richedit/text-writer.c 31 May 2002 23:25:51 -0000 1.4 +++ dlls/richedit/text-writer.c 7 Jul 2002 16:18:18 -0000 @@ -124,8 +124,10 @@ char buf[rtfBufSiz]; TRACE("\n"); - - if (rtfMinor != rtfSC_nothing) + + if (rtfFormat == SF_TEXT) + PutLitChar (rtfMajor); + else if (rtfMinor != rtfSC_nothing) PutStdChar (rtfMinor); else { Index: dlls/richedit/rtf.h =================================================================== RCS file: /home/wine/wine/dlls/richedit/rtf.h,v retrieving revision 1.3 diff -u -r1.3 rtf.h --- dlls/richedit/rtf.h 19 Dec 2000 04:53:20 -0000 1.3 +++ dlls/richedit/rtf.h 7 Jul 2002 16:18:19 -0000 @@ -432,6 +432,7 @@ extern int rtfMajor; /* token major number */ extern int rtfMinor; /* token minor number */ extern int rtfParam; /* control symbol parameter */ +extern int rtfFormat; /* either SF_RTF or SF_TEXT */ # ifdef THINK_C # define rtfNoParam (-32768) /* 16-bit max. neg. value */