sas Sat Mar 3 13:22:13 2001 EDT Modified files: /php4/ext/ircg ircg.c ircg_scanner.re Log: Finally fix the handler API to always pass smart_str's to the handlers. format_msg now takes smart_str's only as parameters. This easily saves a couple of million strlen's for one million messages.
Index: php4/ext/ircg/ircg.c diff -u php4/ext/ircg/ircg.c:1.42 php4/ext/ircg/ircg.c:1.43 --- php4/ext/ircg/ircg.c:1.42 Sat Mar 3 08:26:55 2001 +++ php4/ext/ircg/ircg.c Sat Mar 3 13:22:12 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ircg.c,v 1.42 2001/03/03 16:26:55 sas Exp $ */ +/* $Id: ircg.c,v 1.43 2001/03/03 21:22:12 sas Exp $ */ #include "php.h" #include "php_ini.h" @@ -181,9 +181,9 @@ free(conn); } -void ircg_mirc_color(const char *, smart_str *); +void ircg_mirc_color(const char *, smart_str *, size_t); -static void format_msg(const char *fmt, const char *channel, const char *to, const char *from, const char *msg, smart_str *result) +static void format_msg(const char *fmt, smart_str *channel, smart_str *to, smart_str +*from, smart_str *msg, smart_str *result) { const char *p; char c; @@ -206,17 +206,17 @@ switch (c) { case 'c': - smart_str_appends_ex(result, channel, 1); + smart_str_append_ex(result, channel, 1); break; case 't': - smart_str_appends_ex(result, to, 1); + smart_str_append_ex(result, to, 1); break; case 'f': - smart_str_appends_ex(result, from, 1); + smart_str_append_ex(result, from, 1); break; case 'm': if (!encoded) { - ircg_mirc_color(msg, &encoded_msg); + ircg_mirc_color(msg->c, &encoded_msg, msg->len); encoded = 1; } smart_str_append_ex(result, &encoded_msg, 1); @@ -225,7 +225,7 @@ smart_str_appendc_ex(result, c, 1); break; case 'r': - smart_str_appends_ex(result, msg, 1); + smart_str_append_ex(result, msg, 1); break; case 0: goto finish_loop; @@ -249,7 +249,7 @@ #include "SAPI.h" -#define ADD_HEADER(a) sapi_add_header(a, strlen(a), 1) +#define ADD_HEADER(a) sapi_add_header(a, sizeof(a) - 1, 1) static void msg_http_start(php_irconn_t *conn) { @@ -300,7 +300,7 @@ } -static void handle_ctcp(php_irconn_t *conn, const char *chan, const char *from, +static void handle_ctcp(php_irconn_t *conn, smart_str *chan, smart_str *from, smart_str *msg, smart_str *result) { char *token_end; @@ -316,6 +316,7 @@ real_msg_end = strchr(real_msg, '\001'); if (real_msg_end) { char *fmt_msg; + smart_str tmp, tmp2; *real_msg_end = '\0'; *token_end = '\0'; @@ -324,27 +325,29 @@ return; } - format_msg(fmt_msg, chan, conn->conn.username, from, real_msg, - result); + smart_str_setl(&tmp, real_msg, real_msg_end - real_msg); + smart_str_setl(&tmp2, conn->conn.username, +conn->conn.username_len); + format_msg(fmt_msg, chan, &tmp2, from, &tmp, result); } } } -static void msg_handler(irconn_t *ircc, const char *chan, const char *from, +static void msg_handler(irconn_t *ircc, smart_str *chan, smart_str *from, smart_str *msg, void *conn_data, void *chan_data) { php_irconn_t *conn = conn_data; smart_str m = {0}; + smart_str s_username; + smart_str_setl(&s_username, ircc->username, ircc->username_len); if (msg->c[0] == '\001') { handle_ctcp(conn, chan, from, msg, &m); } else if (chan) { - format_msg(MSG(conn, FMT_MSG_CHAN), chan, ircc->username, from, msg->c, - &m); + format_msg(MSG(conn, FMT_MSG_CHAN), chan, &s_username, from, msg, &m); } else { - format_msg(MSG(conn, FMT_MSG_PRIV_TO_ME), NULL, ircc->username, from, - msg->c, &m); + format_msg(MSG(conn, FMT_MSG_PRIV_TO_ME), NULL, &s_username, from, + msg, &m); } msg_send(conn, &m); @@ -356,7 +359,7 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_NICK), NULL, newnick->c, oldnick->c, NULL, + format_msg(MSG(conn, FMT_MSG_NICK), NULL, newnick, oldnick, NULL, &m); msg_send(conn, &m); } @@ -367,8 +370,8 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_WHOIS_USER), host->c, user->c, nick->c, - real_name->c, &m); + format_msg(MSG(conn, FMT_MSG_WHOIS_USER), host, user, nick, + real_name, &m); msg_send(conn, &m); } @@ -379,8 +382,8 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_WHOIS_SERVER), server->c, NULL, nick->c, - server_info->c, &m); + format_msg(MSG(conn, FMT_MSG_WHOIS_SERVER), server, NULL, nick, + server_info, &m); msg_send(conn, &m); } @@ -391,8 +394,8 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_WHOIS_IDLE), NULL, NULL, nick->c, - idletime->c, &m); + format_msg(MSG(conn, FMT_MSG_WHOIS_IDLE), NULL, NULL, nick, + idletime, &m); msg_send(conn, &m); } @@ -401,7 +404,7 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_WHOIS_END), NULL, NULL, nick->c, NULL, &m); + format_msg(MSG(conn, FMT_MSG_WHOIS_END), NULL, NULL, nick, NULL, &m); msg_send(conn, &m); } @@ -414,8 +417,8 @@ int i; for (i = 0; i < nr; i++) { - format_msg(MSG(conn, FMT_MSG_WHOIS_CHANNEL), channels[i].c, NULL, - nick->c, NULL, &m); + format_msg(MSG(conn, FMT_MSG_WHOIS_CHANNEL), &channels[i], NULL, + nick, NULL, &m); } msg_send(conn, &m); } @@ -425,14 +428,18 @@ { php_irconn_t *conn = conn_data; smart_str m = {0}; + smart_str s_username; + smart_str tmp; + smart_str_setl(&tmp, "IRC SERVER", sizeof("IRC SERVER") - 1); + smart_str_setl(&s_username, ircc->username, ircc->username_len); format_msg(MSG(conn, fatal ? FMT_MSG_FATAL_ERROR : FMT_MSG_ERROR), NULL, - ircc->username, "IRC SERVER", msg->c, &m); + &s_username, &tmp, msg, &m); msg_send(conn, &m); } -static void user_add(irconn_t *ircc, const char *channel, smart_str *users, +static void user_add(irconn_t *ircc, smart_str *channel, smart_str *users, int nr, void *dummy) { php_irconn_t *conn = dummy; @@ -441,47 +448,51 @@ if (nr > 1) { format_msg(MSG(conn, FMT_MSG_MASS_JOIN_BEGIN), channel, NULL, NULL, - "", &m); + NULL, &m); for (i = 0; i < nr; i++) { format_msg(MSG(conn, FMT_MSG_MASS_JOIN_ELEMENT), channel, NULL, - users[i].c, "", &m); + &users[i], NULL, &m); } format_msg(MSG(conn, FMT_MSG_MASS_JOIN_END), channel, NULL, NULL, - "", &m); + NULL, &m); } else { - format_msg(MSG(conn, FMT_MSG_JOIN), channel, NULL, users[0].c, - "", &m); + format_msg(MSG(conn, FMT_MSG_JOIN), channel, NULL, &users[0], + NULL, &m); format_msg(MSG(conn, FMT_MSG_JOIN_LIST_END), channel, NULL, NULL, - "", &m); + NULL, &m); } msg_send(conn, &m); } -static void new_topic(irconn_t *ircc, const char *channel, smart_str *who, smart_str *topic, void *dummy) +static void new_topic(irconn_t *ircc, smart_str *channel, smart_str *who, smart_str +*topic, void *dummy) { php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_TOPIC), channel, NULL, who->c, topic->c, &m); + format_msg(MSG(conn, FMT_MSG_TOPIC), channel, NULL, who, topic, &m); msg_send(conn, &m); } -static void part_handler(irconn_t *ircc, const char *channel, void *dummy) +static void part_handler(irconn_t *ircc, smart_str *channel, void *dummy) { php_irconn_t *conn = dummy; smart_str m = {0}; + smart_str s_username; - format_msg(MSG(conn, FMT_MSG_SELF_PART), channel, NULL, conn->conn.username, "", &m); + smart_str_setl(&s_username, ircc->username, ircc->username_len); + + format_msg(MSG(conn, FMT_MSG_SELF_PART), channel, NULL, &s_username, + NULL, &m); msg_send(conn, &m); } -static void user_leave(irconn_t *ircc, const char *channel, smart_str *user, void *dummy) +static void user_leave(irconn_t *ircc, smart_str *channel, smart_str *user, void +*dummy) { php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_LEAVE), channel, NULL, user->c, "", &m); + format_msg(MSG(conn, FMT_MSG_LEAVE), channel, NULL, user, NULL, &m); msg_send(conn, &m); } @@ -490,16 +501,16 @@ php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_QUIT), NULL, NULL, user->c, msg->c, &m); + format_msg(MSG(conn, FMT_MSG_QUIT), NULL, NULL, user, msg, &m); msg_send(conn, &m); } -static void user_kick(irconn_t *ircc, const char *channel, smart_str *who, smart_str *kicked_by, smart_str *reason, void *dummy) +static void user_kick(irconn_t *ircc, smart_str *channel, smart_str *who, smart_str +*kicked_by, smart_str *reason, void *dummy) { php_irconn_t *conn = dummy; smart_str m = {0}; - format_msg(MSG(conn, FMT_MSG_KICK), channel, who->c, kicked_by->c, reason?reason->c:"", &m); + format_msg(MSG(conn, FMT_MSG_KICK), channel, who, kicked_by, reason, &m); msg_send(conn, &m); } @@ -914,6 +925,7 @@ php_irconn_t *conn; smart_str l = {0}; smart_str m = {0}; + smart_str tmp, tmp2; if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &id, &recipient, &msg) == FAILURE) WRONG_PARAM_COUNT; @@ -928,23 +940,25 @@ irc_msg(&conn->conn, Z_STRVAL_PP(recipient), Z_STRVAL_PP(msg)); smart_str_setl(&l, Z_STRVAL_PP(msg), Z_STRLEN_PP(msg)); - + + smart_str_setl(&tmp, Z_STRVAL_PP(recipient), Z_STRLEN_PP(recipient)); + smart_str_setl(&tmp2, conn->conn.username, conn->conn.username_len); + switch (Z_STRVAL_PP(recipient)[0]) { case '#': case '&': if (l.c[0] == 1) { - handle_ctcp(conn, Z_STRVAL_PP(recipient), conn->conn.username, &l, &m); + handle_ctcp(conn, &tmp, &tmp2, &l, &m); } else { - format_msg(MSG(conn, FMT_MSG_CHAN), Z_STRVAL_PP(recipient), - NULL, conn->conn.username, l.c, &m); + format_msg(MSG(conn, FMT_MSG_CHAN), &tmp, NULL, &tmp2, &l, &m); } break; default: if (l.c[0] == 1) { - handle_ctcp(conn, NULL, conn->conn.username, &l, &m); + handle_ctcp(conn, NULL, &tmp2, &l, &m); } else { format_msg(MSG(conn, FMT_MSG_PRIV_FROM_ME), NULL, - Z_STRVAL_PP(recipient), conn->conn.username, l.c, &m); + &tmp, &tmp2, &l, &m); } } Index: php4/ext/ircg/ircg_scanner.re diff -u php4/ext/ircg/ircg_scanner.re:1.5 php4/ext/ircg/ircg_scanner.re:1.6 --- php4/ext/ircg/ircg_scanner.re:1.5 Sat Mar 3 09:01:31 2001 +++ php4/ext/ircg/ircg_scanner.re Sat Mar 3 13:22:13 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ircg_scanner.re,v 1.5 2001/03/03 17:01:31 sas Exp $ */ +/* $Id: ircg_scanner.re,v 1.6 2001/03/03 21:22:13 sas Exp $ */ #include <ext/standard/php_smart_str.h> #include <stdio.h> @@ -151,17 +151,17 @@ smart_str_appends(ctx->result, entity); } -void ircg_mirc_color(const char *msg, smart_str *result) { +void ircg_mirc_color(const char *msg, smart_str *result, size_t msg_len) { int mode = STATE_PLAIN; const char *end, *xp, *q, *start; - size_t msg_len; ircg_msg_scanner mctx, *ctx = &mctx; mctx.result = result; mctx.scheme.c = NULL; mctx.font_tag_open = 0; - msg_len = strlen(msg); + if (msg_len == -1) + msg_len = strlen(msg); end = msg + msg_len; xp = msg;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]