sas             Sun Dec  1 01:30:02 2002 EDT

  Modified files:              
    /php4/ext/ircg      ircg.c ircg_scanner.c ircg_scanner.re 
                        php_ircg_alloc.h 
  Log:
  expand define's
  make the msg scanner use shared memory, if necessary
  replace the msg cache with a more predictable algorithm
  
  
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.148 php4/ext/ircg/ircg.c:1.149
--- php4/ext/ircg/ircg.c:1.148  Sat Nov 30 23:53:59 2002
+++ php4/ext/ircg/ircg.c        Sun Dec  1 01:30:01 2002
@@ -16,7 +16,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: ircg.c,v 1.148 2002/12/01 04:53:59 sas Exp $ */
+/* $Id: ircg.c,v 1.149 2002/12/01 06:30:01 sas Exp $ */
 
 /* {{{ includes */
 
@@ -28,10 +28,6 @@
 #include "config.h"
 #endif
 
-/* for smart_strs */
-#define realloc(a,b) IRCG_SHARED_REALLOC(a,b)
-#define free(a) IRCG_SHARED_FREE(a)
-
 #include "php.h"
 #include "php_ini.h"
 #include "php_ircg.h"
@@ -76,43 +72,35 @@
 
 /* provide dummy definitions */
 #include "php_ircg_hash.h"
-#include "php_ircg_alloc.h"
 #include "php_ircg_lock.h"
 
 #else
 #include <ircg_resource.h>
-#include <ircg_alloc.h>
 #include <ircg_hash.h>
 #include <ircg_lock.h>
 #endif
 
+#include "php_ircg_alloc.h"
+
 #include "ext/standard/php_smart_str.h"
 
 static struct {
        ircg_hash_table h_fmt_msgs;
 
        IRCG_LOCK(fmt_msgs_lock);
-#define h_fmt_msgs php_ircg->h_fmt_msgs
-#define fmt_msgs_lock php_ircg->fmt_msgs_lock
 
        /* these just serve statistical/entertainment purposes */
        unsigned long irc_connects, irc_set_currents, irc_quit_handlers, 
                        exec_fmt_msgs, exec_token_compiler;
 
-#define irc_connects  php_ircg->irc_connects
-#define irc_set_currents  php_ircg->irc_set_currents
-#define irc_quit_handlers  php_ircg->irc_quit_handlers
-#define exec_fmt_msgs  php_ircg->exec_fmt_msgs
-#define exec_token_compiler  php_ircg->exec_token_compiler
+       unsigned long cache_hits, cache_misses;
+
 
        time_t next_gc;
-#define next_gc php_ircg->next_gc
 
        struct errormsg *error_msgs;
-#define error_msgs php_ircg->error_msgs
 
        IRCG_LOCK(error_msgs_lock);
-#define error_msgs_lock php_ircg->error_msgs_lock
 } *php_ircg;
 
 /* }}} */
@@ -373,7 +361,7 @@
 {
        php_fmt_msgs_t *ret;
 
-       if (ircg_hash_find(&h_fmt_msgs, Z_STRVAL_PP(id), Z_STRLEN_PP(id), (void **) 
&ret) == FAILURE)
+       if (ircg_hash_find(&php_ircg->h_fmt_msgs, Z_STRVAL_PP(id), Z_STRLEN_PP(id), 
+(void **) &ret) == FAILURE)
                return NULL;
        return ret;
 }
@@ -442,7 +430,7 @@
 {
        php_irconn_t *conn = dummy;
 
-       irc_quit_handlers++;
+       php_ircg->irc_quit_handlers++;
        if (conn->fd > -1) {
 #ifdef USE_FD2IRCONN
                ircg_hash_index_del(&h_fd2irconn, conn->fd);
@@ -562,56 +550,85 @@
    are sent to channels (and hence used multiple times). */
 void ircg_mirc_color(const char *, smart_str *, size_t, int, int);
 
-#define NR_CACHE_ENTRIES 983
 
-static unsigned long cache_hits, cache_misses, cache_collisions;
+#undef MIN
+#define MIN(a,b) (a<b?a:b)
 
-struct {
-       smart_str src;
-       smart_str result;
-} static cache_entries[NR_CACHE_ENTRIES];
-
-static inline php_uint32 ghash(smart_str *str)
+static inline php_uint32 ghash(smart_str *str, int auto_links, int gen_br)
 {
        php_uint32 h;
-       const char *data = str->c, *e = str->c + str->len;
+       const char *data = str->c, *e = str->c + MIN(3, str->len);
        
        for (h = 2166136261U; data < e; ) {
                h *= 16777619;
                h ^= *data++;
        }
+       h *= 16777619;
+       h ^= auto_links ? 1 : 2;
+       h *= 16777619;
+       h ^= gen_br ? 1 : 2;
        
        return h;
 }
 /* }}} */
 
+struct cache_entry {
+       php_uint32 h;
+       char mask;
+       smart_str src;
+       smart_str result;
+};
+
+static struct cache_entry *cache_entries;
+static int last_ce_write;
+
+#define NR_CACHE_ENTRIES 8
+
+
 /* {{{ ircg_mirc_color_cache */
 void ircg_mirc_color_cache(smart_str *src, smart_str *result,
                smart_str *channel, int auto_links, int gen_br)
 {
-       channel = (void *) 1;
        /* We only cache messages in the context of a channel */
-       if (channel) {
+       if (channel && cache_entries) {
                int hash;
+               int i;
+               char mask = (auto_links ? 1 : 0) | (gen_br ? 2 : 0); 
+               struct cache_entry *ce = cache_entries + last_ce_write;
+               struct cache_entry *cee = cache_entries + NR_CACHE_ENTRIES;
                
-               hash = ghash(src) % NR_CACHE_ENTRIES;
+               hash = ghash(src, auto_links, gen_br);
 
-               if (cache_entries[hash].src.len == src->len &&
-                               memcmp(cache_entries[hash].src.c, src->c, src->len) == 
0) {
-                       cache_hits++;
-               } else {
-                       cache_misses++;
-                       
-                       if (cache_entries[hash].src.len != 0) {
-                               cache_collisions++;
-                               cache_entries[hash].src.len = 0;
+               /* we search forward .. */
+               for (i = 0; i < NR_CACHE_ENTRIES; i++) {
+                       if (ce->h == hash
+                                       && ce->mask == mask
+                                       && ce->src.len == src->len
+                                       && memcmp(ce->src.c, src->c, src->len) == 0) {
+                               php_ircg->cache_hits++;
+                               goto found;
                        }
-                       cache_entries[hash].result.len = 0;
-                       ircg_mirc_color(src->c, &cache_entries[hash].result, src->len, 
auto_links, gen_br);
-                       
-                       smart_str_append_ex(&cache_entries[hash].src, src, 1);
+                       if (++ce >= cee)
+                               ce = cache_entries;
                }
-               smart_str_append_ex(result, &cache_entries[hash].result, 1);
+
+               php_ircg->cache_misses++;
+               /* .. and insert in the reverse direction */
+
+               if (--last_ce_write < 0)
+                       last_ce_write = NR_CACHE_ENTRIES - 1;
+
+               ce = cache_entries + last_ce_write;
+               ce->h = hash;
+               ce->mask = mask;
+               ce->src.len = 0;
+               ce->result.len = 0;
+               
+               smart_str_append_ex(&ce->src, src, 1);
+               ircg_mirc_color(ce->src.c, &ce->result, ce->src.len, auto_links, 
+gen_br);
+               
+found:
+               smart_str_append_ex(result, &ce->result, 1);
        } else {
                /* No channel message, no caching */
                ircg_mirc_color(src->c, result, src->len, auto_links, gen_br);
@@ -634,7 +651,7 @@
        char c;
        smart_str *s;
 
-       exec_token_compiler++;
+       php_ircg->exec_token_compiler++;
        
        if (fmt[0] == '\0') {
                f->t = NULL;
@@ -709,7 +726,7 @@
        const token_t *t = fmt_msg->t;
        int ntoken = fmt_msg->ntoken;
        
-       exec_fmt_msgs++;
+       php_ircg->exec_fmt_msgs++;
        
 #define IRCG_APPEND(what)                                                      \
                if (t[i].para.v & P_COND_STOP) {                        \
@@ -1164,11 +1181,11 @@
        struct errormsg *m, *prev = NULL, *next;
        time_t lim;
 
-       IRCG_LOCK_GET(error_msgs_lock);
+       IRCG_LOCK_GET(php_ircg->error_msgs_lock);
        lim = now - GC_INTVL;
-       next_gc = now + GC_INTVL;
+       php_ircg->next_gc = now + GC_INTVL;
        
-       for (m = error_msgs; m; prev = m, m = m->next) {
+       for (m = php_ircg->error_msgs; m; prev = m, m = m->next) {
                if (m->when < lim) {
                        struct errormsg *to;
                        /* Check whether we have subsequent outdated records */
@@ -1184,21 +1201,21 @@
                        if (prev)
                                prev->next = to;
                        else
-                               error_msgs = to;
+                               php_ircg->error_msgs = to;
                        
                        if (!to) break;
                        m = to;
                }
        }
-       IRCG_LOCK_PUT(error_msgs_lock);
+       IRCG_LOCK_PUT(php_ircg->error_msgs_lock);
 }
 
 static void add_error_msg(smart_str *msg, int msgid, php_irconn_t *conn)
 {
        struct errormsg *m;
 
-       IRCG_LOCK_GET(error_msgs_lock);
-       for (m = error_msgs; m; m = m->next) {
+       IRCG_LOCK_GET(php_ircg->error_msgs_lock);
+       for (m = php_ircg->error_msgs; m; m = m->next) {
                if (m->id == conn->irconn_id) break;
        }
 
@@ -1212,27 +1229,27 @@
        m->msg.len = 0;
        smart_str_append_ex(&m->msg, msg, 1);
        m->msgid = msgid;
-       m->next = error_msgs;
-       error_msgs = m;
-       IRCG_LOCK_PUT(error_msgs_lock);
+       m->next = php_ircg->error_msgs;
+       php_ircg->error_msgs = m;
+       IRCG_LOCK_PUT(php_ircg->error_msgs_lock);
 }
 
 static struct errormsg *lookup_and_remove_error_msg(int id)
 {
        struct errormsg *m, *prev = NULL;
 
-       IRCG_LOCK_GET(error_msgs_lock);
-       for (m = error_msgs; m; prev = m, m = m->next) {
+       IRCG_LOCK_GET(php_ircg->error_msgs_lock);
+       for (m = php_ircg->error_msgs; m; prev = m, m = m->next) {
                if (m->id == id) {
                        if (prev)
                                prev->next = m->next;
                        else
-                               error_msgs = m->next;
+                               php_ircg->error_msgs = m->next;
 
                        break;
                }
        }
-       IRCG_LOCK_PUT(error_msgs_lock);
+       IRCG_LOCK_PUT(php_ircg->error_msgs_lock);
        return m;
 }
 
@@ -1572,7 +1589,7 @@
                conn->fd = -1;
        }
 
-       irc_set_currents++;
+       php_ircg->irc_set_currents++;
        
        if (php_ircg_register_with_sapi(&conn->fd TSRMLS_CC) 
 #ifdef USE_FD2IRCONN
@@ -2051,11 +2068,11 @@
                        token_compiler("", &fmt_msgs.fmt_msgs[i]);
        }
 
-       IRCG_LOCK_GET(fmt_msgs_lock);
-       ircg_hash_update(&h_fmt_msgs, Z_STRVAL_PP(p1), Z_STRLEN_PP(p1), 
+       IRCG_LOCK_GET(php_ircg->fmt_msgs_lock);
+       ircg_hash_update(&php_ircg->h_fmt_msgs, Z_STRVAL_PP(p1), Z_STRLEN_PP(p1), 
                &fmt_msgs, sizeof(fmt_msgs), NULL);
 
-       IRCG_LOCK_PUT(fmt_msgs_lock);
+       IRCG_LOCK_PUT(php_ircg->fmt_msgs_lock);
        
        RETVAL_TRUE;    
 }
@@ -2254,7 +2271,7 @@
                IRCG_SHARED_FREE(conn);
                RETURN_FALSE;
        }
-       irc_connects++;
+       php_ircg->irc_connects++;
        ircg_hash_init(&conn->ctcp_msgs, 10, NULL, (dtor_func_t) ctcp_msgs_dtor, 1);
        if (p5 && Z_TYPE_PP(p5) == IS_ARRAY) {
                ircg_copy_ctcp_msgs(p5, conn);
@@ -2280,7 +2297,7 @@
        conn->login = php_ircg_now();
                
        /* XXX: we take chances by assuming that wordsize read/writes are atomic */
-       if (conn->login >= next_gc)
+       if (conn->login >= php_ircg->next_gc)
                error_msg_gc(conn->login);
 
        RETVAL_LONG(conn->irconn_id);
@@ -2596,12 +2613,15 @@
                php_ircg = IRCG_SHARED_ALLOC(sizeof *php_ircg);
                memset(php_ircg, 0, sizeof *php_ircg);
        
-               IRCG_LOCK_INIT(fmt_msgs_lock);
-               IRCG_LOCK_INIT(error_msgs_lock);
+               IRCG_LOCK_INIT(php_ircg->fmt_msgs_lock);
+               IRCG_LOCK_INIT(php_ircg->error_msgs_lock);
 
                for (i = 0; i < NO_FMTS; i++) {
                        token_compiler(fmt_msgs_default[i], 
&fmt_msgs_default_compiled.fmt_msgs[i]);
                }
+       } else if (stage == 1) {
+               cache_entries = malloc(sizeof(struct cache_entry) * NR_CACHE_ENTRIES);
+               memset(cache_entries, 0, sizeof(struct cache_entry) * 
+NR_CACHE_ENTRIES);
        }
 }
 
@@ -2632,7 +2652,7 @@
        setup(1);
 #endif
        
-       ircg_hash_init(&h_fmt_msgs, 0, NULL, fmt_msgs_dtor, 1);
+       ircg_hash_init(&php_ircg->h_fmt_msgs, 0, NULL, fmt_msgs_dtor, 1);
 #ifdef USE_FD2IRCONN   
        ircg_hash_init(&h_fd2irconn, 0, NULL, NULL, 1);
 #endif
@@ -2647,7 +2667,7 @@
  */
 PHP_MSHUTDOWN_FUNCTION(ircg)
 {
-       ircg_hash_destroy(&h_fmt_msgs);
+       ircg_hash_destroy(&php_ircg->h_fmt_msgs);
 #ifdef USE_IRCONN_MANAGEMENT
        ircg_hash_destroy(&h_irconn);
 #endif
@@ -2655,8 +2675,8 @@
        ircg_hash_destroy(&h_fd2irconn);
 #endif
 
-       IRCG_LOCK_DESTROY(fmt_msgs_lock);
-       IRCG_LOCK_DESTROY(error_msgs_lock);
+       IRCG_LOCK_DESTROY(php_ircg->fmt_msgs_lock);
+       IRCG_LOCK_DESTROY(php_ircg->error_msgs_lock);
 
        ircg_shutdown_global();
        
@@ -2672,22 +2692,20 @@
 
        php_info_print_table_start();
        php_info_print_table_header(2, "ircg support", "enabled");
-       sprintf(buf, "%lu", cache_hits);
-       php_info_print_table_row(2, "scanner result cache hits", buf);
-       sprintf(buf, "%lu", cache_misses);
-       php_info_print_table_row(2, "scanner result cache misses", buf);
-       sprintf(buf, "%lu", cache_collisions);
-       php_info_print_table_row(2, "scanner result cache collisions", buf);
-       sprintf(buf, "%lu", exec_fmt_msgs);
-       php_info_print_table_row(2, "executed format messages", buf);
-       sprintf(buf, "%lu", exec_token_compiler);
-       php_info_print_table_row(2, "number of tokenizer invocations", buf);
-       sprintf(buf, "%lu", irc_connects);
-       php_info_print_table_row(2, "irc_connects", buf);
-       sprintf(buf, "%lu", irc_set_currents);
-       php_info_print_table_row(2, "irc_set_currents", buf);
-       sprintf(buf, "%lu", irc_quit_handlers);
-       php_info_print_table_row(2, "irc_quit_handlers", buf);
+       sprintf(buf, "%lu", php_ircg->cache_hits);
+       php_info_print_table_row(2, "Scanner result cache hits", buf);
+       sprintf(buf, "%lu", php_ircg->cache_misses);
+       php_info_print_table_row(2, "Scanner result cache misses", buf);
+       sprintf(buf, "%lu", php_ircg->exec_fmt_msgs);
+       php_info_print_table_row(2, "Executed format messages", buf);
+       sprintf(buf, "%lu", php_ircg->exec_token_compiler);
+       php_info_print_table_row(2, "Tokenizer invocations", buf);
+       sprintf(buf, "%lu", php_ircg->irc_connects);
+       php_info_print_table_row(2, "IRC connects", buf);
+       sprintf(buf, "%lu", php_ircg->irc_set_currents);
+       php_info_print_table_row(2, "Persistent HTTP connections", buf);
+       sprintf(buf, "%lu", php_ircg->irc_quit_handlers);
+       php_info_print_table_row(2, "Terminated IRC connections", buf);
        php_info_print_table_end();
 }
 /* }}} */
Index: php4/ext/ircg/ircg_scanner.c
diff -u php4/ext/ircg/ircg_scanner.c:1.19 php4/ext/ircg/ircg_scanner.c:1.20
--- php4/ext/ircg/ircg_scanner.c:1.19   Thu Feb 28 03:26:18 2002
+++ php4/ext/ircg/ircg_scanner.c        Sun Dec  1 01:30:01 2002
@@ -1,5 +1,5 @@
-/* Generated by re2c 0.5 on Thu Oct  4 11:24:04 2001 */
-#line 1 "ircg_scanner.re"
+/* Generated by re2c 0.5 on Sun Dec  1 07:27:15 2002 */
+#line 1 "/lrg2/php4/ext/ircg/ircg_scanner.re"
 /*
    +----------------------------------------------------------------------+
    | PHP Version 4                                                        |
@@ -18,7 +18,9 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: ircg_scanner.c,v 1.19 2002/02/28 08:26:18 sebastian Exp $ */
+/* $Id: ircg_scanner.c,v 1.20 2002/12/01 06:30:01 sas Exp $ */
+
+#include "php_ircg_alloc.h"
 
 #include <ext/standard/php_smart_str.h>
 #include <stdio.h>
@@ -64,7 +66,7 @@
        smart_str *result;
 } ircg_msg_scanner;
 
-#line 79
+#line 81
 
 
 #define YYFILL(n) do { } while (0)
@@ -308,43 +310,43 @@
                if(yych <= 'z') goto yy25;
        }
 yy4:
-#line 232
+#line 234
        { passthru(STD_ARGS); goto state_plain; }
 yy5:   yych = *++YYCURSOR;
 yy6:
-#line 223
+#line 225
        { mctx.fg_code = mctx.bg_code = -1; goto state_color_fg; }
 yy7:   yych = *++YYCURSOR;
 yy8:
-#line 224
+#line 226
        { add_entity(STD_ARGS, "&lt;"); goto state_plain; }
 yy9:   yych = *++YYCURSOR;
 yy10:
-#line 225
+#line 227
        { add_entity(STD_ARGS, "&gt;"); goto state_plain; }
 yy11:  yych = *++YYCURSOR;
 yy12:
-#line 226
+#line 228
        { add_entity(STD_ARGS, "&amp;"); goto state_plain; }
 yy13:  yych = *++YYCURSOR;
 yy14:
-#line 227
+#line 229
        { add_entity(STD_ARGS, "&quot;"); goto state_plain; }
 yy15:  yych = *++YYCURSOR;
 yy16:
-#line 228
-       { if (gen_br) smart_str_appendl_ex(ctx->result, "<br>", 4, 1); goto 
state_plain; }
+#line 230
+       { if (gen_br) smart_str_appendl_ex(result, "<br>", 4, 1); goto state_plain; }
 yy17:  yych = *++YYCURSOR;
 yy18:
-#line 229
+#line 231
        { handle_bold(STD_ARGS, 0); goto state_plain; }
 yy19:  yych = *++YYCURSOR;
 yy20:
-#line 230
+#line 232
        { handle_underline(STD_ARGS, 0); goto state_plain; }
 yy21:  yych = *++YYCURSOR;
 yy22:
-#line 231
+#line 233
        { handle_italic(STD_ARGS, 0); goto state_plain; }
 yy23:  yych = *++YYCURSOR;
        goto yy4;
@@ -359,10 +361,10 @@
        if(yych != '/') goto yy2;
 yy28:  yych = *++YYCURSOR;
 yy29:
-#line 222
+#line 224
        { if (auto_links) { handle_scheme(STD_ARGS); goto state_url; } else { 
passthru(STD_ARGS); goto state_plain; } }
 }
-#line 233
+#line 235
 
 
 state_url:             
@@ -428,11 +430,11 @@
 yy32:  yych = *++YYCURSOR;
        goto yy37;
 yy33:
-#line 238
+#line 240
        { handle_url(STD_ARGS); goto state_plain; }
 yy34:  yych = *++YYCURSOR;
 yy35:
-#line 239
+#line 241
        { passthru(STD_ARGS); goto state_plain; }
 yy36:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
@@ -440,7 +442,7 @@
 yy37:  if(yybm[0+yych] & 128)  goto yy36;
        goto yy33;
 }
-#line 240
+#line 242
 
 
 
@@ -460,16 +462,16 @@
        if(yych <= '/') goto yy41;
        if(yych <= '9') goto yy44;
 yy41:
-#line 246
+#line 248
        { handle_color_digit(STD_ARGS, 0); goto state_color_comma; }
 yy42:  yych = *++YYCURSOR;
 yy43:
-#line 247
+#line 249
        { finish_color_stuff(STD_ARGS); passthru(STD_ARGS); goto state_plain; }
 yy44:  yych = *++YYCURSOR;
        goto yy41;
 }
-#line 248
+#line 250
 
 
                
@@ -486,14 +488,14 @@
        if(yych != ',') goto yy49;
 yy47:  yych = *++YYCURSOR;
 yy48:
-#line 254
+#line 256
        { goto state_color_bg; }
 yy49:  yych = *++YYCURSOR;
 yy50:
-#line 255
+#line 257
        { YYCURSOR--; commit_color_stuff(STD_ARGS); goto state_plain; }
 }
-#line 256
+#line 258
 
 
 
@@ -513,20 +515,20 @@
        if(yych <= '/') goto yy54;
        if(yych <= '9') goto yy57;
 yy54:
-#line 262
+#line 264
        { handle_color_digit(STD_ARGS, 1); commit_color_stuff(STD_ARGS); goto 
state_plain; }
 yy55:  yych = *++YYCURSOR;
 yy56:
-#line 263
+#line 265
        { commit_color_stuff(STD_ARGS); goto state_plain; }
 yy57:  yych = *++YYCURSOR;
        goto yy54;
 }
-#line 264
+#line 266
 
 
 stop:
-       smart_str_free_ex(&ctx->scheme, 1);
+       smart_str_free_ex(&mctx.scheme, 1);
 
        finish_color_stuff(STD_ARGS);
        handle_bold(STD_ARGS, 1);
Index: php4/ext/ircg/ircg_scanner.re
diff -u php4/ext/ircg/ircg_scanner.re:1.18 php4/ext/ircg/ircg_scanner.re:1.19
--- php4/ext/ircg/ircg_scanner.re:1.18  Thu Feb 28 03:26:18 2002
+++ php4/ext/ircg/ircg_scanner.re       Sun Dec  1 01:30:01 2002
@@ -16,7 +16,9 @@
    +----------------------------------------------------------------------+
  */
 
-/* $Id: ircg_scanner.re,v 1.18 2002/02/28 08:26:18 sebastian Exp $ */
+/* $Id: ircg_scanner.re,v 1.19 2002/12/01 06:30:01 sas Exp $ */
+
+#include "php_ircg_alloc.h"
 
 #include <ext/standard/php_smart_str.h>
 #include <stdio.h>
@@ -225,7 +227,7 @@
        ">"                             { add_entity(STD_ARGS, "&gt;"); goto 
state_plain; }
        "&"                             { add_entity(STD_ARGS, "&amp;"); goto 
state_plain; }
        winquotes               { add_entity(STD_ARGS, "&quot;"); goto state_plain; }
-       ircnl                   { if (gen_br) smart_str_appendl_ex(ctx->result, 
"<br>", 4, 1); goto state_plain; }
+       ircnl                   { if (gen_br) smart_str_appendl_ex(result, "<br>", 4, 
+1); goto state_plain; }
        bold                    { handle_bold(STD_ARGS, 0); goto state_plain; }
        underline               { handle_underline(STD_ARGS, 0); goto state_plain; }
        italic                  { handle_italic(STD_ARGS, 0); goto state_plain; }
@@ -264,7 +266,7 @@
 */
 
 stop:
-       smart_str_free_ex(&ctx->scheme, 1);
+       smart_str_free_ex(&mctx.scheme, 1);
 
        finish_color_stuff(STD_ARGS);
        handle_bold(STD_ARGS, 1);
Index: php4/ext/ircg/php_ircg_alloc.h
diff -u php4/ext/ircg/php_ircg_alloc.h:1.1 php4/ext/ircg/php_ircg_alloc.h:1.2
--- php4/ext/ircg/php_ircg_alloc.h:1.1  Sat Nov 30 22:47:49 2002
+++ php4/ext/ircg/php_ircg_alloc.h      Sun Dec  1 01:30:01 2002
@@ -1,5 +1,21 @@
+#ifndef PHP_IRCG_ALLOC_H
+#define PHP_IRCG_ALLOC_H
 
+#include <if_irc.h>
+
+#if IRCG_API_VERSION < 20021127
 #define IRCG_SHARED_ALLOC(a) malloc((a))
 #define IRCG_SHARED_REALLOC(a,b) realloc((a),(b))
 #define IRCG_SHARED_FREE(a) free((a))
+#else
+
+/* for smart_strs */
+#define realloc(a,b) IRCG_SHARED_REALLOC(a,b)
+#define free(a) IRCG_SHARED_FREE(a)
+
+#include <ircg_alloc.h>
+
+
+#endif
 
+#endif

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to