You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by sh...@apache.org on 2009/09/07 13:01:38 UTC
svn commit: r812077 -
/webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c
Author: shankar
Date: Mon Sep 7 11:01:38 2009
New Revision: 812077
URL: http://svn.apache.org/viewvc?rev=812077&view=rev
Log:
improving performance
Modified:
webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c
Modified: webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c?rev=812077&r1=812076&r2=812077&view=diff
==============================================================================
--- webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c (original)
+++ webservices/axis2/trunk/c/guththila/src/guththila_xml_parser.c Mon Sep 7 11:01:38 2009
@@ -29,9 +29,42 @@
static int
guththila_next_char(
guththila_t * m,
- int eof,
const axutil_env_t * env);
+/* part of guththila_next_char method. this was included as macro for performance. 99% of the time
+ * following will be called, so having it as next_char method is very expensive (method calling
+ * overhead is higher) so, common case is checked as part of the macro and if not satisfied, method
+ * is called
+ */
+#define GUTHTHILA_NEXT_CHAR(m, reader_type, env, c)\
+{\
+ if(reader_type == GUTHTHILA_MEMORY_READER)\
+ {\
+ int index = m->next++;\
+ if(index < m->buffer.data_size[0])\
+ {\
+ c = m->buffer.buff[0][index];\
+ }\
+ else\
+ {\
+ c = -1;\
+ }\
+ }\
+ else\
+ {\
+ if(m->buffer.cur_buff != -1 && m->next < GUTHTHILA_BUFFER_PRE_DATA_SIZE(m->buffer)\
+ + GUTHTHILA_BUFFER_CURRENT_DATA_SIZE(m->buffer))\
+ {\
+ c = m->buffer.buff[m->buffer.cur_buff][m->next++ - GUTHTHILA_BUFFER_PRE_DATA_SIZE(\
+ m->buffer)];\
+ }\
+ else\
+ {\
+ c = guththila_next_char(m, env);\
+ }\
+ }\
+}
+
/*
* Read the specified number of characters at once.
*/
@@ -66,14 +99,14 @@
* Read characters until all the white spaces are read.
*/
#ifndef GUTHTHILA_SKIP_SPACES
-#define GUTHTHILA_SKIP_SPACES(m, c, _env)while(0x20 == c || 0x9 == c || 0xD == c || 0xA == c){c = guththila_next_char(m, 0, _env);}
+#define GUTHTHILA_SKIP_SPACES(m, c, reader_type, _env)while(0x20 == c || 0x9 == c || 0xD == c || 0xA == c){GUTHTHILA_NEXT_CHAR(m, reader_type, _env, c);}
#endif
/*
* Read character including new line until a non white space character is met.
*/
#ifndef GUTHTHILA_SKIP_SPACES_WITH_NEW_LINE
-#define GUTHTHILA_SKIP_SPACES_WITH_NEW_LINE(m, c, _env) while (0x20 == c || 0x9 == c || 0xD == c || 0xA == c || '\n' == c){c = guththila_next_char(m, 0, _env);}
+#define GUTHTHILA_SKIP_SPACES_WITH_NEW_LINE(m, c, reader_type, _env) while (0x20 == c || 0x9 == c || 0xD == c || 0xA == c || '\n' == c){GUTHTHILA_NEXT_CHAR(m, reader_type, _env, c);}
#endif
#ifndef GUTHTHILA_XML_NAME
@@ -108,11 +141,11 @@
* Read until we met a = character.
*/
#ifndef GUTHTHILA_PROCESS_EQU
-#define GUTHTHILA_PROCESS_EQU(m, c, ic, _env) \
- GUTHTHILA_SKIP_SPACES(m, c, _env); \
+#define GUTHTHILA_PROCESS_EQU(m, c, ic, reader_type, _env) \
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, _env); \
if (0x3D == c) { \
- ic = guththila_next_char(m, 0, _env); \
- GUTHTHILA_SKIP_SPACES(m, ic, _env); \
+ GUTHTHILA_NEXT_CHAR(m, reader_type, _env, ic); \
+ GUTHTHILA_SKIP_SPACES(m, ic, reader_type, _env); \
}
#endif
@@ -664,6 +697,7 @@
int c = -1;
guththila_attr_t * attr = NULL;
int size = 0, i = 0, nmsp_counter, loop = 0, white_space = 0;
+ int reader_type = m->reader->type;
/* Need to release the resources for attributes */
size = GUTHTHILA_STACK_SIZE(m->attrib);
for(i = 0; i < size; i++)
@@ -719,13 +753,13 @@
do
{
loop = 0;
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if(m->status == S_1)
{
while(isspace(c))
{
- c = guththila_next_char(m, 0, env);
- if(c == -1)
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ if(c < 0)
return -1;
}
if('<' == c)
@@ -739,27 +773,27 @@
}
if('<' == c && m->status == S_2)
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if(c != '?' && c != '!' && c != '/')
{
/* We are at the beginig of a xml element */
if(GUTHTHILA_IS_VALID_STARTING_CHAR(c))
{
GUTHTHILA_TOKEN_OPEN(m, tok, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
while(!GUTHTHILA_IS_SPACE(c) && c != '>' && c != '/')
{
- if(c == -1)
+ if(c < 0)
return -1;
if(c != ':')
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
else
{
/* We know for sure that this is a prefix */
guththila_token_close(m, tok, _prefix, 0, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
}
}
@@ -774,14 +808,14 @@
guththila_stack_push(&m->elem, elem, env);
#endif
}
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
/* Process the attributes */
for(;;)
{
/* Empty element */
if(c == '/')
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if(c == '>')
{
m->guththila_event = GUTHTHILA_EMPTY_ELEMENT;
@@ -812,20 +846,20 @@
{
GUTHTHILA_TOKEN_OPEN(m, tok, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
while(!GUTHTHILA_IS_SPACE(c) && c != '=')
{
- if(c == -1)
+ if(c < 0)
return -1;
if(c != ':')
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
else if(c == ':')
{
/* Prefix */
guththila_token_close(m, tok, _prefix, 0, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
}
}
@@ -837,20 +871,20 @@
return -1;
}
/* Attribute Value */
- GUTHTHILA_PROCESS_EQU(m, c, quote, env);
+ GUTHTHILA_PROCESS_EQU(m, c, quote, reader_type, env);
if('\'' == quote || '\"' == quote)
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
while(c != quote)
{
- if(c == -1)
+ if(c < 0)
return -1;
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
guththila_token_close(m, tok, _attribute_value, 0, env);
- c = guththila_next_char(m, 0, env);
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
}
else
{
@@ -867,24 +901,24 @@
{
/* End Element */
m->guththila_event = GUTHTHILA_END_ELEMENT;
- c = guththila_next_char(m, -1, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if(GUTHTHILA_IS_VALID_STARTING_CHAR(c))
{
GUTHTHILA_TOKEN_OPEN(m, tok, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
while(!GUTHTHILA_IS_SPACE(c) && c != '>')
{
- if(c == -1)
+ if(c < 0)
return -1;
if(c != ':')
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
else
{
/* Prefix */
guththila_token_close(m, tok, _prefix, 0, env);
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
}
}
@@ -927,7 +961,7 @@
guththila_tok_list_release_token(&m->tokens, elem->prefix, env);
AXIS2_FREE(env->allocator, elem);
#endif
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
if(c != '>')
return -1;
return GUTHTHILA_END_ELEMENT;
@@ -941,11 +975,11 @@
== c_arra[1])
{
int loop_state = 1;
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
while(loop_state)
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if('-' == c)
{
if(2 == guththila_next_no_char(m, 0, c_arra, 2, env) && '-'
@@ -970,12 +1004,12 @@
}
else
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
while('<' != c)
{
- if(c == -1)
+ if(c < 0)
return -1;
- c = guththila_next_char(m, -1, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
}
}
@@ -1001,10 +1035,10 @@
do
{
- c = guththila_next_char(m, -1, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
if(!GUTHTHILA_IS_SPACE(c) && c != '<')
white_space = 0;
- if(c == -1)
+ if(c < 0)
return -1;
}
while(c != '<');
@@ -1049,11 +1083,12 @@
int c = -1;
int quote = -1;
int nc = -1;
+ int reader_type = m->reader->type;
if(3 == guththila_next_no_char(m, GUTHTHILA_EOF, c_arra, 3, env) && 'x' == c_arra[0] && 'm'
== c_arra[1] && 'l' == c_arra[2])
{
- c = guththila_next_char(m, GUTHTHILA_EOF, env);
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
if(c == 'v')
{
GUTHTHILA_TOKEN_OPEN(m, tok, env);
@@ -1061,20 +1096,20 @@
== c_arra[1] && 's' == c_arra[2] && 'i' == c_arra[3] && 'o' == c_arra[4] && 'n'
== c_arra[5])
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
guththila_token_close(m, tok, _attribute_name, 0, env);
- GUTHTHILA_PROCESS_EQU(m, c, quote, env);
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_PROCESS_EQU(m, c, quote, reader_type, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
while(nc != quote)
{
- if(nc == -1)
+ if(nc < 0)
return -1;
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
}
guththila_token_close(m, tok, _attribute_value, 0, env);
- c = guththila_next_char(m, 0, env);
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
}
else
{
@@ -1088,20 +1123,20 @@
== c_arra[1] && 'o' == c_arra[2] && 'd' == c_arra[3] && 'i' == c_arra[4] && 'n'
== c_arra[5] && 'g' == c_arra[6])
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
guththila_token_close(m, tok, _attribute_name, 0, env);
- GUTHTHILA_PROCESS_EQU(m, c, quote, env);
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_PROCESS_EQU(m, c, quote, reader_type, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
while(nc != quote)
{
- if(nc == -1)
+ if(nc < 0)
return -1;
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
}
guththila_token_close(m, tok, _attribute_value, 0, env);
- c = guththila_next_char(m, 0, env);
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
}
}
if(c == 's')
@@ -1111,25 +1146,27 @@
== c_arra[1] && 'n' == c_arra[2] && 'd' == c_arra[3] && 'a' == c_arra[4] && 'l'
== c_arra[5] && 'o' == c_arra[6] && 'n' == c_arra[7] && 'e' == c_arra[8])
{
- c = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
guththila_token_close(m, tok, _attribute_name, 0, env);
- GUTHTHILA_PROCESS_EQU(m, c, quote, env);
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_PROCESS_EQU(m, c, quote, reader_type, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
GUTHTHILA_TOKEN_OPEN(m, tok, env);
while(nc != quote)
{
- if(nc == -1)
+ if(nc < 0)
return -1;
- nc = guththila_next_char(m, 0, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
}
guththila_token_close(m, tok, _attribute_value, 0, env);
- c = guththila_next_char(m, 0, env);
- GUTHTHILA_SKIP_SPACES(m, c, env);
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, c);
+ GUTHTHILA_SKIP_SPACES(m, c, reader_type, env);
}
}
if(c == '?')
{
- if('>' == guththila_next_char(m, 0, env))
+ int nc;
+ GUTHTHILA_NEXT_CHAR(m, reader_type, env, nc);
+ if('>' == nc)
{
m->guththila_event = GUTHTHILA_START_DOCUMENT;
}
@@ -1477,7 +1514,6 @@
static int
guththila_next_char(
guththila_t * m,
- int eof,
const axutil_env_t * env)
{
int c;
@@ -1485,16 +1521,19 @@
int temp;
guththila_char_t **temp1;
size_t * temp2, *temp3;
+
/* we have a buffered reader. Easiest case just fetch the character from
* the buffer. Here we have a single buffer.
* */
- if(m->reader->type == GUTHTHILA_MEMORY_READER && m->next < GUTHTHILA_BUFFER_CURRENT_DATA_SIZE(
- m->buffer))
+ if(m->reader->type == GUTHTHILA_MEMORY_READER)
{
- c = m->buffer.buff[0][m->next++];
- return c >= 0 ? c : -1;
+ int index = m->next++;
+ if(index < m->buffer.data_size[0])
+ {
+ return m->buffer.buff[0][index];
+ }
}
- else if(m->reader->type == GUTHTHILA_IO_READER || m->reader->type == GUTHTHILA_FILE_READER)
+ else
{
/* comlex stuff. We have a array of buffers */
if(m->buffer.cur_buff != -1 && m->next < GUTHTHILA_BUFFER_PRE_DATA_SIZE(m->buffer)
@@ -1503,7 +1542,7 @@
/* What we are looking for is already in the buffer */
c = m->buffer.buff[m->buffer.cur_buff][m->next++ - GUTHTHILA_BUFFER_PRE_DATA_SIZE(
m->buffer)];
- return c >= 0 ? c : -1;
+ return c;
}
else if(m->buffer.cur_buff != -1 && m->next >= GUTHTHILA_BUFFER_PRE_DATA_SIZE(m->buffer)
+ GUTHTHILA_BUFFER_CURRENT_DATA_SIZE(m->buffer))
@@ -1567,7 +1606,7 @@
}
c = m->buffer.buff[m->buffer.cur_buff][m->next++ - GUTHTHILA_BUFFER_PRE_DATA_SIZE(
m->buffer)];
- return c >= 0 ? c : -1;
+ return c;
}
/* Initial stage. We dont' have the array of buffers allocated*/
else if(m->buffer.cur_buff == -1)
@@ -1580,7 +1619,7 @@
GUTHTHILA_BUFFER_DEF_SIZE, env);
m->buffer.data_size[0] = temp;
c = m->buffer.buff[0][m->next++];
- return c >= 0 ? c : -1;
+ return c;
}
}
return -1;