sas Fri Feb 16 11:01:23 2001 EDT
Added files:
/php4/ext/ircg ircg_scanner.c ircg_scanner.re
Modified files:
/php4/ext/ircg Makefile.in ircg.c
Log:
The new scanner adds HTML anchors automatically to a certain subset
of RFC 2396 URIs. The scanner also handles mIRC color codes.
Index: php4/ext/ircg/Makefile.in
diff -u php4/ext/ircg/Makefile.in:1.1 php4/ext/ircg/Makefile.in:1.2
--- php4/ext/ircg/Makefile.in:1.1 Mon Nov 13 06:51:09 2000
+++ php4/ext/ircg/Makefile.in Fri Feb 16 11:01:22 2001
@@ -1,8 +1,11 @@
-# $Id: Makefile.in,v 1.1 2000/11/13 14:51:09 sas Exp $
+# $Id: Makefile.in,v 1.2 2001/02/16 19:01:22 sas Exp $
LTLIBRARY_NAME = libircg.la
-LTLIBRARY_SOURCES = ircg.c
+LTLIBRARY_SOURCES = ircg.c ircg_scanner.c
LTLIBRARY_SHARED_NAME = ircg.la
LTLIBRARY_SHARED_LIBADD = $(IRCG_SHARED_LIBADD)
include $(top_srcdir)/build/dynlib.mk
+
+$(srcdir)/ircg_scanner.c: $(srcdir)/ircg_scanner.re
+ re2c -b $(srcdir)/ircg_scanner.re > $@
Index: php4/ext/ircg/ircg.c
diff -u php4/ext/ircg/ircg.c:1.22 php4/ext/ircg/ircg.c:1.23
--- php4/ext/ircg/ircg.c:1.22 Mon Jan 15 22:53:30 2001
+++ php4/ext/ircg/ircg.c Fri Feb 16 11:01:22 2001
@@ -16,6 +16,8 @@
+----------------------------------------------------------------------+
*/
+/* $Id: ircg.c,v 1.23 2001/02/16 19:01:22 sas Exp $ */
+
#include "php.h"
#include "php_ini.h"
#include "php_ircg.h"
@@ -155,92 +157,8 @@
zend_llist_destroy(&conn->buffer);
free(conn);
}
-
-static const char *color_list[] = {
- "white",
- "black",
- "blue",
- "green",
- "red",
- "brown",
- "purple",
- "orange",
- "yellow",
- "lightgreen",
- "teal",
- "lightcyan",
- "lightblue",
- "pink",
- "gray",
- "lightgrey"
-};
-static void mirc_color(const char *input, smart_str *result)
-{
- int mode = 0;
- const char *p;
- char c;
- int fg = -1, bg = -1;
- int font_open = 0;
-
- for (p = input; (c = *p); p++) {
- switch (mode) {
- case 0:
-evaluate_normal:
- if (c == '') {
- mode = 1;
- bg = fg = -1;
- } else {
- if (font_open) {
- smart_str_appends_ex(result, "</font>", 1);
- font_open = 0;
- }
- if (fg >= 0 && fg <= 15) {
- smart_str_appends_ex(result, "<font color=\"",
1);
- smart_str_appends_ex(result, color_list[fg],
1);
- smart_str_appends_ex(result, "\">", 1);
- font_open = 1;
- }
- smart_str_appendc_ex(result, c, 1);
- }
- break;
- case 1:
- if (isdigit(c)) {
- if (fg == -1) fg = 0;
- fg = fg * 10 + c - '0';
- if (fg > 10)
- mode = 2;
- } else {
- mode = 0;
- goto evaluate_normal;
- }
- break;
- case 2:
- if (c == ',') {
- mode = 3;
- } else {
- mode = 0;
- goto evaluate_normal;
- }
- break;
- case 3:
- if (isdigit(c)) {
- if (bg == -1) bg = 0;
- bg = bg * 10 + c - '0';
- if (bg > 10)
- mode = 0;
- } else {
- mode = 0;
- goto evaluate_normal;
- }
- break;
- }
- }
- if (font_open) {
- smart_str_appends_ex(result, "</font>", 1);
- font_open = 0;
- }
-}
+void ircg_mirc_color(const char *, smart_str *);
static void format_msg(const char *fmt, const char *channel, const char *to, const
char *from, const char *msg, smart_str *result)
{
@@ -257,7 +175,7 @@
if (msg) {
new_msg.len = 0;
- mirc_color(msg, &new_msg);
+ ircg_mirc_color(msg, &new_msg);
encoded_msg.c = php_escape_html_entities(new_msg.c, new_msg.len,
&encoded_msg.len, 1, 1);
}
Index: php4/ext/ircg/ircg_scanner.c
+++ php4/ext/ircg/ircg_scanner.c
/* Generated by re2c 0.5 on Fri Feb 16 19:55:49 2001 */
#line 1 "/home/sas/src/php4/ext/ircg/ircg_scanner.re"
/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Sascha Schumann <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
/* $Id: ircg_scanner.c,v 1.1 2001/02/16 19:01:22 sas Exp $ */
#include <ext/standard/php_smart_str.h>
#include <stdio.h>
#include <string.h>
static const char *color_list[] = {
"white",
"black",
"blue",
"green",
"red",
"brown",
"purple",
"orange",
"yellow",
"lightgreen",
"teal",
"lightcyan",
"lightblue",
"pink",
"gray",
"lightgrey"
};
enum {
STATE_PLAIN,
STATE_URL,
STATE_COLOR_FG,
STATE_COLOR_COMMA,
STATE_COLOR_BG
};
typedef struct {
int bg_code;
int fg_code;
int font_tag_open;
smart_str scheme;
smart_str *result;
} ircg_msg_scanner;
#line 71
#define YYFILL(n) { }
#define YYCTYPE unsigned char
#define YYCURSOR xp
#define YYLIMIT end
#define YYMARKER q
#define STATE mode
#define STD_PARA ircg_msg_scanner *ctx, const char *start, const char *YYCURSOR
#define STD_ARGS ctx, start, YYCURSOR
static void handle_scheme(STD_PARA)
{
ctx->scheme.len = 0;
smart_str_appendl(&ctx->scheme, start, YYCURSOR - start);
smart_str_0(&ctx->scheme);
}
static void handle_url(STD_PARA)
{
smart_str_appends(ctx->result, "<a target=blank href=\"");
smart_str_append(ctx->result, &ctx->scheme);
smart_str_appendl(ctx->result, start, YYCURSOR - start);
smart_str_appends(ctx->result, "\">");
smart_str_append(ctx->result, &ctx->scheme);
smart_str_appendl(ctx->result, start, YYCURSOR - start);
smart_str_appends(ctx->result, "</a>");
}
static void handle_color_digit(STD_PARA, int mode)
{
int len;
int nr;
len = YYCURSOR - start;
switch (len) {
case 2:
nr = (start[0] - '0') * 10 + (start[1] - '0');
break;
case 1:
nr = start[0] - '0';
break;
}
switch (mode) {
case 0: ctx->fg_code = nr; break;
case 1: ctx->bg_code = nr; break;
}
}
#define IS_VALID_CODE(n) (n >= 0 && n <= 15)
static void finish_color_stuff(STD_PARA)
{
if (ctx->font_tag_open) {
smart_str_appends(ctx->result, "</font>");
ctx->font_tag_open = 0;
}
}
static void commit_color_stuff(STD_PARA)
{
finish_color_stuff(STD_ARGS);
if (IS_VALID_CODE(ctx->fg_code)) {
smart_str_appends(ctx->result, "<font color=\"");
smart_str_appends(ctx->result, color_list[ctx->fg_code]);
smart_str_appends(ctx->result, "\">");
ctx->font_tag_open = 1;
}
}
static void passthru(STD_PARA)
{
smart_str_appendl(ctx->result, start, YYCURSOR - start);
}
void ircg_mirc_color(const char *msg, smart_str *result) {
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);
end = msg + msg_len;
xp = msg;
while (1) {
start = YYCURSOR;
switch (STATE) {
case STATE_PLAIN:
{
YYCTYPE yych;
unsigned int yyaccept;
static unsigned char yybm[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 0, 0, 0, 0, 0, 0,
0, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 0, 0, 0,
0, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
goto yy0;
yy1: ++YYCURSOR;
yy0:
if((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
yych = *YYCURSOR;
if(yych <= '@'){
if(yych <= '\000') goto yy7;
if(yych == '\003') goto yy4;
goto yy6;
} else {
if(yych <= 'Z') goto yy2;
if(yych <= '`') goto yy6;
if(yych >= '{') goto yy6;
}
yy2: yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if(yych <= '@'){
if(yych <= '/') goto yy3;
if(yych <= ':') goto yy10;
} else {
if(yych <= 'Z') goto yy10;
if(yych <= '`') goto yy3;
if(yych <= 'z') goto yy10;
}
yy3:
#line 172
{ passthru(STD_ARGS); continue; }
yy4: yych = *++YYCURSOR;
yy5:
#line 171
{ mctx.fg_code = mctx.bg_code = -1; STATE = STATE_COLOR_FG; continue; }
yy6: yych = *++YYCURSOR;
goto yy3;
yy7: yych = *++YYCURSOR;
yy8:
#line 173
{ goto stop; }
yy9: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy10: if(yybm[0+yych] & 128) goto yy9;
if(yych == ':') goto yy12;
yy11: YYCURSOR = YYMARKER;
switch(yyaccept){
case 0: goto yy3;
}
yy12: yych = *++YYCURSOR;
if(yych != '/') goto yy11;
yy13: yych = *++YYCURSOR;
if(yych != '/') goto yy11;
yy14: yych = *++YYCURSOR;
yy15:
#line 170
{ handle_scheme(STD_ARGS); STATE = STATE_URL; continue; }
}
#line 174
break;
case STATE_URL:
{
YYCTYPE yych;
unsigned int yyaccept;
static unsigned char yybm[] = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 128, 0, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 0, 128, 0, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 0, 0, 128,
0, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 0, 0, 0, 128, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
goto yy16;
yy17: ++YYCURSOR;
yy16:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= '>'){
if(yych <= '"'){
if(yych != '!') goto yy20;
} else {
if(yych == '<') goto yy20;
if(yych >= '>') goto yy20;
}
} else {
if(yych <= '`'){
if(yych <= 'Z') goto yy18;
if(yych != '_') goto yy20;
} else {
if(yych <= 'z') goto yy18;
if(yych != '~') goto yy20;
}
}
yy18: yych = *++YYCURSOR;
goto yy23;
yy19:
#line 182
{ handle_url(STD_ARGS); STATE = STATE_PLAIN; continue; }
yy20: yych = *++YYCURSOR;
yy21:
#line 183
{ passthru(STD_ARGS); STATE = STATE_PLAIN; continue; }
yy22: ++YYCURSOR;
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
yy23: if(yybm[0+yych] & 128) goto yy22;
goto yy19;
}
#line 184
break;
case STATE_COLOR_FG:
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy24;
yy25: ++YYCURSOR;
yy24:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= '/') goto yy28;
if(yych >= ':') goto yy28;
yy26: yych = *++YYCURSOR;
if(yych <= '/') goto yy27;
if(yych <= '9') goto yy30;
yy27:
#line 191
{ handle_color_digit(STD_ARGS, 0); STATE = STATE_COLOR_COMMA; continue; }
yy28: yych = *++YYCURSOR;
yy29:
#line 192
{ finish_color_stuff(STD_ARGS); passthru(STD_ARGS); STATE = STATE_PLAIN;
continue; }
yy30: yych = *++YYCURSOR;
goto yy27;
}
#line 193
break;
case STATE_COLOR_COMMA:
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy31;
yy32: ++YYCURSOR;
yy31:
if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if(yych != ',') goto yy35;
yy33: yych = *++YYCURSOR;
yy34:
#line 200
{ STATE = STATE_COLOR_BG; continue; }
yy35: yych = *++YYCURSOR;
yy36:
#line 201
{ YYCURSOR--; commit_color_stuff(STD_ARGS); STATE = STATE_PLAIN; continue; }
}
#line 202
break;
case STATE_COLOR_BG:
{
YYCTYPE yych;
unsigned int yyaccept;
goto yy37;
yy38: ++YYCURSOR;
yy37:
if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
if(yych <= '/') goto yy41;
if(yych >= ':') goto yy41;
yy39: yych = *++YYCURSOR;
if(yych <= '/') goto yy40;
if(yych <= '9') goto yy43;
yy40:
#line 209
{ handle_color_digit(STD_ARGS, 1); commit_color_stuff(STD_ARGS); STATE =
STATE_PLAIN; continue; }
yy41: yych = *++YYCURSOR;
yy42:
#line 210
{ commit_color_stuff(STD_ARGS); STATE = STATE_PLAIN; continue; }
yy43: yych = *++YYCURSOR;
goto yy40;
}
#line 211
break;
}
}
stop:
smart_str_free(&ctx->scheme);
finish_color_stuff(STD_ARGS);
}
Index: php4/ext/ircg/ircg_scanner.re
+++ php4/ext/ircg/ircg_scanner.re
/*
+----------------------------------------------------------------------+
| PHP version 4.0 |
+----------------------------------------------------------------------+
| Copyright (c) 1997, 1998, 1999, 2000 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| [EMAIL PROTECTED] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Sascha Schumann <[EMAIL PROTECTED]> |
+----------------------------------------------------------------------+
*/
/* $Id: ircg_scanner.re,v 1.1 2001/02/16 19:01:22 sas Exp $ */
#include <ext/standard/php_smart_str.h>
#include <stdio.h>
#include <string.h>
static const char *color_list[] = {
"white",
"black",
"blue",
"green",
"red",
"brown",
"purple",
"orange",
"yellow",
"lightgreen",
"teal",
"lightcyan",
"lightblue",
"pink",
"gray",
"lightgrey"
};
enum {
STATE_PLAIN,
STATE_URL,
STATE_COLOR_FG,
STATE_COLOR_COMMA,
STATE_COLOR_BG
};
typedef struct {
int bg_code;
int fg_code;
int font_tag_open;
smart_str scheme;
smart_str *result;
} ircg_msg_scanner;
/*!re2c
any = [\000-\377];
anynoneof = [\001-\377];
eof = [\000];
alpha = [a-zA-Z];
alnum = [a-zA-Z0-9];
digit = [0-9];
scheme = alpha alnum*;
coloresc = "";
*/
#define YYFILL(n) { }
#define YYCTYPE unsigned char
#define YYCURSOR xp
#define YYLIMIT end
#define YYMARKER q
#define STATE mode
#define STD_PARA ircg_msg_scanner *ctx, const char *start, const char *YYCURSOR
#define STD_ARGS ctx, start, YYCURSOR
static void handle_scheme(STD_PARA)
{
ctx->scheme.len = 0;
smart_str_appendl(&ctx->scheme, start, YYCURSOR - start);
smart_str_0(&ctx->scheme);
}
static void handle_url(STD_PARA)
{
smart_str_appends(ctx->result, "<a target=blank href=\"");
smart_str_append(ctx->result, &ctx->scheme);
smart_str_appendl(ctx->result, start, YYCURSOR - start);
smart_str_appends(ctx->result, "\">");
smart_str_append(ctx->result, &ctx->scheme);
smart_str_appendl(ctx->result, start, YYCURSOR - start);
smart_str_appends(ctx->result, "</a>");
}
static void handle_color_digit(STD_PARA, int mode)
{
int len;
int nr;
len = YYCURSOR - start;
switch (len) {
case 2:
nr = (start[0] - '0') * 10 + (start[1] - '0');
break;
case 1:
nr = start[0] - '0';
break;
}
switch (mode) {
case 0: ctx->fg_code = nr; break;
case 1: ctx->bg_code = nr; break;
}
}
#define IS_VALID_CODE(n) (n >= 0 && n <= 15)
static void finish_color_stuff(STD_PARA)
{
if (ctx->font_tag_open) {
smart_str_appends(ctx->result, "</font>");
ctx->font_tag_open = 0;
}
}
static void commit_color_stuff(STD_PARA)
{
finish_color_stuff(STD_ARGS);
if (IS_VALID_CODE(ctx->fg_code)) {
smart_str_appends(ctx->result, "<font color=\"");
smart_str_appends(ctx->result, color_list[ctx->fg_code]);
smart_str_appends(ctx->result, "\">");
ctx->font_tag_open = 1;
}
}
static void passthru(STD_PARA)
{
smart_str_appendl(ctx->result, start, YYCURSOR - start);
}
void ircg_mirc_color(const char *msg, smart_str *result) {
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);
end = msg + msg_len;
xp = msg;
while (1) {
start = YYCURSOR;
switch (STATE) {
case STATE_PLAIN:
/*!re2c
scheme "://" { handle_scheme(STD_ARGS); STATE = STATE_URL; continue; }
coloresc { mctx.fg_code = mctx.bg_code = -1; STATE =
STATE_COLOR_FG; continue; }
anynoneof { passthru(STD_ARGS); continue; }
eof { goto stop; }
*/
break;
case STATE_URL:
/*!re2c
[a-zA-Z0-9\./\-~_?=@&+#:;!*'()%,$]+ { handle_url(STD_ARGS); STATE
= STATE_PLAIN; continue; }
any { passthru(STD_ARGS); STATE = STATE_PLAIN;
continue; }
*/
break;
case STATE_COLOR_FG:
/*!re2c
digit digit? { handle_color_digit(STD_ARGS, 0); STATE =
STATE_COLOR_COMMA; continue; }
any { finish_color_stuff(STD_ARGS);
passthru(STD_ARGS); STATE = STATE_PLAIN; continue; }
*/
break;
case STATE_COLOR_COMMA:
/*!re2c
"," { STATE = STATE_COLOR_BG; continue; }
any { YYCURSOR--; commit_color_stuff(STD_ARGS);
STATE = STATE_PLAIN; continue; }
*/
break;
case STATE_COLOR_BG:
/*!re2c
digit digit? { handle_color_digit(STD_ARGS, 1);
commit_color_stuff(STD_ARGS); STATE = STATE_PLAIN; continue; }
any { commit_color_stuff(STD_ARGS); STATE
= STATE_PLAIN; continue; }
*/
break;
}
}
stop:
smart_str_free(&ctx->scheme);
finish_color_stuff(STD_ARGS);
}
--
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]