ReactOS  0.4.14-dev-384-g5b37caa
string.c
Go to the documentation of this file.
1 /*
2  * RichEdit - string operations
3  *
4  * Copyright 2004 by Krzysztof Foltman
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include "editor.h"
22 
24 
25 static int ME_GetOptimalBuffer(int nLen)
26 {
27  return ((sizeof(WCHAR) * nLen) + 128) & ~63;
28 }
29 
30 static ME_String *make_string( void (*free)(ME_String *) )
31 {
32  ME_String *s = heap_alloc( sizeof(*s) );
33 
34  if (s) s->free = free;
35  return s;
36 }
37 
38 /* Create a ME_String using the const string provided.
39  * str must exist for the lifetime of the returned ME_String.
40  */
42 {
44  if (!s) return NULL;
45 
46  s->szData = (WCHAR *)str;
47  s->nLen = len;
48  s->nBuffer = 0;
49  return s;
50 }
51 
53 {
54  heap_free( s->szData );
55 }
56 
57 /* Create a buffer (uninitialized string) of size nMaxChars */
59 {
61 
62  if (!s) return NULL;
63  s->nLen = nMaxChars;
64  s->nBuffer = ME_GetOptimalBuffer(s->nLen + 1);
65  s->szData = heap_alloc( s->nBuffer * sizeof(WCHAR) );
66  if (!s->szData)
67  {
68  heap_free( s );
69  return NULL;
70  }
71  s->szData[s->nLen] = 0;
72  return s;
73 }
74 
76 {
77  ME_String *s = ME_MakeStringEmpty(nMaxChars);
78 
79  if (!s) return NULL;
80  memcpy(s->szData, szText, s->nLen * sizeof(WCHAR));
81  return s;
82 }
83 
84 /* Make a string by repeating a char nMaxChars times */
85 ME_String *ME_MakeStringR(WCHAR cRepeat, int nMaxChars)
86 {
87  int i;
88  ME_String *s = ME_MakeStringEmpty(nMaxChars);
89 
90  if (!s) return NULL;
91  for (i = 0; i < nMaxChars; i++)
92  s->szData[i] = cRepeat;
93  return s;
94 }
95 
97 {
98  if (!s) return;
99  if (s->free) s->free( s );
100  heap_free( s );
101 }
102 
103 BOOL ME_InsertString(ME_String *s, int ofs, const WCHAR *insert, int len)
104 {
105  DWORD new_len = s->nLen + len + 1;
106  WCHAR *new;
107 
108  assert( s->nBuffer ); /* Not a const string */
109  assert( ofs <= s->nLen );
110 
111  if( new_len > s->nBuffer )
112  {
113  s->nBuffer = ME_GetOptimalBuffer( new_len );
114  new = heap_realloc( s->szData, s->nBuffer * sizeof(WCHAR) );
115  if (!new) return FALSE;
116  s->szData = new;
117  }
118 
119  memmove( s->szData + ofs + len, s->szData + ofs, (s->nLen - ofs + 1) * sizeof(WCHAR) );
120  memcpy( s->szData + ofs, insert, len * sizeof(WCHAR) );
121  s->nLen += len;
122 
123  return TRUE;
124 }
125 
127 {
128  return ME_InsertString( s, s->nLen, append, len );
129 }
130 
131 ME_String *ME_VSplitString(ME_String *orig, int charidx)
132 {
133  ME_String *s;
134 
135  assert(orig->nBuffer); /* Not a const string */
136  assert(charidx>=0);
137  assert(charidx<=orig->nLen);
138 
139  s = ME_MakeStringN(orig->szData+charidx, orig->nLen-charidx);
140  if (!s) return NULL;
141 
142  orig->nLen = charidx;
143  orig->szData[charidx] = '\0';
144  return s;
145 }
146 
147 void ME_StrDeleteV(ME_String *s, int nVChar, int nChars)
148 {
149  int end_ofs = nVChar + nChars;
150 
151  assert(s->nBuffer); /* Not a const string */
152  assert(nChars >= 0);
153  assert(nVChar >= 0);
154  assert(end_ofs <= s->nLen);
155 
156  memmove(s->szData + nVChar, s->szData + end_ofs,
157  (s->nLen - end_ofs + 1) * sizeof(WCHAR));
158  s->nLen -= nChars;
159 }
160 
161 static int
163 {
164  /* FIXME: Native also knows about punctuation */
165  TRACE("s==%s, start==%d, len==%d, code==%d\n",
166  debugstr_wn(s, len), start, len, code);
167 
168  switch (code)
169  {
170  case WB_ISDELIMITER:
171  return ME_IsWSpace(s[start]);
172  case WB_LEFT:
173  case WB_MOVEWORDLEFT:
174  while (start && ME_IsWSpace(s[start - 1]))
175  start--;
176  while (start && !ME_IsWSpace(s[start - 1]))
177  start--;
178  return start;
179  case WB_RIGHT:
180  case WB_MOVEWORDRIGHT:
181  while (start < len && !ME_IsWSpace(s[start]))
182  start++;
183  while (start < len && ME_IsWSpace(s[start]))
184  start++;
185  return start;
186  }
187  return 0;
188 }
189 
190 
191 int
193 {
194  if (!editor->pfnWordBreak) {
195  return ME_WordBreakProc(str, start, len, code);
196  } else if (!editor->bEmulateVersion10) {
197  /* MSDN lied about the third parameter for EditWordBreakProc being the number
198  * of characters, it is actually the number of bytes of the string. */
199  return editor->pfnWordBreak(str, start, len * sizeof(WCHAR), code);
200  } else {
201  int result;
203  NULL, 0, NULL, NULL);
204  char *buffer = heap_alloc(buffer_size);
205  if (!buffer) return 0;
209  heap_free(buffer);
210  return result;
211  }
212 }
213 
215 {
216  *len = 0;
217  if (!psz) return NULL;
218 
219  if (codepage == CP_UNICODE)
220  {
221  *len = lstrlenW(psz);
222  return psz;
223  }
224  else {
225  WCHAR *tmp;
226  int nChars = MultiByteToWideChar(codepage, 0, psz, -1, NULL, 0);
227 
228  if(!nChars) return NULL;
229 
230  if((tmp = heap_alloc( nChars * sizeof(WCHAR) )) != NULL)
231  *len = MultiByteToWideChar(codepage, 0, psz, -1, tmp, nChars) - 1;
232  return tmp;
233  }
234 }
235 
237 {
238  if (codepage != CP_UNICODE)
239  heap_free( psz );
240 }
#define WB_RIGHT
Definition: winuser.h:551
#define memmove(s1, s2, n)
Definition: mkisofs.h:881
#define WB_ISDELIMITER
Definition: winuser.h:549
static void heap_string_free(ME_String *s)
Definition: string.c:52
#define TRUE
Definition: types.h:120
int nBuffer
Definition: editstr.h:61
void ME_EndToUnicode(LONG codepage, LPVOID psz)
Definition: string.c:236
WCHAR * szData
Definition: editstr.h:60
static int ME_GetOptimalBuffer(int nLen)
Definition: string.c:25
#define WideCharToMultiByte
Definition: compat.h:101
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
void ME_StrDeleteV(ME_String *s, int nVChar, int nChars)
Definition: string.c:147
#define CP_ACP
Definition: compat.h:99
ME_String * ME_MakeStringR(WCHAR cRepeat, int nMaxChars)
Definition: string.c:85
#define free
Definition: debug_ros.c:5
ME_String * ME_MakeStringN(LPCWSTR szText, int nMaxChars)
Definition: string.c:75
#define assert(x)
Definition: debug.h:53
GLuint buffer
Definition: glext.h:5915
static int insert
Definition: xmllint.c:144
static void append(struct dump_context *dc, const void *data, unsigned size)
Definition: minidump.c:380
#define WB_MOVEWORDLEFT
Definition: richedit.h:1000
#define lstrlenW
Definition: compat.h:415
int32_t INT
Definition: typedefs.h:56
#define WB_LEFT
Definition: winuser.h:550
static void * heap_realloc(void *mem, size_t len)
Definition: appwiz.h:70
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
LPWSTR ME_ToUnicode(LONG codepage, LPVOID psz, INT *len)
Definition: string.c:214
static int ME_WordBreakProc(LPWSTR s, INT start, INT len, INT code)
Definition: string.c:162
ME_String * ME_MakeStringConst(const WCHAR *str, int len)
Definition: string.c:41
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const WCHAR szText[]
Definition: dialog.c:139
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
int codepage
Definition: win_iconv.c:156
static void buffer_size(GLcontext *ctx, GLuint *width, GLuint *height)
Definition: swimpl.c:927
void ME_DestroyString(ME_String *s)
Definition: string.c:96
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
int nLen
Definition: editstr.h:61
BOOL ME_InsertString(ME_String *s, int ofs, const WCHAR *insert, int len)
Definition: string.c:103
#define TRACE(s)
Definition: solgame.cpp:4
__wchar_t WCHAR
Definition: xmlstorage.h:180
WINE_DEFAULT_DEBUG_CHANNEL(commctrl)
unsigned long DWORD
Definition: ntddk_ex.h:95
int ME_CallWordBreakProc(ME_TextEditor *editor, WCHAR *str, INT len, INT start, INT code)
Definition: string.c:192
static size_t len
Definition: string.c:60
ME_String * ME_MakeStringEmpty(int nMaxChars)
Definition: string.c:58
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
GLdouble s
Definition: gl.h:2039
ME_String * ME_VSplitString(ME_String *orig, int charidx)
Definition: string.c:131
#define debugstr_wn
Definition: kernel32.h:33
BOOL bEmulateVersion10
Definition: editstr.h:389
static int ME_IsWSpace(WCHAR ch)
Definition: editor.h:103
GLuint start
Definition: gl.h:1545
BOOL ME_AppendString(ME_String *s, const WCHAR *append, int len)
Definition: string.c:126
#define WB_MOVEWORDRIGHT
Definition: richedit.h:1002
#define MultiByteToWideChar
Definition: compat.h:100
static ME_String * make_string(void(*free)(ME_String *))
Definition: string.c:30
WCHAR * LPWSTR
Definition: xmlstorage.h:184
GLuint64EXT * result
Definition: glext.h:11304
#define CP_UNICODE
Definition: stg_prop.c:74
EDITWORDBREAKPROCW pfnWordBreak
Definition: editstr.h:421
static BOOL heap_free(void *mem)
Definition: appwiz.h:75