Added support for backslash escaping of special characters.
[wine.git] / dlls / imm32 / memory.c
blob991aeaf240dd9592bd19c5f90688f1b330e22f10
1 /*
2 * This file implements 'moveable' memory block.
4 * Copyright 2000 Hidenori Takeshima
5 */
7 #include "config.h"
9 #include "winbase.h"
10 #include "windef.h"
11 #include "wingdi.h"
12 #include "winuser.h"
13 #include "winerror.h"
14 #include "immddk.h"
15 #include "debugtools.h"
16 DEFAULT_DEBUG_CHANNEL(imm);
18 #include "imm_private.h"
20 #define IMM32_MOVEABLEMEM_LOCK_MAX ((DWORD)0xffffffff)
22 struct IMM32_tagMOVEABLEMEM
24 DWORD dwLockCount;
25 DWORD dwSize;
26 LPVOID lpvMem;
29 IMM32_MOVEABLEMEM* IMM32_MoveableAlloc( DWORD dwHeapFlags, DWORD dwHeapSize )
31 IMM32_MOVEABLEMEM* lpMoveable;
33 lpMoveable = (IMM32_MOVEABLEMEM*)
34 IMM32_HeapAlloc( 0, sizeof( IMM32_MOVEABLEMEM ) );
35 if ( lpMoveable != NULL )
37 lpMoveable->dwLockCount = 0;
38 lpMoveable->dwSize = dwHeapSize;
39 lpMoveable->lpvMem = NULL;
41 if ( dwHeapSize > 0 )
43 lpMoveable->lpvMem =
44 IMM32_HeapAlloc( dwHeapFlags, dwHeapSize );
45 if ( lpMoveable->lpvMem == NULL )
47 IMM32_HeapFree( lpMoveable );
48 lpMoveable = NULL;
53 return lpMoveable;
56 void IMM32_MoveableFree( IMM32_MOVEABLEMEM* lpMoveable )
58 IMM32_HeapFree( lpMoveable->lpvMem );
59 IMM32_HeapFree( lpMoveable );
62 BOOL IMM32_MoveableReAlloc( IMM32_MOVEABLEMEM* lpMoveable,
63 DWORD dwHeapFlags, DWORD dwHeapSize )
65 LPVOID lpv;
67 if ( dwHeapSize > 0 )
69 if ( lpMoveable->dwLockCount > 0 )
70 dwHeapFlags |= HEAP_REALLOC_IN_PLACE_ONLY;
71 lpv = IMM32_HeapReAlloc( dwHeapFlags,
72 lpMoveable->lpvMem, dwHeapSize );
73 if ( lpv == NULL )
74 return FALSE;
76 else
78 IMM32_HeapFree( lpMoveable->lpvMem );
79 lpv = NULL;
82 lpMoveable->dwSize = dwHeapSize;
83 lpMoveable->lpvMem = lpv;
85 return TRUE;
88 LPVOID IMM32_MoveableLock( IMM32_MOVEABLEMEM* lpMoveable )
90 if ( lpMoveable->dwLockCount == IMM32_MOVEABLEMEM_LOCK_MAX )
92 ERR( "lock count is 0xffffffff." );
94 else
96 lpMoveable->dwLockCount ++;
99 return lpMoveable->lpvMem;
102 BOOL IMM32_MoveableUnlock( IMM32_MOVEABLEMEM* lpMoveable )
104 if ( lpMoveable->dwLockCount == 0 )
105 return FALSE;
107 if ( --lpMoveable->dwLockCount > 0 )
108 return TRUE;
110 return FALSE;
113 DWORD IMM32_MoveableGetLockCount( IMM32_MOVEABLEMEM* lpMoveable )
115 return lpMoveable->dwLockCount;
118 DWORD IMM32_MoveableGetSize( IMM32_MOVEABLEMEM* lpMoveable )
120 return lpMoveable->dwSize;
125 /***********************************************************************
126 * ImmCreateIMCC (IMM32.@)
128 * Create IMCC(IMC Component).
130 HIMCC WINAPI ImmCreateIMCC(DWORD dwSize)
132 IMM32_MOVEABLEMEM* lpMoveable;
134 TRACE("(%lu)\n", dwSize);
136 lpMoveable = IMM32_MoveableAlloc( HEAP_ZERO_MEMORY, dwSize );
137 if ( lpMoveable == NULL )
139 SetLastError(ERROR_OUTOFMEMORY);
140 return (HIMCC)NULL;
143 return (HIMCC)lpMoveable;
146 /***********************************************************************
147 * ImmDestroyIMCC (IMM32.@)
149 * Destroy IMCC(IMC Component).
151 HIMCC WINAPI ImmDestroyIMCC(HIMCC hIMCC)
153 TRACE("(0x%08x)\n", (unsigned)hIMCC);
155 IMM32_MoveableFree( (IMM32_MOVEABLEMEM*)hIMCC );
156 return (HIMCC)NULL;
159 /***********************************************************************
160 * ImmLockIMCC (IMM32.@)
162 LPVOID WINAPI ImmLockIMCC(HIMCC hIMCC)
164 TRACE("(0x%08x)\n", (unsigned)hIMCC);
166 return IMM32_MoveableLock( (IMM32_MOVEABLEMEM*)hIMCC );
169 /***********************************************************************
170 * ImmUnlockIMCC (IMM32.@)
172 BOOL WINAPI ImmUnlockIMCC(HIMCC hIMCC)
174 TRACE("(0x%08x)\n", (unsigned)hIMCC);
176 return IMM32_MoveableUnlock( (IMM32_MOVEABLEMEM*)hIMCC );
179 /***********************************************************************
180 * ImmGetIMCCLockCount (IMM32.@)
182 DWORD WINAPI ImmGetIMCCLockCount(HIMCC hIMCC)
184 TRACE("(0x%08x)\n", (unsigned)hIMCC);
186 return IMM32_MoveableGetLockCount( (IMM32_MOVEABLEMEM*)hIMCC );
189 /***********************************************************************
190 * ImmReSizeIMCC (IMM32.@)
192 HIMCC WINAPI ImmReSizeIMCC(HIMCC hIMCC, DWORD dwSize)
194 TRACE("(0x%08x,%lu)\n", (unsigned)hIMCC, dwSize);
196 if ( !IMM32_MoveableReAlloc( (IMM32_MOVEABLEMEM*)hIMCC,
197 HEAP_ZERO_MEMORY, dwSize ) )
199 SetLastError(ERROR_OUTOFMEMORY);
200 return (HIMCC)NULL;
203 return hIMCC;
206 /***********************************************************************
207 * ImmGetIMCCSize (IMM32.@)
209 DWORD WINAPI ImmGetIMCCSize(HIMCC hIMCC)
211 TRACE("(0x%08x)\n", (unsigned)hIMCC);
213 return IMM32_MoveableGetSize( (IMM32_MOVEABLEMEM*)hIMCC );