Commit 959e1428 authored by monty@narttu.mysql.fi's avatar monty@narttu.mysql.fi

Merge work:/my/mysql-4.1 into narttu.mysql.fi:/my/mysql-4.1

parents 3503d479 9147f8b5
...@@ -1239,7 +1239,7 @@ filename_completion_function(const char *text, int state) ...@@ -1239,7 +1239,7 @@ filename_completion_function(const char *text, int state)
/* otherwise, get first entry where first */ /* otherwise, get first entry where first */
/* filename_len characters are equal */ /* filename_len characters are equal */
if (entry->d_name[0] == filename[0] if (entry->d_name[0] == filename[0]
#if defined(__SVR4) || defined(__linux__) #ifdef HAVE_DIRENT_H
&& strlen(entry->d_name) >= filename_len && strlen(entry->d_name) >= filename_len
#else #else
&& entry->d_namlen >= filename_len && entry->d_namlen >= filename_len
...@@ -1252,7 +1252,7 @@ filename_completion_function(const char *text, int state) ...@@ -1252,7 +1252,7 @@ filename_completion_function(const char *text, int state)
if (entry) { /* match found */ if (entry) { /* match found */
struct stat stbuf; struct stat stbuf;
#if defined(__SVR4) || defined(__linux__) #ifdef HAVE_DIRENT_H
len = strlen(entry->d_name) + len = strlen(entry->d_name) +
#else #else
len = entry->d_namlen + len = entry->d_namlen +
......
...@@ -1825,6 +1825,7 @@ AC_CHECK_FUNCS(alarm bmove \ ...@@ -1825,6 +1825,7 @@ AC_CHECK_FUNCS(alarm bmove \
sigset sigthreadmask pthread_sigmask pthread_setprio pthread_setprio_np \ sigset sigthreadmask pthread_sigmask pthread_setprio pthread_setprio_np \
pthread_setschedparam pthread_attr_setprio pthread_attr_setschedparam \ pthread_setschedparam pthread_attr_setprio pthread_attr_setschedparam \
pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \ pthread_attr_create pthread_getsequence_np pthread_attr_setstacksize \
pthread_attr_getstacksize \
pthread_condattr_create rwlock_init pthread_rwlock_rdlock \ pthread_condattr_create rwlock_init pthread_rwlock_rdlock \
fchmod getpass getpassphrase initgroups mlockall) fchmod getpass getpassphrase initgroups mlockall)
......
...@@ -143,6 +143,11 @@ typedef uint rf_SetTimer; ...@@ -143,6 +143,11 @@ typedef uint rf_SetTimer;
#define HAVE_NAMED_PIPE /* We can only create pipes on NT */ #define HAVE_NAMED_PIPE /* We can only create pipes on NT */
#endif #endif
/* We need to close files to break connections on shutdown */
#ifndef SIGNAL_WITH_VIO_CLOSE
#define SIGNAL_WITH_VIO_CLOSE
#endif
/* Use all character sets in MySQL */ /* Use all character sets in MySQL */
#define USE_MB 1 #define USE_MB 1
#define USE_MB_IDENT 1 #define USE_MB_IDENT 1
...@@ -324,4 +329,4 @@ inline double ulonglong2double(ulonglong value) ...@@ -324,4 +329,4 @@ inline double ulonglong2double(ulonglong value)
#define statistic_increment(V,L) thread_safe_increment((V),(L)) #define statistic_increment(V,L) thread_safe_increment((V),(L))
#define shared_memory_buffer_length 16000 #define shared_memory_buffer_length 16000
#define default_shared_memory_base_name "MYSQL"; #define default_shared_memory_base_name "MYSQL"
...@@ -110,6 +110,7 @@ ...@@ -110,6 +110,7 @@
#define __STDC_EXT__ 1 /* To get large file support on hpux */ #define __STDC_EXT__ 1 /* To get large file support on hpux */
#endif #endif
#ifdef HPUX11
/* /*
Fix warnings on HPUX11 Fix warnings on HPUX11
There is something really strange with HPUX11 include files as you get There is something really strange with HPUX11 include files as you get
...@@ -117,11 +118,10 @@ ...@@ -117,11 +118,10 @@
do the following: do the following:
*/ */
#if !defined(_XOPEN_SOURCE_EXTENDED) && ! defined(__cplusplus) #if !defined(_XOPEN_SOURCE_EXTENDED) && ! defined(__cplusplus)
#define _XOPEN_SOURCE_EXTENDED #define _XOPEN_SOURCE_EXTENDED 1
#endif #endif
/* Fix type of socklen as this is depending on the above define */ /* Fix type of socklen as this is depending on the above define */
#ifdef HPUX11
#undef SOCKET_SIZE_TYPE #undef SOCKET_SIZE_TYPE
#ifdef _XOPEN_SOURCE_EXTENDED #ifdef _XOPEN_SOURCE_EXTENDED
#define SOCKET_SIZE_TYPE socklen_t #define SOCKET_SIZE_TYPE socklen_t
......
...@@ -37,20 +37,26 @@ typedef struct xml_stack_st ...@@ -37,20 +37,26 @@ typedef struct xml_stack_st
void *user_data; void *user_data;
int (*enter)(struct xml_stack_st *st,const char *val, uint len); int (*enter)(struct xml_stack_st *st,const char *val, uint len);
int (*value)(struct xml_stack_st *st,const char *val, uint len); int (*value)(struct xml_stack_st *st,const char *val, uint len);
int (*leave)(struct xml_stack_st *st,const char *val, uint len); int (*leave_xml)(struct xml_stack_st *st,const char *val, uint len);
} MY_XML_PARSER; } MY_XML_PARSER;
void my_xml_parser_create(MY_XML_PARSER *st); void my_xml_parser_create(MY_XML_PARSER *st);
void my_xml_parser_free(MY_XML_PARSER *st); void my_xml_parser_free(MY_XML_PARSER *st);
int my_xml_parse(MY_XML_PARSER *st,const char *str, uint len); int my_xml_parse(MY_XML_PARSER *st,const char *str, uint len);
void my_xml_set_value_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, const char *, uint len)); void my_xml_set_value_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *,
void my_xml_set_enter_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, const char *, uint len)); const char *,
void my_xml_set_leave_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *, const char *, uint len)); uint len));
void my_xml_set_user_data(MY_XML_PARSER *st, void *); void my_xml_set_enter_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *,
const char *,
uint len));
void my_xml_set_leave_handler(MY_XML_PARSER *st, int (*)(MY_XML_PARSER *,
const char *,
uint len));
void my_xml_set_user_data(MY_XML_PARSER *st, void *);
uint my_xml_error_pos(MY_XML_PARSER *st); uint my_xml_error_pos(MY_XML_PARSER *st);
uint my_xml_error_lineno(MY_XML_PARSER *st); uint my_xml_error_lineno(MY_XML_PARSER *st);
const char *my_xml_error_string(MY_XML_PARSER *st); const char *my_xml_error_string(MY_XML_PARSER *st);
......
...@@ -43,8 +43,8 @@ enum thr_lock_type { TL_IGNORE=-1, ...@@ -43,8 +43,8 @@ enum thr_lock_type { TL_IGNORE=-1,
*/ */
TL_WRITE_ALLOW_WRITE, TL_WRITE_ALLOW_WRITE,
/* /*
Write lock, but allow other threads to read / write. Write lock, but allow other threads to read.
Used by ALTER TABLE in MySQL to mark to allow readers Used by ALTER TABLE in MySQL to allow readers
to use the table until ALTER TABLE is finished. to use the table until ALTER TABLE is finished.
*/ */
TL_WRITE_ALLOW_READ, TL_WRITE_ALLOW_READ,
......
...@@ -27,7 +27,7 @@ CLEANFILES = $(test_SCRIPTS) ...@@ -27,7 +27,7 @@ CLEANFILES = $(test_SCRIPTS)
dist-hook: dist-hook:
mkdir -p $(distdir)/t $(distdir)/r $(distdir)/include \ mkdir -p $(distdir)/t $(distdir)/r $(distdir)/include \
$(distdir)/std_data $(distdir)/std_data
$(INSTALL_DATA) $(srcdir)/t/*.test $(srcdir)/t/*.opt $(srcdir)/t/*.sh $(distdir)/t $(INSTALL_DATA) $(srcdir)/t/*.test $(srcdir)/t/*.opt $(srcdir)/t/*.sh $(srcdir)/t/*.slave-mi $(distdir)/t
$(INSTALL_DATA) $(srcdir)/include/*.inc $(distdir)/include $(INSTALL_DATA) $(srcdir)/include/*.inc $(distdir)/include
$(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.require $(distdir)/r $(INSTALL_DATA) $(srcdir)/r/*.result $(srcdir)/r/*.require $(distdir)/r
$(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data $(INSTALL_DATA) $(srcdir)/std_data/*.dat $(srcdir)/std_data/*.000001 $(distdir)/std_data
...@@ -41,6 +41,8 @@ install-data-local: ...@@ -41,6 +41,8 @@ install-data-local:
$(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(testdir) $(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(testdir)
$(INSTALL_DATA) $(srcdir)/t/*.test $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.test $(DESTDIR)$(testdir)/t
$(INSTALL_DATA) $(srcdir)/t/*.opt $(DESTDIR)$(testdir)/t $(INSTALL_DATA) $(srcdir)/t/*.opt $(DESTDIR)$(testdir)/t
$(INSTALL_DATA) $(srcdir)/t/*.sh $(DESTDIR)$(testdir)/t
$(INSTALL_DATA) $(srcdir)/t/*.slave-mi $(DESTDIR)$(testdir)/t
$(INSTALL_DATA) $(srcdir)/r/*.result $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/r/*.result $(DESTDIR)$(testdir)/r
$(INSTALL_DATA) $(srcdir)/r/*.require $(DESTDIR)$(testdir)/r $(INSTALL_DATA) $(srcdir)/r/*.require $(DESTDIR)$(testdir)/r
$(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include $(INSTALL_DATA) $(srcdir)/include/*.inc $(DESTDIR)$(testdir)/include
......
...@@ -1937,14 +1937,14 @@ int Rand_log_event::write_data(IO_CACHE* file) ...@@ -1937,14 +1937,14 @@ int Rand_log_event::write_data(IO_CACHE* file)
#ifdef MYSQL_CLIENT #ifdef MYSQL_CLIENT
void Rand_log_event::print(FILE* file, bool short_form, char* last_db) void Rand_log_event::print(FILE* file, bool short_form, char* last_db)
{ {
char llbuff[22]; char llbuff[22],llbuff2[22];
if (!short_form) if (!short_form)
{ {
print_header(file); print_header(file);
fprintf(file, "\tRand\n"); fprintf(file, "\tRand\n");
} }
fprintf(file, "SET @@RAND_SEED1=%s, @@RAND_SEED2=%s;\n", fprintf(file, "SET @@RAND_SEED1=%s, @@RAND_SEED2=%s;\n",
llstr(seed1, llbuff),llstr(seed2, llbuff)); llstr(seed1, llbuff),llstr(seed2, llbuff2));
fflush(file); fflush(file);
} }
#endif // MYSQL_CLIENT #endif // MYSQL_CLIENT
......
...@@ -2352,6 +2352,7 @@ int main(int argc, char **argv) ...@@ -2352,6 +2352,7 @@ int main(int argc, char **argv)
if (init_thread_environment()) if (init_thread_environment())
unireg_abort(1); unireg_abort(1);
pthread_attr_setstacksize(&connection_attrib,thread_stack); pthread_attr_setstacksize(&connection_attrib,thread_stack);
#ifdef HAVE_PTHREAD_ATTR_GETSTACKSIZE
{ {
/* Retrieve used stack size; Needed for checking stack overflows */ /* Retrieve used stack size; Needed for checking stack overflows */
size_t stack_size; size_t stack_size;
...@@ -2363,6 +2364,7 @@ int main(int argc, char **argv) ...@@ -2363,6 +2364,7 @@ int main(int argc, char **argv)
thread_stack= stack_size; thread_stack= stack_size;
} }
} }
#endif
(void) thr_setconcurrency(concurrency); // 10 by default (void) thr_setconcurrency(concurrency); // 10 by default
select_thread=pthread_self(); select_thread=pthread_self();
......
...@@ -59,13 +59,13 @@ static int init_failsafe_rpl_thread(THD* thd) ...@@ -59,13 +59,13 @@ static int init_failsafe_rpl_thread(THD* thd)
{ {
DBUG_ENTER("init_failsafe_rpl_thread"); DBUG_ENTER("init_failsafe_rpl_thread");
thd->system_thread = thd->bootstrap = 1; thd->system_thread = thd->bootstrap = 1;
thd->host_or_ip= "";
thd->client_capabilities = 0; thd->client_capabilities = 0;
my_net_init(&thd->net, 0); my_net_init(&thd->net, 0);
thd->net.read_timeout = slave_net_timeout; thd->net.read_timeout = slave_net_timeout;
thd->max_client_packet_length=thd->net.max_packet; thd->max_client_packet_length=thd->net.max_packet;
thd->master_access= ~0; thd->master_access= ~0;
thd->priv_user = 0; thd->priv_user = 0;
thd->system_thread = 1;
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
thd->thread_id = thread_id++; thd->thread_id = thread_id++;
pthread_mutex_unlock(&LOCK_thread_count); pthread_mutex_unlock(&LOCK_thread_count);
......
...@@ -1863,6 +1863,7 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) ...@@ -1863,6 +1863,7 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
{ {
DBUG_ENTER("init_slave_thread"); DBUG_ENTER("init_slave_thread");
thd->system_thread = thd->bootstrap = 1; thd->system_thread = thd->bootstrap = 1;
thd->host_or_ip= "";
thd->client_capabilities = 0; thd->client_capabilities = 0;
my_net_init(&thd->net, 0); my_net_init(&thd->net, 0);
thd->net.read_timeout = slave_net_timeout; thd->net.read_timeout = slave_net_timeout;
...@@ -1870,7 +1871,6 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type) ...@@ -1870,7 +1871,6 @@ static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type)
thd->priv_user = 0; thd->priv_user = 0;
thd->slave_thread = 1; thd->slave_thread = 1;
thd->options = (((opt_log_slave_updates) ? OPTION_BIN_LOG:0) | OPTION_AUTO_IS_NULL) ; thd->options = (((opt_log_slave_updates) ? OPTION_BIN_LOG:0) | OPTION_AUTO_IS_NULL) ;
thd->system_thread = 1;
thd->client_capabilities = CLIENT_LOCAL_FILES; thd->client_capabilities = CLIENT_LOCAL_FILES;
thd->real_id=pthread_self(); thd->real_id=pthread_self();
pthread_mutex_lock(&LOCK_thread_count); pthread_mutex_lock(&LOCK_thread_count);
......
...@@ -83,7 +83,7 @@ THD::THD():user_time(0), is_fatal_error(0), ...@@ -83,7 +83,7 @@ THD::THD():user_time(0), is_fatal_error(0),
global_read_lock(0), bootstrap(0) global_read_lock(0), bootstrap(0)
{ {
host=user=priv_user=db=query=ip=0; host=user=priv_user=db=query=ip=0;
host_or_ip="unknown ip"; host_or_ip= "connecting host";
locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password= locked=killed=count_cuted_fields=some_tables_deleted=no_errors=password=
query_start_used=prepare_command=0; query_start_used=prepare_command=0;
db_length=query_length=col_access=0; db_length=query_length=col_access=0;
......
...@@ -588,6 +588,7 @@ public: ...@@ -588,6 +588,7 @@ public:
bzero((char*) &thd.net,sizeof(thd.net)); // Safety bzero((char*) &thd.net,sizeof(thd.net)); // Safety
thd.system_thread=1; thd.system_thread=1;
thd.host_or_ip= "";
bzero((char*) &info,sizeof(info)); bzero((char*) &info,sizeof(info));
pthread_mutex_init(&mutex,MY_MUTEX_INIT_FAST); pthread_mutex_init(&mutex,MY_MUTEX_INIT_FAST);
pthread_cond_init(&cond,NULL); pthread_cond_init(&cond,NULL);
......
...@@ -1326,10 +1326,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) ...@@ -1326,10 +1326,7 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
thd_info->user=thd->strdup(tmp->user ? tmp->user : thd_info->user=thd->strdup(tmp->user ? tmp->user :
(tmp->system_thread ? (tmp->system_thread ?
"system user" : "unauthenticated user")); "system user" : "unauthenticated user"));
thd_info->host=thd->strdup(tmp->host ? tmp->host : thd_info->host= thd->strdup(tmp->host_or_ip);
(tmp->ip ? tmp->ip :
(tmp->system_thread ? "none" :
"connecting host")));
if ((thd_info->db=tmp->db)) // Safe test if ((thd_info->db=tmp->db)) // Safe test
thd_info->db=thd->strdup(thd_info->db); thd_info->db=thd->strdup(thd_info->db);
thd_info->command=(int) tmp->command; thd_info->command=(int) tmp->command;
......
...@@ -37,6 +37,7 @@ typedef struct xml_attr_st ...@@ -37,6 +37,7 @@ typedef struct xml_attr_st
const char *end; const char *end;
} MY_XML_ATTR; } MY_XML_ATTR;
static const char *lex2str(int lex) static const char *lex2str(int lex)
{ {
switch(lex) switch(lex)
...@@ -97,7 +98,8 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a) ...@@ -97,7 +98,8 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
else if ( (p->cur[0]=='"') || (p->cur[0]=='\'') ) else if ( (p->cur[0]=='"') || (p->cur[0]=='\'') )
{ {
p->cur++; p->cur++;
for( ; ( p->cur < p->end ) && (p->cur[0]!=a->beg[0]); p->cur++); for( ; ( p->cur < p->end ) && (p->cur[0] != a->beg[0]); p->cur++)
{}
a->end=p->cur; a->end=p->cur;
if (a->beg[0]==p->cur[0])p->cur++; if (a->beg[0]==p->cur[0])p->cur++;
a->beg++; a->beg++;
...@@ -106,7 +108,10 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a) ...@@ -106,7 +108,10 @@ static int my_xml_scan(MY_XML_PARSER *p,MY_XML_ATTR *a)
} }
else else
{ {
for( ; (p->cur < p->end) && !strchr("?'\"=/<> \t\r\n", p->cur[0]); p->cur++); for(;
(p->cur < p->end) && !strchr("?'\"=/<> \t\r\n", p->cur[0]);
p->cur++)
{}
a->end=p->cur; a->end=p->cur;
my_xml_norm_text(a); my_xml_norm_text(a);
lex=MY_XML_IDENT; lex=MY_XML_IDENT;
...@@ -145,6 +150,7 @@ static int my_xml_enter(MY_XML_PARSER *st, const char *str, uint len) ...@@ -145,6 +150,7 @@ static int my_xml_enter(MY_XML_PARSER *st, const char *str, uint len)
return st->enter ? st->enter(st,st->attr,st->attrend-st->attr) : MY_XML_OK; return st->enter ? st->enter(st,st->attr,st->attrend-st->attr) : MY_XML_OK;
} }
static void mstr(char *s,const char *src,uint l1, uint l2) static void mstr(char *s,const char *src,uint l1, uint l2)
{ {
l1 = l1<l2 ? l1 : l2; l1 = l1<l2 ? l1 : l2;
...@@ -152,6 +158,7 @@ static void mstr(char *s,const char *src,uint l1, uint l2) ...@@ -152,6 +158,7 @@ static void mstr(char *s,const char *src,uint l1, uint l2)
s[l1]='\0'; s[l1]='\0';
} }
static int my_xml_leave(MY_XML_PARSER *p, const char *str, uint slen) static int my_xml_leave(MY_XML_PARSER *p, const char *str, uint slen)
{ {
char *e; char *e;
...@@ -172,7 +179,7 @@ static int my_xml_leave(MY_XML_PARSER *p, const char *str, uint slen) ...@@ -172,7 +179,7 @@ static int my_xml_leave(MY_XML_PARSER *p, const char *str, uint slen)
return MY_XML_ERROR; return MY_XML_ERROR;
} }
rc = p->leave ? p->leave(p,p->attr,p->attrend-p->attr) : MY_XML_OK; rc = p->leave_xml ? p->leave_xml(p,p->attr,p->attrend-p->attr) : MY_XML_OK;
*e='\0'; *e='\0';
p->attrend=e; p->attrend=e;
...@@ -237,7 +244,8 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len) ...@@ -237,7 +244,8 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len)
} }
else else
{ {
sprintf(p->errstr,"3: %s unexpected (ident or '/' wanted)",lex2str(lex)); sprintf(p->errstr,"3: %s unexpected (ident or '/' wanted)",
lex2str(lex));
return MY_XML_ERROR; return MY_XML_ERROR;
} }
...@@ -256,7 +264,8 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len) ...@@ -256,7 +264,8 @@ int my_xml_parse(MY_XML_PARSER *p,const char *str, uint len)
} }
else else
{ {
sprintf(p->errstr,"4: %s unexpected (ident or string wanted)",lex2str(lex)); sprintf(p->errstr,"4: %s unexpected (ident or string wanted)",
lex2str(lex));
return MY_XML_ERROR; return MY_XML_ERROR;
} }
} }
...@@ -318,35 +327,47 @@ gt: ...@@ -318,35 +327,47 @@ gt:
return MY_XML_OK; return MY_XML_OK;
} }
void my_xml_parser_create(MY_XML_PARSER *p) void my_xml_parser_create(MY_XML_PARSER *p)
{ {
bzero((void*)p,sizeof(p[0])); bzero((void*)p,sizeof(p[0]));
} }
void my_xml_parser_free(MY_XML_PARSER *p __attribute__((unused))) void my_xml_parser_free(MY_XML_PARSER *p __attribute__((unused)))
{ {
} }
void my_xml_set_value_handler(MY_XML_PARSER *p, int (*action)(MY_XML_PARSER *p, const char *s, uint l))
void my_xml_set_value_handler(MY_XML_PARSER *p,
int (*action)(MY_XML_PARSER *p, const char *s,
uint l))
{ {
p->value=action; p->value=action;
} }
void my_xml_set_enter_handler(MY_XML_PARSER *p, int (*action)(MY_XML_PARSER *p, const char *s, uint l)) void my_xml_set_enter_handler(MY_XML_PARSER *p,
int (*action)(MY_XML_PARSER *p, const char *s,
uint l))
{ {
p->enter=action; p->enter=action;
} }
void my_xml_set_leave_handler(MY_XML_PARSER *p, int (*action)(MY_XML_PARSER *p, const char *s, uint l))
void my_xml_set_leave_handler(MY_XML_PARSER *p,
int (*action)(MY_XML_PARSER *p, const char *s,
uint l))
{ {
p->leave=action; p->leave_xml=action;
} }
void my_xml_set_user_data(MY_XML_PARSER *p, void *user_data) void my_xml_set_user_data(MY_XML_PARSER *p, void *user_data)
{ {
p->user_data=user_data; p->user_data=user_data;
} }
const char *my_xml_error_string(MY_XML_PARSER *p) const char *my_xml_error_string(MY_XML_PARSER *p)
{ {
return p->errstr; return p->errstr;
...@@ -358,8 +379,10 @@ uint my_xml_error_pos(MY_XML_PARSER *p) ...@@ -358,8 +379,10 @@ uint my_xml_error_pos(MY_XML_PARSER *p)
const char *beg=p->beg; const char *beg=p->beg;
const char *s; const char *s;
for ( s=p->beg ; s<p->cur; s++) for ( s=p->beg ; s<p->cur; s++)
{
if (s[0]=='\n') if (s[0]=='\n')
beg=s; beg=s;
}
return p->cur-beg; return p->cur-beg;
} }
...@@ -368,7 +391,9 @@ uint my_xml_error_lineno(MY_XML_PARSER *p) ...@@ -368,7 +391,9 @@ uint my_xml_error_lineno(MY_XML_PARSER *p)
uint res=0; uint res=0;
const char *s; const char *s;
for ( s=p->beg ; s<p->cur; s++) for ( s=p->beg ; s<p->cur; s++)
{
if (s[0]=='\n') if (s[0]=='\n')
res++; res++;
}
return res; return res;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment