Release 970824
[wine] / misc / ole2disp.c
1 /*
2  *      OLE2DISP library
3  *
4  *      Copyright 1995  Martin von Loewis
5  */
6
7 #include "windows.h"
8 #include "ole2.h"
9 #include "heap.h"
10 #include "ldt.h"
11 #include "stddebug.h"
12 #include "debug.h"
13
14 /* This implementation of the BSTR API is 16-bit only. It
15    represents BSTR as a 16:16 far pointer, and the strings
16    as ISO-8859 */
17
18 typedef DWORD   BSTR;
19
20 static BSTR BSTR_AllocBytes(int n)
21 {
22     void *ptr = SEGPTR_ALLOC(n);
23     return SEGPTR_GET(ptr);
24 }
25
26 static void BSTR_Free(BSTR in)
27 {
28     SEGPTR_FREE( PTR_SEG_TO_LIN(in) );
29 }
30
31 static void* BSTR_GetAddr(BSTR in)
32 {
33     return in ? PTR_SEG_TO_LIN(in) : 0;
34 }
35
36 /***********************************************************************
37  *           SysAllocString         [OLE2DISP.2]
38  */
39 BSTR WINAPI SysAllocString(char *in)
40 {
41         BSTR out=BSTR_AllocBytes(strlen(in)+1);
42         if(!out)return 0;
43         strcpy(BSTR_GetAddr(out),in);
44         return out;
45 }
46
47 /***********************************************************************
48  *           SysReAllocString       [OLE2DISP.3]
49  */
50 int WINAPI SysReAllocString(BSTR *old,char *in)
51 {
52         BSTR new=SysAllocString(in);
53         BSTR_Free(*old);
54         *old=new;
55         return 1;
56 }
57
58 /***********************************************************************
59  *           SysAllocStringLen      [OLE2DISP.4]
60  */
61 BSTR WINAPI SysAllocStringLen(char *in, int len)
62 {
63         BSTR out=BSTR_AllocBytes(len+1);
64         if(!out)return 0;
65         strcpy(BSTR_GetAddr(out),in);
66         return out;
67 }
68
69 /***********************************************************************
70  *           SysReAllocStringLen    [OLE2DISP.5]
71  */
72 int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len)
73 {
74         BSTR new=SysAllocStringLen(in,len);
75         BSTR_Free(*old);
76         *old=new;
77         return 1;
78 }
79
80 /***********************************************************************
81  *           SysFreeString          [OLE2DISP.6]
82  */
83 void WINAPI SysFreeString(BSTR in)
84 {
85         BSTR_Free(in);
86 }
87
88 /***********************************************************************
89  *           SysStringLen           [OLE2DISP.7]
90  */
91 int WINAPI SysStringLen(BSTR str)
92 {
93         return strlen(BSTR_GetAddr(str));
94 }