blob: 76f6181ed8c6fcd679f9883c59908eb3caf72210 [file] [log] [blame]
Alexandre Julliardded30381995-07-06 17:18:27 +00001/*
2 * OLE2DISP library
3 *
4 * Copyright 1995 Martin von Loewis
5 */
6
7#include "windows.h"
8#include "ole2.h"
Alexandre Julliardca22b331996-07-12 19:02:39 +00009#include "heap.h"
Alexandre Julliardded30381995-07-06 17:18:27 +000010#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
18typedef DWORD BSTR;
Alexandre Julliardded30381995-07-06 17:18:27 +000019
20static BSTR BSTR_AllocBytes(int n)
21{
Alexandre Julliardca22b331996-07-12 19:02:39 +000022 void *ptr = SEGPTR_ALLOC(n);
23 return SEGPTR_GET(ptr);
Alexandre Julliardded30381995-07-06 17:18:27 +000024}
25
26static void BSTR_Free(BSTR in)
27{
Alexandre Julliardca22b331996-07-12 19:02:39 +000028 SEGPTR_FREE( PTR_SEG_TO_LIN(in) );
Alexandre Julliardded30381995-07-06 17:18:27 +000029}
30
31static void* BSTR_GetAddr(BSTR in)
32{
Alexandre Julliardca22b331996-07-12 19:02:39 +000033 return in ? PTR_SEG_TO_LIN(in) : 0;
Alexandre Julliardded30381995-07-06 17:18:27 +000034}
35
36/***********************************************************************
37 * SysAllocString [OLE2DISP.2]
38 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000039BSTR WINAPI SysAllocString(char *in)
Alexandre Julliardded30381995-07-06 17:18:27 +000040{
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 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000050int WINAPI SysReAllocString(BSTR *old,char *in)
Alexandre Julliardded30381995-07-06 17:18:27 +000051{
52 BSTR new=SysAllocString(in);
53 BSTR_Free(*old);
54 *old=new;
55 return 1;
56}
57
58/***********************************************************************
59 * SysAllocStringLen [OLE2DISP.4]
60 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000061BSTR WINAPI SysAllocStringLen(char *in, int len)
Alexandre Julliardded30381995-07-06 17:18:27 +000062{
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 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000072int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len)
Alexandre Julliardded30381995-07-06 17:18:27 +000073{
74 BSTR new=SysAllocStringLen(in,len);
75 BSTR_Free(*old);
76 *old=new;
77 return 1;
78}
79
80/***********************************************************************
81 * SysFreeString [OLE2DISP.6]
82 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000083void WINAPI SysFreeString(BSTR in)
Alexandre Julliardded30381995-07-06 17:18:27 +000084{
85 BSTR_Free(in);
86}
87
88/***********************************************************************
89 * SysStringLen [OLE2DISP.7]
90 */
Alexandre Julliard670cdc41997-08-24 16:00:30 +000091int WINAPI SysStringLen(BSTR str)
Alexandre Julliardded30381995-07-06 17:18:27 +000092{
93 return strlen(BSTR_GetAddr(str));
94}