e576bb | 2002-10-11 | Martin Nilsson | |
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | |
310a6b | 2015-08-21 | Henrik Grubbström (Grubba) | | * @rfc{1521@} functionality for Pike
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | *
|
cebac9 | 1999-03-10 | Marcus Comstedt | | * Marcus Comstedt 1996-1999
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | */
|
b788cd | 1998-07-04 | Henrik Grubbström (Grubba) | | #include "global.h"
|
5565b6 | 1997-03-08 | Marcus Comstedt | | #include "config.h"
|
51ef5c | 2002-10-21 | Marcus Comstedt | | #include "module.h"
|
5565b6 | 1997-03-08 | Marcus Comstedt | | #include "stralloc.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5565b6 | 1997-03-08 | Marcus Comstedt | | #include "object.h"
#include "program.h"
#include "interpret.h"
#include "builtin_functions.h"
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | #include "module_support.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
1fda20 | 1997-04-17 | Marcus Comstedt | | #ifdef __CHAR_UNSIGNED__
#define SIGNED signed
#else
#define SIGNED
#endif
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
6ad237 | 2002-05-11 | Martin Nilsson | | #define sp Pike_sp
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
static void f_decode_base64( INT32 args );
|
d6261d | 2017-03-26 | Martin Nilsson | | static void f_decode_base64url( INT32 args );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_encode_base64( INT32 args );
|
d6261d | 2017-03-26 | Martin Nilsson | | static void f_encode_base64url( INT32 args );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_decode_qp( INT32 args );
static void f_encode_qp( INT32 args );
static void f_decode_uue( INT32 args );
static void f_encode_uue( INT32 args );
static void f_tokenize( INT32 args );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | static void f_tokenize_labled( INT32 args );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_quote( INT32 args );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | static void f_quote_labled( INT32 args );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
c0ad8a | 2004-06-29 | Martin Nilsson | | static const char base64tab[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
d6261d | 2017-03-26 | Martin Nilsson | | static const char base64urltab[64] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
808e7d | 1999-03-09 | Marcus Comstedt | | static SIGNED char base64rtab[(1<<(CHAR_BIT-1))-' '];
|
d6261d | 2017-03-26 | Martin Nilsson | | static SIGNED char base64urlrtab[(1<<(CHAR_BIT-1))-' '];
|
c0ad8a | 2004-06-29 | Martin Nilsson | | static const char qptab[16] = "0123456789ABCDEF";
|
808e7d | 1999-03-09 | Marcus Comstedt | | static SIGNED char qprtab[(1<<(CHAR_BIT-1))-'0'];
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
#define CT_CTL 0
#define CT_WHITE 1
#define CT_ATOM 2
#define CT_SPECIAL 3
|
ff7a0f | 1999-03-04 | Marcus Comstedt | | #define CT_EQUAL 4
#define CT_LPAR 5
#define CT_RPAR 6
#define CT_LBRACK 7
#define CT_RBRACK 8
#define CT_QUOTE 9
|
808e7d | 1999-03-09 | Marcus Comstedt | | unsigned char rfc822ctype[1<<CHAR_BIT];
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | |
#define TOKENIZE_KEEP_ESCAPES 1
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
51ef5c | 2002-10-21 | Marcus Comstedt | | PIKE_MODULE_INIT
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
int i;
|
4879f3 | 2001-07-01 | Henrik Grubbström (Grubba) | | Pike_compiler->new_program->id = PROG_MODULE_MIME_ID;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
memset( base64rtab, -1, sizeof(base64rtab) );
for (i = 0; i < 64; i++)
base64rtab[base64tab[i] - ' '] = i;
|
d6261d | 2017-03-26 | Martin Nilsson | |
memset( base64urlrtab, -1, sizeof(base64urlrtab) );
for (i = 0; i < 64; i++)
base64urlrtab[base64urltab[i] - ' '] = i;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
memset( qprtab, -1, sizeof(qprtab) );
for (i = 0; i < 16; i++)
qprtab[qptab[i]-'0'] = i;
for (i = 10; i < 16; i++)
qprtab[qptab[i] - ('0' + 'A' - 'a')] = i;
memset( rfc822ctype, CT_ATOM, sizeof(rfc822ctype) );
for (i = 0; i < 32; i++)
rfc822ctype[i] = CT_CTL;
rfc822ctype[127] = CT_CTL;
rfc822ctype[' '] = CT_WHITE;
rfc822ctype['\t'] = CT_WHITE;
rfc822ctype['('] = CT_LPAR;
rfc822ctype[')'] = CT_RPAR;
rfc822ctype['['] = CT_LBRACK;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | rfc822ctype[']'] = CT_RBRACK;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | rfc822ctype['"'] = CT_QUOTE;
|
ff7a0f | 1999-03-04 | Marcus Comstedt | | rfc822ctype['='] = CT_EQUAL;
|
12a17b | 1999-08-07 | Marcus Comstedt | | for(i=0; i<9; i++)
|
ff7a0f | 1999-03-04 | Marcus Comstedt | | rfc822ctype[(int)"<>@,;:\\/?"[i]] = CT_SPECIAL;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
c8dd5a | 2013-12-14 | Martin Nilsson | |
ADD_FUNCTION2( "decode_base64", f_decode_base64,
tFunc(tStr, tStr8), 0, OPT_TRY_OPTIMIZE );
|
bff327 | 2013-05-28 | Martin Nilsson | |
|
d6261d | 2017-03-26 | Martin Nilsson | | ADD_FUNCTION2( "decode_base64url", f_decode_base64url,
tFunc(tStr, tStr8), 0, OPT_TRY_OPTIMIZE );
|
bff327 | 2013-05-28 | Martin Nilsson | | ADD_FUNCTION2( "encode_base64", f_encode_base64,
tFunc(tStr tOr(tVoid,tInt),tStr7), 0, OPT_TRY_OPTIMIZE );
|
d6261d | 2017-03-26 | Martin Nilsson | | ADD_FUNCTION2( "encode_base64url", f_encode_base64url,
tFunc(tStr tOr(tVoid,tInt),tStr7), 0, OPT_TRY_OPTIMIZE );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | add_function_constant( "decode_qp", f_decode_qp,
"function(string:string)", OPT_TRY_OPTIMIZE );
|
bff327 | 2013-05-28 | Martin Nilsson | |
ADD_FUNCTION2( "encode_qp", f_encode_qp,
tFunc(tStr tOr(tVoid,tInt),tStr7), 0, OPT_TRY_OPTIMIZE );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | add_function_constant( "decode_uue", f_decode_uue,
"function(string:string)", OPT_TRY_OPTIMIZE );
|
bff327 | 2013-05-28 | Martin Nilsson | |
ADD_FUNCTION2( "encode_uue", f_encode_uue,
tFunc(tStr tOr(tVoid,tStr),tStr7), 0, OPT_TRY_OPTIMIZE );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | add_integer_constant("TOKENIZE_KEEP_ESCAPES", TOKENIZE_KEEP_ESCAPES, 0);
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | add_function_constant( "tokenize", f_tokenize,
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | "function(string, int|void:array(string|int))",
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | OPT_TRY_OPTIMIZE );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | add_function_constant( "tokenize_labled", f_tokenize_labled,
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | "function(string, int|void:array(array(string|int)))",
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | OPT_TRY_OPTIMIZE );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | add_function_constant( "quote", f_quote,
"function(array(string|int):string)",
OPT_TRY_OPTIMIZE );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | add_function_constant( "quote_labled", f_quote_labled,
"function(array(array(string|int)):string)",
OPT_TRY_OPTIMIZE );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
51ef5c | 2002-10-21 | Marcus Comstedt | | PIKE_MODULE_EXIT
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
}
|
d6261d | 2017-03-26 | Martin Nilsson | | static void decode_base64( INT32 args, const char *name, const char *tab)
{
struct string_builder buf;
SIGNED char *src;
ptrdiff_t cnt;
INT32 d = 1;
int pads = 3;
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | if(args != 1)
Pike_error( "Wrong number of arguments to MIME.%s()\n",name );
if (TYPEOF(sp[-1]) != T_STRING)
Pike_error( "Wrong type of argument to MIME.%s()\n",name );
if (sp[-1].u.string->size_shift != 0)
Pike_error( "Char out of range for MIME.%s()\n",name );
|
d6261d | 2017-03-26 | Martin Nilsson | | init_string_builder( &buf, 0 );
for (src = (SIGNED char *)sp[-1].u.string->str, cnt = sp[-1].u.string->len;
cnt--; src++)
if(*src>=' ' && tab[*src-' ']>=0) {
if((d=(d<<6)|tab[*src-' '])>=0x1000000) {
string_builder_putchar( &buf, (d>>16)&0xff );
string_builder_putchar( &buf, (d>>8)&0xff );
string_builder_putchar( &buf, d&0xff );
d=1;
}
} else if (*src=='=') {
break;
}
if (d & 0x3f000000) {
pads = 0;
} else if (d & 0xfc0000) {
pads = 1;
d >>= 2;
} else if (d & 0x3f000) {
pads = 2;
d >>= 4;
}
switch(pads) {
case 0:
string_builder_putchar( &buf, (d>>16)&0xff );
case 1:
string_builder_putchar( &buf, (d>>8)&0xff );
case 2:
string_builder_putchar( &buf, d&0xff );
}
pop_n_elems( 1 );
push_string( finish_string_builder( &buf ) );
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_decode_base64( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
d6261d | 2017-03-26 | Martin Nilsson | | decode_base64(args, "decode_base64", base64rtab);
}
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
d6261d | 2017-03-26 | Martin Nilsson | |
static void f_decode_base64url( INT32 args )
{
decode_base64(args, "decode_base64url", base64urlrtab);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
c3dbe5 | 2000-08-09 | Henrik Grubbström (Grubba) | | static int do_b64_encode( ptrdiff_t groups, unsigned char **srcp, char **destp,
|
d6261d | 2017-03-26 | Martin Nilsson | | int insert_crlf, const char *tab )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | unsigned char *src = *srcp;
char *dest = *destp;
int g = 0;
while (groups--) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | INT32 d = *src++<<8;
d = (*src++|d)<<8;
d |= *src++;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
d6261d | 2017-03-26 | Martin Nilsson | | *dest++ = tab[d>>18];
*dest++ = tab[(d>>12)&63];
*dest++ = tab[(d>>6)&63];
*dest++ = tab[d&63];
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
f48b83 | 1997-05-06 | Marcus Comstedt | | if(insert_crlf && ++g == 19) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *dest++ = 13;
*dest++ = 10;
g=0;
}
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *srcp = src;
*destp = dest;
return g;
}
|
d6261d | 2017-03-26 | Martin Nilsson | | static void encode_base64( INT32 args, const char *name, const char *tab,
int pad )
{
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | ptrdiff_t groups;
ptrdiff_t last;
int insert_crlf;
ptrdiff_t length;
struct pike_string *str;
unsigned char *src;
char *dest;
|
d6261d | 2017-03-26 | Martin Nilsson | | if(args != 1 && args != 2)
Pike_error( "Wrong number of arguments to MIME.%s()\n",name );
if(TYPEOF(sp[-args]) != T_STRING)
Pike_error( "Wrong type of argument to MIME.%s()\n",name );
if (sp[-args].u.string->size_shift != 0)
Pike_error( "Char out of range for MIME.%s()\n",name );
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | groups = (sp[-args].u.string->len+2)/3;
last = (sp[-args].u.string->len-1)%3+1;
|
d6261d | 2017-03-26 | Martin Nilsson | |
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | insert_crlf = !(args == 2 && TYPEOF(sp[-1]) == T_INT &&
sp[-1].u.integer != 0);
|
d6261d | 2017-03-26 | Martin Nilsson | |
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | length = groups*4+(insert_crlf? (groups/19)*2 : 0);
str = begin_shared_string( length );
|
d6261d | 2017-03-26 | Martin Nilsson | |
|
6505de | 2017-05-01 | Henrik Grubbström (Grubba) | | src = (unsigned char *)sp[-args].u.string->str;
dest = str->str;
|
d6261d | 2017-03-26 | Martin Nilsson | |
if (groups) {
unsigned char tmp[3], *tmpp = tmp;
int i;
if (do_b64_encode( groups-1, &src, &dest, insert_crlf, tab ) == 18)
str->len -= 2;
tmp[1] = tmp[2] = 0;
for (i = 0; i < last; i++)
tmp[i] = *src++;
do_b64_encode( 1, &tmpp, &dest, 0, tab );
switch (last) {
case 1:
*--dest = '=';
case 2:
*--dest = '=';
}
}
pop_n_elems( args );
if( pad )
push_string( end_shared_string( str ) );
else
push_string( end_and_resize_shared_string( str, length-(3-last) ) );
}
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_encode_base64( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
d6261d | 2017-03-26 | Martin Nilsson | | encode_base64(args, "encode_base64", base64tab, 1);
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
d6261d | 2017-03-26 | Martin Nilsson | |
static void f_encode_base64url( INT32 args )
{
encode_base64(args, "encode_base64url", base64urltab, 0);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_decode_qp( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
if(args != 1)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.decode_qp()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if(TYPEOF(sp[-1]) != T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.decode_qp()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | | else if (sp[-1].u.string->size_shift != 0)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.decode_qp()\n" );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | so we'll use a string builder to hold the result. */
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | struct string_builder buf;
|
1fda20 | 1997-04-17 | Marcus Comstedt | | SIGNED char *src;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t cnt;
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | init_string_builder(&buf, 0);
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
e1a2e7 | 1997-04-20 | Henrik Grubbström (Grubba) | | for (src = (SIGNED char *)sp[-1].u.string->str, cnt = sp[-1].u.string->len;
cnt--; src++)
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (*src == '=') {
if (cnt > 0 && (src[1] == 10 || src[1] == 13)) {
if (src[1] == 13) {
--cnt;
src++;
}
if (cnt>0 && src[1]==10) {
--cnt;
src++;
}
} else if (cnt >= 2 && src[1] >= '0' && src[2] >= '0' &&
qprtab[src[1]-'0'] >= 0 && qprtab[src[2]-'0'] >= 0) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, (qprtab[src[1]-'0']<<4)|qprtab[src[2]-'0'] );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | cnt -= 2;
src += 2;
|
a48c96 | 1997-03-12 | Marcus Comstedt | | }
} else
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, *(unsigned char *)src );
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
pop_n_elems( 1 );
|
cebac9 | 1999-03-10 | Marcus Comstedt | | push_string( finish_string_builder( &buf ) );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
}
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_encode_qp( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
f48b83 | 1997-05-06 | Marcus Comstedt | | if (args != 1 && args != 2)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.encode_qp()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if (TYPEOF(sp[-args]) != T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.encode_qp()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | | else if (sp[-args].u.string->size_shift != 0)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.encode_qp()\n" );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
f48b83 | 1997-05-06 | Marcus Comstedt | | |
8f1cbc | 1997-03-13 | Marcus Comstedt | | much of the data has to be encoded, so let's use that trusty
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string builder once again. */
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | struct string_builder buf;
|
f48b83 | 1997-05-06 | Marcus Comstedt | | unsigned char *src = (unsigned char *)sp[-args].u.string->str;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t cnt;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | int col = 0;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | int insert_crlf = !(args == 2 && TYPEOF(sp[-1]) == T_INT &&
|
f48b83 | 1997-05-06 | Marcus Comstedt | | sp[-1].u.integer != 0);
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | init_string_builder( &buf, 0 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
f48b83 | 1997-05-06 | Marcus Comstedt | | for (cnt = sp[-args].u.string->len; cnt--; src++) {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if ((*src >= 33 && *src <= 60) ||
(*src >= 62 && *src <= 126))
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, *(unsigned char *)src );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '=' );
string_builder_putchar( &buf, qptab[(*src)>>4] );
string_builder_putchar( &buf, qptab[(*src)&15] );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | col += 2;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
f48b83 | 1997-05-06 | Marcus Comstedt | | if (++col >= 73 && insert_crlf) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '=' );
string_builder_putchar( &buf, 13 );
string_builder_putchar( &buf, 10 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | col = 0;
}
}
|
13670c | 2015-05-25 | Martin Nilsson | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5c8ddc | 1997-06-26 | Marcus Comstedt | | pop_n_elems( args );
|
cebac9 | 1999-03-10 | Marcus Comstedt | | push_string( finish_string_builder( &buf ) );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_decode_uue( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (args != 1)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.decode_uue()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if(TYPEOF(sp[-1]) != T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.decode_uue()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | | else if (sp[-1].u.string->size_shift != 0)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.decode_uue()\n" );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | struct string_builder buf;
|
5565b6 | 1997-03-08 | Marcus Comstedt | | char *src;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t cnt;
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | init_string_builder( &buf, 0 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
src = sp[-1].u.string->str;
cnt = sp[-1].u.string->len;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | while (cnt--)
|
5565b6 | 1997-03-08 | Marcus Comstedt | | if(*src++=='b' && cnt>5 && !memcmp(src, "egin ", 5))
break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
if (cnt>=0)
while (cnt--)
if (*src++=='\n')
|
5565b6 | 1997-03-08 | Marcus Comstedt | | break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
if (cnt<0) {
pop_n_elems( 1 );
push_int( 0 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | return;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
for (;;) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | int l, g;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
02979f | 1997-04-12 | Marcus Comstedt | |
if (cnt<=0 || *src=='e')
|
5565b6 | 1997-03-08 | Marcus Comstedt | | break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
02979f | 1997-04-12 | Marcus Comstedt | | |
8f1cbc | 1997-03-13 | Marcus Comstedt | | check that we have sufficient data */
|
02979f | 1997-04-12 | Marcus Comstedt | | l=(*src++-' ')&63;
|
5565b6 | 1997-03-08 | Marcus Comstedt | | --cnt;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | g = (l+2)/3;
l -= g*3;
if ((cnt -= g*4) < 0)
|
5565b6 | 1997-03-08 | Marcus Comstedt | | break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
while (g--) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | INT32 d = ((*src++-' ')&63)<<18;
d |= ((*src++-' ')&63)<<12;
d |= ((*src++-' ')&63)<<6;
d |= ((*src++-' ')&63);
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, (d>>16)&0xff );
string_builder_putchar( &buf, (d>>8)&0xff );
string_builder_putchar( &buf, d&0xff );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | |
if (l<0)
buf.s->len += l;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
while (cnt-- && *src++!=10);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
pop_n_elems( 1 );
|
cebac9 | 1999-03-10 | Marcus Comstedt | | push_string( finish_string_builder( &buf ) );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
c3dbe5 | 2000-08-09 | Henrik Grubbström (Grubba) | | static void do_uue_encode(ptrdiff_t groups, unsigned char **srcp, char **destp,
ptrdiff_t last )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | unsigned char *src = *srcp;
char *dest = *destp;
while (groups || last) {
|
84f895 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t g = (groups >= 15? 15 : groups);
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (g<15) {
|
cc7cf4 | 2015-10-14 | Martin Nilsson | | *dest++ = ' ' + (char)(3*g + last);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | last = 0;
} else
|
cc7cf4 | 2015-10-14 | Martin Nilsson | | *dest++ = ' ' + (char)(3*g);
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | groups -= g;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | while (g--) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | INT32 d = *src++<<8;
d = (*src++|d)<<8;
d |= *src++;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
02979f | 1997-04-12 | Marcus Comstedt | | if((*dest++ = ' '+(d>>18)) == ' ') dest[-1]='`';
if((*dest++ = ' '+((d>>12)&63)) == ' ') dest[-1]='`';
if((*dest++ = ' '+((d>>6)&63)) == ' ') dest[-1]='`';
if((*dest++ = ' '+(d&63)) == ' ') dest[-1]='`';
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
if(groups || last) {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *dest++ = 13;
*dest++ = 10;
}
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *srcp = src;
*destp = dest;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_encode_uue( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (args != 1 && args != 2)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.encode_uue()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if (TYPEOF(sp[-args]) != T_STRING ||
(args == 2 && TYPEOF(sp[-1]) != T_VOID &&
TYPEOF(sp[-1]) != T_STRING && TYPEOF(sp[-1]) != T_INT))
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.encode_uue()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | | else if (sp[-args].u.string->size_shift != 0 ||
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | (args == 2 && TYPEOF(sp[-1]) == T_STRING &&
|
808e7d | 1999-03-09 | Marcus Comstedt | | sp[-1].u.string->size_shift != 0))
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.encode_uue()\n" );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
char *dest, *filename = "attachment";
|
5565b6 | 1997-03-08 | Marcus Comstedt | | struct pike_string *str;
unsigned char *src = (unsigned char *) sp[-args].u.string->str;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t groups = (sp[-args].u.string->len + 2)/3;
ptrdiff_t last= (sp[-args].u.string->len - 1)%3 + 1;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (args == 2 && TYPEOF(sp[-1]) == T_STRING)
|
5565b6 | 1997-03-08 | Marcus Comstedt | | filename = sp[-1].u.string->str;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
str = begin_shared_string( groups*4 + ((groups + 14)/15)*3 +
strlen( filename ) + 20 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | dest = str->str;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | sprintf(dest, "begin 644 %s\r\n", filename);
dest += 12 + strlen(filename);
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
if (groups) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | unsigned char tmp[3], *tmpp=tmp;
char *kp, k;
int i;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | do_uue_encode( groups-1, &src, &dest, last );
tmp[1] = tmp[2] = 0;
for (i = 0; i < last; i++)
tmp[i] = *src++;
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | k = *--dest;
kp = dest;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
do_uue_encode( 1, &tmpp, &dest, 0 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *kp = k;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
switch (last) {
|
5565b6 | 1997-03-08 | Marcus Comstedt | | case 1:
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | dest[-2] = '`';
|
8a323a | 2015-04-21 | Henrik Grubbström (Grubba) | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | case 2:
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | dest[-1] = '`';
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | *dest++ = 13;
*dest++ = 10;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
memcpy( dest, "`\r\nend\r\n", 8 );
pop_n_elems( args );
push_string( end_shared_string( str ) );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | static void low_tokenize( const char *funname, INT32 args, int mode )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
aec58f | 1998-04-04 | Mirar (Pontus Hagland) | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | |
unsigned char *src;
int flags = 0;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | struct array *arr;
struct pike_string *str;
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | ptrdiff_t cnt;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | INT32 n = 0, l, e, d;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | char *p;
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | get_all_args(funname, args, "%S.%d", &str, &flags);
src = STR0(str);
cnt = str->len;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | while (cnt>0)
switch (rfc822ctype[*src]) {
case CT_EQUAL:
l = 0;
if (cnt>5 && src[1] == '?') {
int nq = 0;
for (l=2; l<cnt && nq<3; l++)
if (src[l]=='?')
nq ++;
else if(rfc822ctype[src[l]]<=CT_WHITE)
break;
if (nq == 3 && l<cnt && src[l] == '=')
l ++;
else
l = 0;
}
if (l>0) {
if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("encoded-word");
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | push_string( make_shared_binary_string( (char *)src, l ) );
if(mode)
f_aggregate(2);
n++;
src += l;
cnt -= l;
break;
}
|
8a323a | 2015-04-21 | Henrik Grubbström (Grubba) | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | case CT_SPECIAL:
case CT_RBRACK:
case CT_RPAR:
if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("special");
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | push_int( *src++ );
if(mode)
f_aggregate(2);
n++;
--cnt;
break;
|
aec58f | 1998-04-04 | Mirar (Pontus Hagland) | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | case CT_ATOM:
for (l=1; l<cnt; l++)
if (rfc822ctype[src[l]] != CT_ATOM)
break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("word");
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | push_string( make_shared_binary_string( (char *)src, l ) );
if(mode)
f_aggregate(2);
n++;
src += l;
cnt -= l;
break;
case CT_QUOTE:
for (e = 0, l = 1; l < cnt; l++)
if (src[l] == '"')
break;
else
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | if ((src[l] == '\\') && !(flags & TOKENIZE_KEEP_ESCAPES)) {
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | e++;
l++;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("word");
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | |
if (e) {
str = begin_shared_string( l-e-1 );
for (p = str->str, e = 1; e < l; e++)
*p++ = (src[e] == '\\'? src[++e] : src[e]);
push_string( end_shared_string( str ) );
} else {
push_string(make_shared_binary_string( (char *)src+1, l-1));
}
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | if(mode)
f_aggregate(2);
n++;
src += l+1;
cnt -= l+1;
break;
case CT_LBRACK:
for (e = 0, l = 1; l < cnt; l++)
if(src[l] == ']')
|
ff7a0f | 1999-03-04 | Marcus Comstedt | | break;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | else
if(src[l] == '\\') {
e++;
l++;
}
if (l >= cnt) {
if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("special");
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | push_int( *src++ );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | if(mode)
f_aggregate(2);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | n++;
--cnt;
break;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
str = begin_shared_string( l-e+1 );
for (p = str->str, e = 0; e <= l; e++)
*p++ = (src[e] == '\\'? src[++e] : src[e]);
if(mode)
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("domain-literal");
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | push_string( end_shared_string( str ) );
if(mode)
f_aggregate(2);
n++;
src += l+1;
cnt -= l+1;
break;
case CT_LPAR:
for (e = 0, d = 1, l = 1; l < cnt; l++)
if (src[l] == '(')
d++;
else if(src[l] == ')') {
if(!--d)
|
5565b6 | 1997-03-08 | Marcus Comstedt | | break;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | } else
if(src[l] == '\\') {
e++;
l++;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | if(mode) {
|
5e9fc0 | 2015-08-18 | Per Hedbor | | push_static_text("comment");
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | str = begin_shared_string( l-e-1 );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | for (p = str->str, e = 1; e < l; e++)
*p++ = (src[e] == '\\'? src[++e] : src[e]);
push_string( end_shared_string( str ) );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | f_aggregate(2);
|
5565b6 | 1997-03-08 | Marcus Comstedt | | n++;
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
src += l+1;
cnt -= l+1;
break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | case CT_WHITE:
src++;
--cnt;
break;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | default:
|
b18974 | 1999-08-17 | Marcus Comstedt | | if(*src == '\0') {
cnt = 0;
break;
}
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Invalid character in header field\n" );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
56e2c4 | 1999-03-07 | Marcus Comstedt | |
arr = aggregate_array( n );
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | pop_n_elems( args );
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | push_array( arr );
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | |
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *!
|
310a6b | 2015-08-21 | Henrik Grubbström (Grubba) | | *! A structured header field, as specified by @rfc{822@}, is constructed from
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! a sequence of lexical elements.
*!
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | *! @param header
*! The header value to parse.
*!
*! @param flags
*! An optional set of flags. Currently only one flag is defined:
*! @int
|
87213c | 2008-03-25 | Martin Bähr | | *! @value TOKENIZE_KEEP_ESCAPES
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | *! Keep backslash-escapes in quoted-strings.
*! @endint
*!
*! The lexical elements parsed are:
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! @dl
*! @item
*! individual special characters
*! @item
*! quoted-strings
*! @item
*! domain-literals
*! @item
*! comments
*! @item
*! atoms
*! @enddl
*!
*! This function will analyze a string containing the header value,
*! and produce an array containing the lexical elements.
*!
*! Individual special characters will be returned as characters (i.e.
|
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! @expr{int@}s).
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *!
*! Quoted-strings, domain-literals and atoms will be decoded and returned
*! as strings.
*!
*! Comments are not returned in the array at all.
*!
*! @note
*! As domain-literals are returned as strings, there is no way to tell the
*! domain-literal @tt{[127.0.0.1]@} from the quoted-string
*! @tt{"[127.0.0.1]"@}. Hopefully this won't cause any problems.
*! Domain-literals are used seldom, if at all, anyway...
|
13670c | 2015-05-25 | Martin Nilsson | | *!
|
310a6b | 2015-08-21 | Henrik Grubbström (Grubba) | | *! The set of special-characters is the one specified in @rfc{1521@}
|
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! (i.e. @expr{"<", ">", "@@", ",", ";", ":", "\", "/", "?", "="@}),
|
310a6b | 2015-08-21 | Henrik Grubbström (Grubba) | | *! and not the set specified in @rfc{822@}.
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
b7be08 | 2002-11-25 | Marcus Comstedt | | *! @[MIME.quote()], @[tokenize_labled()],
*! @[decode_words_tokenized_remapped()].
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | */
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | static void f_tokenize( INT32 args )
{
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | low_tokenize("MIME.tokenize", args, 0 );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | |
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *!
|
b7be08 | 2002-11-25 | Marcus Comstedt | | *! Similar to @[tokenize()], but labels the contents, by making
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! arrays with two elements; the first a label, and the second
*! the value that @[tokenize()] would have put there, except
*! for that comments are kept.
*!
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | *! @param header
*! The header value to parse.
*!
*! @param flags
*! An optional set of flags. Currently only one flag is defined:
*! @int
|
87213c | 2008-03-25 | Martin Bähr | | *! @value TOKENIZE_KEEP_ESCAPES
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | *! Keep backslash-escapes in quoted-strings.
*! @endint
*!
|
b7be08 | 2002-11-25 | Marcus Comstedt | | *! The following labels exist:
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! @string
*! @value "encoded-word"
*! Word encoded according to =?...
*! @value "special"
*! Special character.
*! @value "word"
*! Word.
*! @value "domain-literal"
*! Domain literal.
*! @value "comment"
*! Comment.
*! @endstring
*!
*! @seealso
|
b7be08 | 2002-11-25 | Marcus Comstedt | | *! @[MIME.quote()], @[tokenize()],
*! @[decode_words_tokenized_labled_remapped()]
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | */
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | static void f_tokenize_labled( INT32 args )
{
|
341f60 | 2008-01-25 | Henrik Grubbström (Grubba) | | low_tokenize("MIME.tokenize_labled", args, 1);
|
56e2c4 | 1999-03-07 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | static int check_atom_chars( unsigned char *str, ptrdiff_t len )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (len < 1)
return 0;
|
5565b6 | 1997-03-08 | Marcus Comstedt | |
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
while (len--)
if (*str >= 0x80 || rfc822ctype[*str] != CT_ATOM)
|
5565b6 | 1997-03-08 | Marcus Comstedt | | return 0;
else
str++;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | return 1;
}
|
1a3b19 | 1999-03-07 | Marcus Comstedt | |
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | static int check_encword( unsigned char *str, ptrdiff_t len )
|
1a3b19 | 1999-03-07 | Marcus Comstedt | | {
int q = 0;
if (len < 6 || str[0] != '=' || str[1] != '?' ||
str[len-2] != '?' || str[len-1] != '=')
return 0;
len -= 4;
str += 2;
while (len--)
if (*str++ == '?')
if(++q > 2)
return 0;
return q == 2;
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | | |
cbe8c9 | 2003-04-07 | Martin Nilsson | | *! Characters (@expr{int@}s) are taken to be special-characters, whereas
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | | *! strings are encoded as atoms or quoted-strings, depending on whether
*! they contain any special characters.
*!
*! @note
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! There is no way to construct a domain-literal using this function.
*! Neither can it be used to produce comments.
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | | *! @[MIME.tokenize()]
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | | */
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | static void f_quote( INT32 args )
|
5565b6 | 1997-03-08 | Marcus Comstedt | | {
struct svalue *item;
INT32 cnt;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | struct string_builder buf;
|
5565b6 | 1997-03-08 | Marcus Comstedt | | int prev_atom = 0;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | if (args != 1)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.quote()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if (TYPEOF(sp[-1]) != T_ARRAY)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote()\n" );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder to collect the output string. */
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | init_string_builder( &buf, 0 );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
for (cnt=sp[-1].u.array->size, item=sp[-1].u.array->item; cnt--; item++) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*item) == T_INT) {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, item->u.integer );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | prev_atom = 0;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | } else if (TYPEOF(*item) != T_STRING) {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote()\n" );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
808e7d | 1999-03-09 | Marcus Comstedt | | } else if (item->u.string->size_shift != 0) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.quote()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | } else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
struct pike_string *str = item->u.string;
if (prev_atom)
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, ' ' );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
1a3b19 | 1999-03-07 | Marcus Comstedt | | if ((str->len>5 && str->str[0]=='=' && str->str[1]=='?' &&
check_encword((unsigned char *)str->str, str->len)) ||
check_atom_chars((unsigned char *)str->str, str->len)) {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_binary_strcat( &buf, str->str, str->len );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | } else {
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
c3dbe5 | 2000-08-09 | Henrik Grubbström (Grubba) | | ptrdiff_t len = str->len;
|
8f1cbc | 1997-03-13 | Marcus Comstedt | | char *src = str->str;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '"' );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | while(len--) {
if(*src=='"' || *src=='\\' || *src=='\r')
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '\\' );
string_builder_putchar( &buf, (*src++)&0xff );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '"' );
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
prev_atom = 1;
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
}
|
8f1cbc | 1997-03-13 | Marcus Comstedt | |
pop_n_elems( 1 );
|
cebac9 | 1999-03-10 | Marcus Comstedt | | push_string( finish_string_builder( &buf ) );
|
5565b6 | 1997-03-08 | Marcus Comstedt | | }
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
|
a86cc8 | 2001-02-14 | Henrik Grubbström (Grubba) | |
|
9938e9 | 1999-03-09 | Marcus Comstedt | | static void f_quote_labled( INT32 args )
{
struct svalue *item;
INT32 cnt;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | struct string_builder buf;
|
9938e9 | 1999-03-09 | Marcus Comstedt | | int prev_atom = 0;
if (args != 1)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong number of arguments to MIME.quote_labled()\n" );
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | else if (TYPEOF(sp[-1]) != T_ARRAY)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder to collect the output string. */
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | init_string_builder( &buf, 0 );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
for (cnt=sp[-1].u.array->size, item=sp[-1].u.array->item; cnt--; item++) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if (TYPEOF(*item) != T_ARRAY || item->u.array->size<2 ||
TYPEOF(item->u.array->item[0]) != T_STRING) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
if (c_compare_string( item->u.array->item[0].u.string, "special", 7 )) {
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | if(TYPEOF(item->u.array->item[1]) != T_INT) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, item->u.array->item[1].u.integer );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | prev_atom = 0;
|
017b57 | 2011-10-28 | Henrik Grubbström (Grubba) | | } else if(TYPEOF(item->u.array->item[1]) != T_STRING) {
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Wrong type of argument to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
|
808e7d | 1999-03-09 | Marcus Comstedt | | } else if (item->u.array->item[1].u.string->size_shift != 0) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Char out of range for MIME.quote_labled()\n" );
|
808e7d | 1999-03-09 | Marcus Comstedt | |
|
9938e9 | 1999-03-09 | Marcus Comstedt | | } else if (c_compare_string( item->u.array->item[0].u.string, "word", 4 )){
struct pike_string *str = item->u.array->item[1].u.string;
if (prev_atom)
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, ' ' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
if ((str->len>5 && str->str[0]=='=' && str->str[1]=='?' &&
check_encword((unsigned char *)str->str, str->len)) ||
check_atom_chars((unsigned char *)str->str, str->len)) {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_binary_strcat( &buf, str->str, str->len );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
} else {
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t len = str->len;
|
9938e9 | 1999-03-09 | Marcus Comstedt | | char *src = str->str;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '"' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | while(len--) {
if(*src=='"' || *src=='\\' || *src=='\r')
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '\\' );
string_builder_putchar( &buf, (*src++)&0xff );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '"' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
}
prev_atom = 1;
} else if (c_compare_string( item->u.array->item[0].u.string,
"encoded-word", 12 )) {
struct pike_string *str = item->u.array->item[1].u.string;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_binary_strcat( &buf, str->str, str->len );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
prev_atom = 1;
} else if (c_compare_string( item->u.array->item[0].u.string,
"comment", 7 )) {
struct pike_string *str = item->u.array->item[1].u.string;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t len = str->len;
|
9938e9 | 1999-03-09 | Marcus Comstedt | | char *src = str->str;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '(' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | while(len--) {
if(*src=='(' || *src==')' || *src=='\\' || *src=='\r')
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '\\' );
string_builder_putchar( &buf, (*src++)&0xff );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, ')' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
prev_atom = 0;
|
13670c | 2015-05-25 | Martin Nilsson | |
|
9938e9 | 1999-03-09 | Marcus Comstedt | | } else if (c_compare_string( item->u.array->item[0].u.string,
"domain-literal", 14 )) {
struct pike_string *str = item->u.array->item[1].u.string;
|
45372f | 2000-08-04 | Henrik Grubbström (Grubba) | | ptrdiff_t len = str->len;
|
9938e9 | 1999-03-09 | Marcus Comstedt | | char *src = str->str;
if (len<2 || src[0] != '[' || src[len-1] != ']') {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Illegal domain-literal passed to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
len -= 2;
src++;
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '[' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | while(len--) {
if(*src=='[' || *src==']' || *src=='\\' || *src=='\r')
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, '\\' );
string_builder_putchar( &buf, (*src++)&0xff );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
|
cebac9 | 1999-03-10 | Marcus Comstedt | | string_builder_putchar( &buf, ']' );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
prev_atom = 0;
} else {
|
cebac9 | 1999-03-10 | Marcus Comstedt | | free_string_builder( &buf );
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error( "Unknown label passed to MIME.quote_labled()\n" );
|
9938e9 | 1999-03-09 | Marcus Comstedt | |
}
}
pop_n_elems( 1 );
|
cebac9 | 1999-03-10 | Marcus Comstedt | | push_string( finish_string_builder( &buf ) );
|
9938e9 | 1999-03-09 | Marcus Comstedt | | }
|
61b039 | 2001-01-06 | Henrik Grubbström (Grubba) | |
|