openoffice osl模块学习1

由“ can i get a char* ,
please?"看起:

Just barely. OO.o has at least six string wrappers, although the C
implementations are of little interest:

  • rtl_String — sal/inc/rtl/string.h
    "Normal" string plus
    reference
    counting. rtlstring->buffer is useful,
    as is rtlstring->length. This object
    encapsulates an generic 8bit string - of unknown encoding. Feel free to
    treat rtlstring->buffer as your
    beloved char *. If you really want to look at the
    implementation of some rtl_String function and lxr nor
    grep can help you, have a look at sal/rtl/source/strtmpl.c.


  • OString — sal/inc/rtl/string.hxx
    Simply a rtl_String
    wrapped inside a class; you can
    use ostring.pData to get at the rtl_String (it‘s
    public). OString has reasonably useful methods for if
    you need them.

  • rtl_uString — sal/inc/rtl/ustring.h
    "Normal" Unicode
    string, similar to rtl_String, and refcounted as well. However, this one
    always comes in UCS-2 encoding, presumably to be compatible with Java‘s
    questionable choices. See rtl_String above to find
    where the implementation of some rtl_uStringfunctions is
    hidden.

  • OUString — sal/inc/rtl/ustring.hxx
    An rtl_uString
    wrapped inside a class. This is what most of the OO.o code
    uses to pass strings around. To convert an OString to
    an OUString it is necessary to specify the character
    set of
    the OString see; sal/inc/rtl/textenc.h —
    the only interesting case is RTL_TEXTENCODING_UTF8

  • String — tools/inc/string.hxx
    This is an obsolete
    string class, aliased to ‘UniString‘. It has a number of limitations such as a
    64k length limit. You can have the buffer with GetBuffer(),
    but it‘s Utf-16 encoded.

A couple of conversion functions are really useful here,
particularly:
rtl::OString aOString = ::rtl::OUStringToOString
(aOUString, RTL_TEXTENCODING_UTF8);
 
And the
reverse:
rtl::OUString aOUString = ::rtl::OStringToOUString
(aOString, RTL_TEXTENCODING_UTF8);

If you just want to programattically print out a string for debugging
purposes you probably want define a macro like :
#define
CHAR_POINTER(THE_OUSTRING) ::rtl::OUStringToOString (THE_OUSTRING,
RTL_TEXTENCODING_UTF8).pData->buffer
 
and use it
like :
printf ( "SvXMLNamespaceMap::AddIfKnown : %s
/ %s\n", CHAR_POINTER(rPrefix), CHAR_POINTER(rName) );

For
the obsolete String class, aliased UniString, it‘s like :
printf (
"rGrfName : %s\n", ByteString( rGrfName,
RTL_TEXTENCODING_UTF8).GetBuffer() );

To print the value of rtl::OUString directly in the debugger, you can
use dbg_dump(). It is intended to be called interactively from
the debugger, in both debug and non-debug builds of OOo. You can see the
definition in sal/rtl/source/debugprint.cxx.

Some code snippets about manipulating those objects can be found on the
codesnippets service page : [1]

原文链接:https://wiki.openoffice.org/wiki/Hacking#Can_I_get_a_char_.2A.2C_please.3F

继续看sal模块源码,摘录:

/********************************************************************************/
/*
Data types
*/

/* Boolean */
typedef unsigned char sal_Bool;
#
define sal_False ((sal_Bool)0)
# define sal_True
((sal_Bool)1)

/* char is assumed to
always be 1 byte long */
typedef signed char
sal_Int8;
typedef unsigned char sal_uInt8;

#if
SAL_TYPES_SIZEOFSHORT == 2
typedef signed short sal_Int16;
typedef
unsigned shortsal_uInt16;//2字节
#else
#error "Could
not find 16-bit type, add support for your
architecture"
#endif

typedef charsal_Char;//1字节

#if ( defined(SAL_W32) &&
!defined(__MINGW32__) )
typedef wchar_tsal_Unicode;
#else
#define
SAL_UNICODE_NOTEQUAL_WCHAR_T
typedef sal_uInt16
sal_Unicode;//2字节
#endif

“Normal”string,
8-bit string, unknown encoding 字符串操作c函数

/** The implementation of a byte
string.

@internal
*/
typedef struct _rtl_String
{

oslInterlockedCount refCount; /* opaque */
sal_Int32
length;
sal_Char
buffer[1];
} rtl_String;//1字节,8bit
string

rtlstring
wrapped inside a class openoffice的字符串类OString

class OString
{
public:

/** @internal */
rtl_String * pData;

usc-2
encoding 一组对unicode字符串操作的c函数

/** The implementation of a
Unicode string.

@internal
*/
typedef struct
_rtl_uString
{
oslInterlockedCount refCount; /* opaque */

sal_Int32 length;
sal_Unicode buffer[1];
} rtl_uString;

void SAL_CALL rtl_string2UString(
rtl_uString ** newStr, const sal_Char * str, sal_Int32 len, rtl_TextEncoding
encoding, sal_uInt32 convertFlags ) SAL_THROW_EXTERN_C();

rtl_ustring
wrapped in a class openoffice的OUString类,封装rtl_ustring的c++类

#include
<rtl/ustring.h> //rtl_uString

#include
<rtl/string.hxx>// OString

class
OUString
{
public:
/** @internal */
rtl_uString *
pData;

OUString(
const sal_Char * value, sal_Int32 length,

rtl_TextEncoding encoding,

sal_uInt32
convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )

{

pData =
0;

rtl_string2UString( &pData, value,
length, encoding, convertFlags );

#if defined
EXCEPTIONS_OFF

OSL_ASSERT(pData != NULL);

#else

if (pData
== 0) {

throw
std::bad_alloc();

}

#endif

}

inline
OUString OStringToOUString( const OString & rStr,

rtl_TextEncoding encoding,

sal_uInt32
convertFlags = OSTRING_TO_OUSTRING_CVTFLAGS )

{

return
OUString( rStr.getStr(), rStr.getLength(), encoding, convertFlags );

}

inline
OString OUStringToOString( const OUString & rUnicode,

rtl_TextEncoding encoding,

sal_uInt32 convertFlags = OUSTRING_TO_OSTRING_CVTFLAGS
)

{

return
OString( rUnicode.getStr(), rUnicode.getLength(), encoding, convertFlags
);

}

openoffice osl模块学习1,布布扣,bubuko.com

时间: 2024-11-05 04:22:24

openoffice osl模块学习1的相关文章

Python 模块学习

模块学习: http://wsyht90.blog.51cto.com/9014030/1845737 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.datetime 11.re 12.random 13.configparser 14.traceback 15.yaml 16.itertools 17.logging 18.urllib.urllib2 19.paramiko ###

python模块学习(2)——re模块

正则表达式并不是python的一部分,正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大.得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不同:但不用担心,不被支持的语法通常是不常用的部分.如果已经在其他语言里使用过正则表达式,只需要简单看一看就可以上手了. 下图展示了使用正则表达式进行匹配的流程:  正则表达式的大致匹配过程是:依次拿出表达式和文本中的字符

Node.js笔记(0003)---Express框架Router模块学习笔记

这段时间一直有在看Express框架的API,最近刚看到Router,以下是我认为需要注意的地方: Router模块中有一个param方法,刚开始看得有点模糊,官网大概是这么描述的: Map logic to route parameters. 大概意思就是路由参数的映射逻辑 这个可能一时半会也不明白其作用,尤其是不知道get和param的执行顺序 再看看源码里面的介绍: Map the given param placeholder `name`(s) to the given callbac

Day5 - Python基础5 常用模块学习

Python 之路 Day5 - 常用模块学习 本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configparser hashlib subprocess logging模块 re正则表达式 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,

python之web模块学习-- urllib

准备写一些列的 python之web模块学习,基本上涉及常用的的web模块,包括 urllib.urllib2.httplib.urlparse.requests,现在,开始我们的第一个模块的学习吧. 1  urllib简介 python urllib 模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取我们想要的数据. 2  常用方法 2.1  urlopen  -- 创建一个类文件对象 为读取指定的URL help(urllib.urlopen) urlopen(url,

Python subprocess模块学习总结

从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn*.os.popen*.popen2.*.commands.*不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息 一.subprocess以及常用的封装函数 运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec

Edison 蓝牙模块 学习笔记

Edison 蓝牙模块 学习笔记 固定链接:https://www.zybuluo.com/SiberiaBear/note/212527 本笔记基于Intel Edison Bluetooth Guide官方手册完成,如有错误敬请指出. 由于个人能力有限,到最后几节内容一直拖着没有翻译,以后会补上,自己也是边学习边翻译的,还请见谅. Edison 蓝牙模块 学习笔记 基本介绍 Linux集成蓝牙 1 The bluetoothd daemon 2 Configuration 3 Applica

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

常用模块学习(一)

常用模块学习(一) 常用模块学习-小鸡汤 推荐节目-晓说: <晓说>是2012年3月高晓松开始主持的网络脱口秀节目 每期由主持人高晓松谈论一个热门话题,打造视频化的"高晓松专栏文章" 常用模块学习-模块的种类和导入方法 ''' 1.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方