Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
0d8e15fa
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
0d8e15fa
编写于
5月 10, 2006
作者:
K
Karel Zak
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
added virBufferStrcat
上级
0f579f78
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
129 addition
and
36 deletion
+129
-36
ChangeLog
ChangeLog
+7
-0
src/xml.c
src/xml.c
+57
-4
src/xml.h
src/xml.h
+2
-0
src/xmlrpc.c
src/xmlrpc.c
+20
-24
tests/xmlrpctest.c
tests/xmlrpctest.c
+43
-8
未找到文件。
ChangeLog
浏览文件 @
0d8e15fa
Wed May 10 13:17:00 CEST 2006 Karel Zak <kzak@redhat.com>
* src/xml.c src/xml.h: added virBufferNew() and virBufferStrcat()
* tests/xmlrpctest.c: added performace tests for virBufferStrcat() and
virBufferVSprintf()
* src/xmlrpc.c: used virBufferStrcat()
Tue May 9 16:37:22 CEST 2006 Karel Zak <kzak@redhat.com>
* tests/Makefile.am tests/xmlrpctest.c tests/testutils.h: added test
...
...
src/xml.c
浏览文件 @
0d8e15fa
...
...
@@ -107,20 +107,40 @@ virBufferAdd(virBufferPtr buf, const char *str, int len)
return
(
-
1
);
}
}
/* XXX: memmove() is 2x slower than memcpy(), do we really need it? */
memmove
(
&
buf
->
content
[
buf
->
use
],
str
,
len
);
buf
->
use
+=
len
;
buf
->
content
[
buf
->
use
]
=
0
;
return
(
0
);
}
virBufferPtr
virBufferNew
(
unsigned
int
size
)
{
virBufferPtr
buf
;
if
(
!
(
buf
=
malloc
(
sizeof
(
*
buf
))))
{
virXMLError
(
VIR_ERR_NO_MEMORY
,
"allocate new buffer"
,
sizeof
(
*
buf
));
return
NULL
;
}
if
(
size
&&
(
buf
->
content
=
malloc
(
size
))
==
NULL
)
{
virXMLError
(
VIR_ERR_NO_MEMORY
,
"allocate buffer content"
,
size
);
free
(
buf
);
return
NULL
;
}
buf
->
size
=
size
;
buf
->
use
=
0
;
return
buf
;
}
void
virBufferFree
(
virBufferPtr
buf
)
{
if
(
buf
)
{
if
(
buf
->
content
)
free
(
buf
->
content
);
free
(
buf
);
if
(
buf
->
content
)
free
(
buf
->
content
);
free
(
buf
);
}
}
...
...
@@ -162,6 +182,39 @@ virBufferVSprintf(virBufferPtr buf, const char *format, ...)
return
(
0
);
}
/**
* virBufferStrcat:
* @buf: the buffer to dump
* @argptr: the variable list of strings, the last argument must be NULL
*
* Concatenate strings to an XML buffer.
*
* Returns 0 successful, -1 in case of internal or API error.
*/
int
virBufferStrcat
(
virBufferPtr
buf
,
...)
{
va_list
ap
;
char
*
str
;
va_start
(
ap
,
buf
);
while
((
str
=
va_arg
(
ap
,
char
*
))
!=
NULL
)
{
unsigned
int
len
=
strlen
(
str
);
unsigned
int
needSize
=
buf
->
use
+
len
+
2
;
if
(
needSize
>
buf
->
size
)
{
if
(
!
virBufferGrow
(
buf
,
needSize
))
return
-
1
;
}
memcpy
(
&
buf
->
content
[
buf
->
use
],
str
,
len
);
buf
->
use
+=
len
;
buf
->
content
[
buf
->
use
]
=
0
;
}
va_end
(
ap
);
return
0
;
}
#if 0
/*
...
...
src/xml.h
浏览文件 @
0d8e15fa
...
...
@@ -24,9 +24,11 @@ struct _virBuffer {
unsigned
int
size
;
/* The buffer size */
};
virBufferPtr
virBufferNew
(
unsigned
int
size
);
void
virBufferFree
(
virBufferPtr
buf
);
int
virBufferAdd
(
virBufferPtr
buf
,
const
char
*
str
,
int
len
);
int
virBufferVSprintf
(
virBufferPtr
buf
,
const
char
*
format
,
...);
int
virBufferStrcat
(
virBufferPtr
buf
,
...);
char
*
virDomainParseXMLDesc
(
const
char
*
xmldesc
,
char
**
name
);
#ifdef __cplusplus
...
...
src/xmlrpc.c
浏览文件 @
0d8e15fa
...
...
@@ -266,13 +266,13 @@ void xmlRpcValueMarshal(xmlRpcValuePtr value, virBufferPtr buf, int indent)
virBufferVSprintf
(
buf
,
"%*s<value>"
,
indent
,
""
);
switch
(
value
->
kind
)
{
case
XML_RPC_ARRAY
:
virBuffer
VSprintf
(
buf
,
"<array><data>
\n
"
,
indent
,
""
);
virBuffer
Strcat
(
buf
,
"<array><data>
\n
"
,
NULL
);
for
(
i
=
0
;
i
<
value
->
value
.
array
.
n_elements
;
i
++
)
xmlRpcValueMarshal
(
value
->
value
.
array
.
elements
[
i
],
buf
,
indent
+
2
);
virBufferVSprintf
(
buf
,
"%*s</data></array>"
,
indent
,
""
);
break
;
case
XML_RPC_STRUCT
:
virBuffer
VSprintf
(
buf
,
"<struct>
\n
"
,
indent
,
""
);
virBuffer
Strcat
(
buf
,
"<struct>
\n
"
,
NULL
);
indent
+=
2
;
for
(
elem
=
value
->
value
.
dict
.
root
;
elem
;
elem
=
elem
->
next
)
{
virBufferVSprintf
(
buf
,
"%*s<member>
\n
"
,
indent
,
""
);
...
...
@@ -306,13 +306,14 @@ void xmlRpcValueMarshal(xmlRpcValuePtr value, virBufferPtr buf, int indent)
TODO
;
break
;
case
XML_RPC_STRING
:
virBufferVSprintf
(
buf
,
"<string>%s</string>"
,
value
->
value
.
string
);
virBufferStrcat
(
buf
,
"<string>"
,
value
->
value
.
string
,
"</string>"
,
NULL
);
break
;
case
XML_RPC_NIL
:
virBuffer
VSprintf
(
buf
,
"<nil> </nil>"
);
virBuffer
Strcat
(
buf
,
"<nil> </nil>"
,
NULL
);
break
;
}
virBuffer
VSprintf
(
buf
,
"</value>
\n
"
);
virBuffer
Strcat
(
buf
,
"</value>
\n
"
,
NULL
);
}
virBufferPtr
xmlRpcMarshalRequest
(
const
char
*
request
,
...
...
@@ -321,28 +322,23 @@ virBufferPtr xmlRpcMarshalRequest(const char *request,
virBufferPtr
buf
;
int
i
;
buf
=
malloc
(
sizeof
(
*
buf
));
buf
->
size
=
1024
;
buf
->
content
=
malloc
(
buf
->
size
);
buf
->
use
=
0
;
virBufferVSprintf
(
buf
,
"<?xml version=
\"
1.0
\"
?>
\n
"
"<methodCall>
\n
"
" <methodName>%s</methodName>
\n
"
" <params>
\n
"
,
request
);
buf
=
virBufferNew
(
1024
);
virBufferStrcat
(
buf
,
"<?xml version=
\"
1.0
\"
?>
\n
"
"<methodCall>
\n
"
" <methodName>"
,
request
,
"</methodName>
\n
"
" <params>
\n
"
,
NULL
);
for
(
i
=
0
;
i
<
argc
;
i
++
)
{
virBuffer
VSprintf
(
buf
,
" <param>
\n
"
);
virBuffer
Strcat
(
buf
,
" <param>
\n
"
,
NULL
);
xmlRpcValueMarshal
(
argv
[
i
],
buf
,
6
);
virBuffer
VSprintf
(
buf
,
" </param>
\n
"
);
virBuffer
Strcat
(
buf
,
" </param>
\n
"
,
NULL
);
}
virBufferVSprintf
(
buf
,
" </params>
\n
"
"</methodCall>
\n
"
);
virBufferStrcat
(
buf
,
" </params>
\n
"
"</methodCall>
\n
"
,
NULL
);
return
buf
;
}
...
...
tests/xmlrpctest.c
浏览文件 @
0d8e15fa
...
...
@@ -151,11 +151,10 @@ testMarshalRequestSTRING(void *data ATTRIBUTE_UNUSED)
int
check
=
data
?
*
((
int
*
)
data
)
:
0
;
virBufferPtr
buf
=
marshalRequest
(
"s"
,
str
);
if
(
check
)
if
(
check
)
ret
=
checkRequestValue
(
buf
->
content
,
"string(/methodCall/params/param[1]/value/string)"
,
XML_RPC_STRING
,
(
void
*
)
str
);
virBufferFree
(
buf
);
return
ret
;
}
...
...
@@ -177,6 +176,32 @@ testMarshalRequestDOUBLE(void *data)
return
ret
;
}
static
int
testBufferStrcat
(
void
*
data
ATTRIBUTE_UNUSED
)
{
virBufferPtr
buf
=
virBufferNew
(
1000
*
32
);
/* don't waste time with realloc */
int
i
;
for
(
i
=
0
;
i
<
1000
;
i
++
)
virBufferStrcat
(
buf
,
"My name is "
,
"libvirt"
,
".
\n
"
,
NULL
);
virBufferFree
(
buf
);
return
0
;
}
static
int
testBufferVSprintf
(
void
*
data
ATTRIBUTE_UNUSED
)
{
virBufferPtr
buf
=
virBufferNew
(
1000
*
32
);
/* don't waste time with realloc */
int
i
;
for
(
i
=
0
;
i
<
1000
;
i
++
)
virBufferVSprintf
(
buf
,
"My name is %s.
\n
"
,
"libvirt"
);
virBufferFree
(
buf
);
return
0
;
}
int
main
(
int
argc
,
char
**
argv
)
{
...
...
@@ -194,15 +219,17 @@ main(int argc, char **argv)
}
if
(
argc
==
2
)
url
=
argv
[
1
];
/*
* client-server tests
*/
if
(
!
(
cxt
=
xmlRpcContextNew
(
url
)))
{
fprintf
(
stderr
,
"%s: failed create new RPC context
\n
"
,
progname
);
exit
(
EXIT_FAILURE
);
}
/* client-server tests */
if
(
virtTestRun
(
"XML-RPC methodCall INT+INT"
,
if
(
virtTestRun
(
"XML-RPC methodCall INT+INT"
,
NLOOPS
,
testMethodPlusINT
,
(
void
*
)
cxt
)
!=
0
)
ret
=
-
1
;
...
...
@@ -210,7 +237,11 @@ main(int argc, char **argv)
NLOOPS
,
testMethodPlusDOUBLE
,
(
void
*
)
cxt
)
!=
0
)
ret
=
-
1
;
/* regression / performance tests */
xmlRpcContextFree
(
cxt
);
/*
* regression / performance tests
*/
if
(
virtTestRun
(
"XML-RPC request marshalling: INT (check)"
,
1
,
testMarshalRequestINT
,
(
void
*
)
&
check
)
!=
0
)
ret
=
-
1
;
...
...
@@ -231,8 +262,12 @@ main(int argc, char **argv)
if
(
virtTestRun
(
"XML-RPC request marshalling: STRING"
,
NLOOPS
,
testMarshalRequestSTRING
,
NULL
)
!=
0
)
ret
=
-
1
;
xmlRpcContextFree
(
cxt
);
if
(
virtTestRun
(
"Buffer: strcat"
,
NLOOPS
,
testBufferStrcat
,
NULL
)
!=
0
)
ret
=
-
1
;
if
(
virtTestRun
(
"Buffer: sprintf"
,
NLOOPS
,
testBufferVSprintf
,
NULL
)
!=
0
)
ret
=
-
1
;
exit
(
ret
==
0
?
EXIT_SUCCESS
:
EXIT_FAILURE
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录