Use buffers rather than linked lists for input and out buffers.
Stop reading input at a nul byte.
This commit is contained in:
parent
62bffe46e2
commit
f91e582536
|
@ -6,7 +6,6 @@ MODULE = riched32.dll
|
||||||
IMPORTS = user32 kernel32
|
IMPORTS = user32 kernel32
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
charlist.c \
|
|
||||||
reader.c \
|
reader.c \
|
||||||
text-writer.c \
|
text-writer.c \
|
||||||
richedit.c
|
richedit.c
|
||||||
|
|
|
@ -1,130 +0,0 @@
|
||||||
/*
|
|
||||||
*
|
|
||||||
* Character List
|
|
||||||
*
|
|
||||||
* Copyright (c) 2000 by Jean-Claude Batista
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include "charlist.h"
|
|
||||||
#include "windef.h"
|
|
||||||
#include "winbase.h"
|
|
||||||
#include "wine/debug.h"
|
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
|
|
||||||
|
|
||||||
extern HANDLE RICHED32_hHeap;
|
|
||||||
|
|
||||||
void CHARLIST_Enqueue( CHARLIST* pCharList, char myChar )
|
|
||||||
{
|
|
||||||
CHARLISTENTRY* pNewEntry = HeapAlloc(RICHED32_hHeap, 0,sizeof(CHARLISTENTRY));
|
|
||||||
pNewEntry->pNext = NULL;
|
|
||||||
pNewEntry->myChar = myChar;
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
if(pCharList->pTail == NULL)
|
|
||||||
{
|
|
||||||
pCharList->pHead = pCharList->pTail = pNewEntry;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CHARLISTENTRY* pCurrent = pCharList->pTail;
|
|
||||||
pCharList->pTail = pCurrent->pNext = pNewEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
pCharList->nCount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
char CHARLIST_Dequeue(CHARLIST* pCharList)
|
|
||||||
{
|
|
||||||
CHARLISTENTRY* pCurrent;
|
|
||||||
char myChar;
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
if(pCharList->nCount == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
pCharList->nCount--;
|
|
||||||
myChar = pCharList->pHead->myChar;
|
|
||||||
pCurrent = pCharList->pHead->pNext;
|
|
||||||
HeapFree(RICHED32_hHeap, 0,pCharList->pHead);
|
|
||||||
|
|
||||||
if(pCharList->nCount == 0)
|
|
||||||
{
|
|
||||||
pCharList->pHead = pCharList->pTail = NULL;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pCharList->pHead = pCurrent;
|
|
||||||
}
|
|
||||||
|
|
||||||
return myChar;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CHARLIST_GetNbItems(CHARLIST* pCharList)
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
return pCharList->nCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CHARLIST_FreeList(CHARLIST* pCharList){
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
while(pCharList->nCount)
|
|
||||||
CHARLIST_Dequeue(pCharList);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this function counts the number of occurrences of a caracter */
|
|
||||||
int CHARLIST_CountChar(CHARLIST* pCharList, char myChar)
|
|
||||||
{
|
|
||||||
CHARLISTENTRY *pCurrent;
|
|
||||||
int nCount = 0;
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
for(pCurrent =pCharList->pHead ;pCurrent;pCurrent=pCurrent->pNext)
|
|
||||||
if(pCurrent->myChar == myChar)
|
|
||||||
nCount++;
|
|
||||||
|
|
||||||
return nCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
int CHARLIST_toBuffer(CHARLIST* pCharList, char* pBuffer, int nBufferSize)
|
|
||||||
{
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
/* we add one to store a NULL caracter */
|
|
||||||
if(nBufferSize < pCharList->nCount + 1)
|
|
||||||
return pCharList->nCount;
|
|
||||||
|
|
||||||
for(;pCharList->nCount;pBuffer++)
|
|
||||||
*pBuffer = CHARLIST_Dequeue(pCharList);
|
|
||||||
|
|
||||||
*pBuffer = '\0';
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
/*
|
|
||||||
* Character List
|
|
||||||
*
|
|
||||||
* Copyright (c) 2000 by Jean-Claude Batista
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
|
||||||
* License as published by the Free Software Foundation; either
|
|
||||||
* version 2.1 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This library is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
* Lesser General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
|
||||||
* License along with this library; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _CHARLIST
|
|
||||||
#define _CHARLIST
|
|
||||||
|
|
||||||
typedef struct _tagCHARLISTENTRY
|
|
||||||
{
|
|
||||||
struct _tagCHARLISTENTRY *pNext;
|
|
||||||
char myChar;
|
|
||||||
} CHARLISTENTRY;
|
|
||||||
|
|
||||||
typedef struct _tagCHARLIST
|
|
||||||
{
|
|
||||||
unsigned int nCount; /* Entries Count; */
|
|
||||||
CHARLISTENTRY *pHead;
|
|
||||||
CHARLISTENTRY *pTail;
|
|
||||||
} CHARLIST;
|
|
||||||
|
|
||||||
|
|
||||||
void CHARLIST_Enqueue( CHARLIST* pCharList, char myChar);
|
|
||||||
char CHARLIST_Dequeue(CHARLIST* pCharList);
|
|
||||||
int CHARLIST_GetNbItems(CHARLIST* pCharList);
|
|
||||||
void CHARLIST_FreeList(CHARLIST* pCharList);
|
|
||||||
int CHARLIST_CountChar(CHARLIST* pCharList, char myChar);
|
|
||||||
int CHARLIST_toBuffer(CHARLIST* pCharList, char* pBuffer, int nBufferSize);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -80,8 +80,6 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "charlist.h"
|
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
@ -118,28 +116,23 @@ static void ReadCharSetMaps (RTF_Info *);
|
||||||
|
|
||||||
int _RTFGetChar(RTF_Info *info)
|
int _RTFGetChar(RTF_Info *info)
|
||||||
{
|
{
|
||||||
char myChar;
|
int ch;
|
||||||
|
|
||||||
TRACE("\n");
|
TRACE("\n");
|
||||||
|
|
||||||
if(CHARLIST_GetNbItems(&info->inputCharList) == 0)
|
if( info->dwInputSize <= info->dwInputUsed )
|
||||||
{
|
{
|
||||||
char buff[4096];
|
long count = 0;
|
||||||
long pcb;
|
info->editstream.pfnCallback(info->editstream.dwCookie,
|
||||||
info->editstream.pfnCallback(info->editstream.dwCookie, buff, sizeof(buff), &pcb);
|
info->InputBuffer, sizeof(info->InputBuffer), &count);
|
||||||
if(pcb == 0)
|
if(count == 0)
|
||||||
return EOF;
|
return EOF;
|
||||||
else
|
info->dwInputSize = count;
|
||||||
{
|
info->dwInputUsed = 0;
|
||||||
int i;
|
|
||||||
for (i = 0; i < pcb; i++)
|
|
||||||
{
|
|
||||||
CHARLIST_Enqueue(&info->inputCharList, buff[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
myChar = CHARLIST_Dequeue(&info->inputCharList);
|
ch = info->InputBuffer[info->dwInputUsed++];
|
||||||
return (int) myChar;
|
if( !ch ) return EOF;
|
||||||
|
return ch;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RTFSetEditStream(RTF_Info *info, EDITSTREAM *es)
|
void RTFSetEditStream(RTF_Info *info, EDITSTREAM *es)
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "riched32.h"
|
#include "riched32.h"
|
||||||
#include "richedit.h"
|
#include "richedit.h"
|
||||||
#include "charlist.h"
|
|
||||||
#define NO_SHLWAPI_STREAM
|
#define NO_SHLWAPI_STREAM
|
||||||
#include "shlwapi.h"
|
#include "shlwapi.h"
|
||||||
|
|
||||||
|
@ -115,11 +114,9 @@ typedef struct _RTFControl_info
|
||||||
static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||||
LPARAM lParam)
|
LPARAM lParam)
|
||||||
{
|
{
|
||||||
int RTFToBuffer(RTF_Info *parser, char* pBuffer, int nBufferSize);
|
|
||||||
LONG newstyle = 0;
|
LONG newstyle = 0;
|
||||||
LONG style = 0;
|
LONG style = 0;
|
||||||
RTFControl_Info *info;
|
RTFControl_Info *info;
|
||||||
int rtfBufferSize;
|
|
||||||
CHARRANGE *cr;
|
CHARRANGE *cr;
|
||||||
|
|
||||||
info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset );
|
info = (RTFControl_Info *) GetWindowLongW( hwnd, RTFInfoOffset );
|
||||||
|
@ -187,23 +184,17 @@ static LRESULT WINAPI RICHED32_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
|
||||||
/* setup the RTF parser */
|
/* setup the RTF parser */
|
||||||
RTFSetEditStream(info->parser,( EDITSTREAM*)lParam);
|
RTFSetEditStream(info->parser,( EDITSTREAM*)lParam);
|
||||||
info->parser->rtfFormat = wParam&(SF_TEXT|SF_RTF);
|
info->parser->rtfFormat = wParam&(SF_TEXT|SF_RTF);
|
||||||
|
info->parser->hwndEdit = hwnd;
|
||||||
WriterInit(info->parser);
|
WriterInit(info->parser);
|
||||||
RTFInit (info->parser);
|
RTFInit (info->parser);
|
||||||
BeginFile(info->parser);
|
BeginFile(info->parser);
|
||||||
|
|
||||||
/* do the parsing */
|
/* do the parsing */
|
||||||
RTFRead (info->parser);
|
RTFRead (info->parser);
|
||||||
|
RTFFlushOutputBuffer( info->parser );
|
||||||
|
|
||||||
rtfBufferSize = RTFToBuffer(info->parser,NULL, 0);
|
/* put the cursor at the top */
|
||||||
info->rtfBuffer = HeapAlloc(RICHED32_hHeap, 0,rtfBufferSize*sizeof(char));
|
SendMessageA( hwnd, EM_SETSEL, 0, 0 );
|
||||||
if(info->rtfBuffer)
|
|
||||||
{
|
|
||||||
RTFToBuffer(info->parser,info->rtfBuffer, rtfBufferSize);
|
|
||||||
CallWindowProcA(lpfnEditWndProc, hwnd, WM_SETTEXT, 0, (LPARAM)info->rtfBuffer);
|
|
||||||
HeapFree(RICHED32_hHeap, 0,info->rtfBuffer);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
WARN("Not enough memory for a allocating rtfBuffer\n");
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -1374,8 +1374,6 @@ struct RTFStyleElt
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#include "charlist.h"
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return pointer to new element of type t, or NULL
|
* Return pointer to new element of type t, or NULL
|
||||||
* if no memory available.
|
* if no memory available.
|
||||||
|
@ -1444,7 +1442,12 @@ struct _RTF_Info {
|
||||||
char *outputName;
|
char *outputName;
|
||||||
|
|
||||||
EDITSTREAM editstream;
|
EDITSTREAM editstream;
|
||||||
CHARLIST inputCharList ;
|
char InputBuffer[0x1000];
|
||||||
|
DWORD dwInputSize;
|
||||||
|
DWORD dwInputUsed;
|
||||||
|
|
||||||
|
/* edit window to output to */
|
||||||
|
HWND hwndEdit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These arrays are used to map RTF input character values onto the standard
|
* These arrays are used to map RTF input character values onto the standard
|
||||||
|
@ -1493,8 +1496,8 @@ struct _RTF_Info {
|
||||||
|
|
||||||
char *outMap[rtfSC_MaxChar];
|
char *outMap[rtfSC_MaxChar];
|
||||||
|
|
||||||
CHARLIST charlist;
|
DWORD dwOutputCount;
|
||||||
|
char OutputBuffer[0x1000];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1559,6 +1562,7 @@ void RTFSetCharSet( RTF_Info *, int);
|
||||||
void RTFSetOpenLibFileProc ( RTF_Info *, FILE *(*)());
|
void RTFSetOpenLibFileProc ( RTF_Info *, FILE *(*)());
|
||||||
FILE *RTFOpenLibFile ( RTF_Info *, char *, char *);
|
FILE *RTFOpenLibFile ( RTF_Info *, char *, char *);
|
||||||
|
|
||||||
|
void RTFFlushOutputBuffer( RTF_Info *info );
|
||||||
void RTFSetEditStream(RTF_Info *, EDITSTREAM *es);
|
void RTFSetEditStream(RTF_Info *, EDITSTREAM *es);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
|
|
||||||
#include "rtf.h"
|
#include "rtf.h"
|
||||||
#include "rtf2text.h"
|
#include "rtf2text.h"
|
||||||
#include "charlist.h"
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
|
WINE_DEFAULT_DEBUG_CHANNEL(richedit);
|
||||||
|
@ -53,42 +52,6 @@ static void PutStdChar (RTF_Info *info, int stdCode);
|
||||||
static void PutLitChar (RTF_Info *info, int c);
|
static void PutLitChar (RTF_Info *info, int c);
|
||||||
static void PutLitStr (RTF_Info *info, char *s);
|
static void PutLitStr (RTF_Info *info, char *s);
|
||||||
|
|
||||||
#if 0
|
|
||||||
static char *outMap[rtfSC_MaxChar];
|
|
||||||
|
|
||||||
static CHARLIST charlist = {0, NULL, NULL};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*int RTFToBuffer(char* pBuffer, int nBufferSize); */
|
|
||||||
int RTFToBuffer(RTF_Info *info, char* pBuffer, int nBufferSize)
|
|
||||||
{
|
|
||||||
|
|
||||||
/* check if the buffer is big enough to hold all characters */
|
|
||||||
/* we require one more for the '\0' */
|
|
||||||
|
|
||||||
TRACE("\n");
|
|
||||||
|
|
||||||
if(nBufferSize < info->charlist.nCount + 1) {
|
|
||||||
return info->charlist.nCount + CHARLIST_CountChar(&info->charlist, '\n') + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while(info->charlist.nCount)
|
|
||||||
{
|
|
||||||
*pBuffer = CHARLIST_Dequeue(&info->charlist);
|
|
||||||
if(*pBuffer=='\n')
|
|
||||||
{
|
|
||||||
*pBuffer = '\r';
|
|
||||||
pBuffer++;
|
|
||||||
*pBuffer = '\n';
|
|
||||||
}
|
|
||||||
pBuffer++;
|
|
||||||
}
|
|
||||||
*pBuffer = '\0';
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialize the writer.
|
* Initialize the writer.
|
||||||
*/
|
*/
|
||||||
|
@ -277,19 +240,30 @@ void PutStdChar (RTF_Info *info, int stdCode)
|
||||||
PutLitStr (info, oStr);
|
PutLitStr (info, oStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PutLitChar (RTF_Info *info, int c)
|
void PutLitChar (RTF_Info *info, int c)
|
||||||
{
|
{
|
||||||
CHARLIST_Enqueue(&info->charlist, (char) c);
|
if( info->dwOutputCount >= ( sizeof info->OutputBuffer - 1 ) )
|
||||||
/* fputc (c, ostream); */
|
RTFFlushOutputBuffer( info );
|
||||||
|
info->OutputBuffer[info->dwOutputCount++] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RTFFlushOutputBuffer( RTF_Info *info )
|
||||||
static void PutLitStr (RTF_Info *info, char *s)
|
|
||||||
{
|
{
|
||||||
for(;*s;s++)
|
info->OutputBuffer[info->dwOutputCount] = 0;
|
||||||
{
|
SendMessageA( info->hwndEdit, EM_REPLACESEL, FALSE, (LPARAM) info->OutputBuffer );
|
||||||
CHARLIST_Enqueue(&info->charlist, *s);
|
info->dwOutputCount = 0;
|
||||||
}
|
}
|
||||||
/* fputs (s, ostream); */
|
|
||||||
|
static void PutLitStr (RTF_Info *info, char *str )
|
||||||
|
{
|
||||||
|
int len = strlen( str );
|
||||||
|
if( ( len + info->dwOutputCount + 1 ) > sizeof info->OutputBuffer )
|
||||||
|
RTFFlushOutputBuffer( info );
|
||||||
|
if( ( len + 1 ) >= sizeof info->OutputBuffer )
|
||||||
|
{
|
||||||
|
SendMessageA( info->hwndEdit, EM_REPLACESEL, FALSE, (LPARAM) str );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy( &info->OutputBuffer[info->dwOutputCount], str );
|
||||||
|
info->dwOutputCount += len;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue