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]