Use buffers rather than linked lists for input and out buffers.

Stop reading input at a nul byte.
This commit is contained in:
Mike McCormack 2004-08-27 19:15:08 +00:00 committed by Alexandre Julliard
parent 62bffe46e2
commit f91e582536
7 changed files with 46 additions and 260 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -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;
} }