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]

Reply via email to