|
Packit Service |
949123 |
/***********************************************************************
|
|
Packit Service |
949123 |
** Copyright (C) 1996,1998
|
|
Packit Service |
949123 |
** Copyright (C) 2002
|
|
Packit Service |
949123 |
** 連絡先: 琉球大学情報工学科 河野 真治 mime/X0208 support
|
|
Packit Service |
949123 |
** (E-Mail Address: kono@ie.u-ryukyu.ac.jp)
|
|
Packit Service |
949123 |
** 連絡先: COW for DOS & Win16 & Win32 & OS/2
|
|
Packit Service |
949123 |
** (E-Mail Address: GHG00637@niftyserve.or.p)
|
|
Packit Service |
949123 |
**
|
|
Packit Service |
949123 |
** このソースのいかなる複写,改変,修正も許諾します。ただし、
|
|
Packit Service |
949123 |
** その際には、誰が貢献したを示すこの部分を残すこと。
|
|
Packit Service |
949123 |
** 再配布や雑誌の付録などの問い合わせも必要ありません。
|
|
Packit Service |
949123 |
** 営利利用も上記に反しない範囲で許可します。
|
|
Packit Service |
949123 |
** バイナリの配布の際にはversion messageを保存することを条件とします。
|
|
Packit Service |
949123 |
** このプログラムについては特に何の保証もしない、悪しからず。
|
|
Packit Service |
949123 |
**
|
|
Packit Service |
949123 |
** Everyone is permitted to do anything on this program
|
|
Packit Service |
949123 |
** including copying, modifying, improving,
|
|
Packit Service |
949123 |
** as long as you don't try to pretend that you wrote it.
|
|
Packit Service |
949123 |
** i.e., the above copyright notice has to appear in all copies.
|
|
Packit Service |
949123 |
** Binar y distribution requires original version messages.
|
|
Packit Service |
949123 |
** You don't have to ask before copying, redistribution or publishing.
|
|
Packit Service |
949123 |
** THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
|
|
Packit Service |
949123 |
***********************************************************************/
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
#ifdef __cplusplus
|
|
Packit Service |
949123 |
extern "C" {
|
|
Packit Service |
949123 |
#endif
|
|
Packit Service |
949123 |
#include "EXTERN.h"
|
|
Packit Service |
949123 |
#include "perl.h"
|
|
Packit Service |
949123 |
#include "XSUB.h"
|
|
Packit Service |
949123 |
#ifdef __cplusplus
|
|
Packit Service |
949123 |
}
|
|
Packit Service |
949123 |
#endif
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Replace nkf's getchar/putchar for variable modification */
|
|
Packit Service |
949123 |
/* we never use getc, ungetc */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
#undef getc
|
|
Packit Service |
949123 |
#undef ungetc
|
|
Packit Service |
949123 |
#define getc(f) (input_ctr>=i_len?-1:input[input_ctr++])
|
|
Packit Service |
949123 |
#define ungetc(c,f) input_ctr--
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
#define INCSIZE 32
|
|
Packit Service |
949123 |
#undef putchar
|
|
Packit Service |
949123 |
#undef TRUE
|
|
Packit Service |
949123 |
#undef FALSE
|
|
Packit Service |
949123 |
#define putchar(c) nkf_putchar(c)
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Input/Output pointers */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
static unsigned char *output;
|
|
Packit Service |
949123 |
static unsigned char *input;
|
|
Packit Service |
949123 |
static STRLEN input_ctr;
|
|
Packit Service |
949123 |
static STRLEN i_len;
|
|
Packit Service |
949123 |
static STRLEN output_ctr;
|
|
Packit Service |
949123 |
static STRLEN o_len;
|
|
Packit Service |
949123 |
static STRLEN incsize;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
static
|
|
Packit Service |
949123 |
SV *result;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* put one char in the result string variable */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
static int nkf_putchar_grow(unsigned int c) ;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* inline ... no use */
|
|
Packit Service |
949123 |
static
|
|
Packit Service |
949123 |
int
|
|
Packit Service |
949123 |
nkf_putchar(unsigned int c)
|
|
Packit Service |
949123 |
{
|
|
Packit Service |
949123 |
/* string length is enough? */
|
|
Packit Service |
949123 |
if(output_ctr
|
|
Packit Service |
949123 |
return output[output_ctr++] = c;
|
|
Packit Service |
949123 |
} else {
|
|
Packit Service |
949123 |
return nkf_putchar_grow(c) ;
|
|
Packit Service |
949123 |
}
|
|
Packit Service |
949123 |
}
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
static
|
|
Packit Service |
949123 |
int
|
|
Packit Service |
949123 |
nkf_putchar_grow(unsigned int c)
|
|
Packit Service |
949123 |
{
|
|
Packit Service |
949123 |
/* extends string length */
|
|
Packit Service |
949123 |
o_len += incsize;
|
|
Packit Service |
949123 |
SvGROW(result, o_len);
|
|
Packit Service |
949123 |
/* to avoid linear growing, increase extension size */
|
|
Packit Service |
949123 |
incsize *= 2;
|
|
Packit Service |
949123 |
output = SvPVX(result);
|
|
Packit Service |
949123 |
/* SvPV(result,o_len) breaks o_len */
|
|
Packit Service |
949123 |
return output[output_ctr++] = c;
|
|
Packit Service |
949123 |
}
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Include kanji filter main part */
|
|
Packit Service |
949123 |
/* getchar and putchar will be replaced during inclusion */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
#define PERL_XS 1
|
|
Packit Service |
949123 |
#include "../utf8tbl.c"
|
|
Packit Service |
949123 |
#undef SP
|
|
Packit Service |
949123 |
#include "../nkf.c"
|
|
Packit Service |
949123 |
#undef SP
|
|
Packit Service |
949123 |
#define SP sp /* perl's CORE/pp.h */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* package defenition */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* nkf accepts variable length arugments. The last argument is */
|
|
Packit Service |
949123 |
/* the input data. Other strings are flags for nkf translation. */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
MODULE = NKF PACKAGE = NKF
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
SV *
|
|
Packit Service |
949123 |
nkf(...)
|
|
Packit Service |
949123 |
PROTOTYPE: @
|
|
Packit Service |
949123 |
PREINIT:
|
|
Packit Service |
949123 |
SV* sv;
|
|
Packit Service |
949123 |
SV* last;
|
|
Packit Service |
949123 |
char **argv;
|
|
Packit Service |
949123 |
char *cp;
|
|
Packit Service |
949123 |
char *data;
|
|
Packit Service |
949123 |
STRLEN cplen,rlen;
|
|
Packit Service |
949123 |
int i,argc;
|
|
Packit Service |
949123 |
CODE:
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Flags are reset at each call. */
|
|
Packit Service |
949123 |
reinit();
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
argc = items - 1;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Process flags except the last once */
|
|
Packit Service |
949123 |
for (i=0;i
|
|
Packit Service |
949123 |
sv = ST(i);
|
|
Packit Service |
949123 |
cp = SvPV(sv,cplen);
|
|
Packit Service |
949123 |
if(*cp != '-') continue;
|
|
Packit Service |
949123 |
options(cp);
|
|
Packit Service |
949123 |
}
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Get input data pointer from the last variable. */
|
|
Packit Service |
949123 |
data = SvPV(ST(argc),i_len);
|
|
Packit Service |
949123 |
input_ctr = 0;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* allocate the result buffer */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* During conversion, stirngs length may grow. This is the unit */
|
|
Packit Service |
949123 |
/* of growth */
|
|
Packit Service |
949123 |
incsize = INCSIZE;
|
|
Packit Service |
949123 |
rlen = i_len+INCSIZE;
|
|
Packit Service |
949123 |
result = newSV(rlen);
|
|
Packit Service |
949123 |
input = data;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* SvPV(result,o_len) does not work here. */
|
|
Packit Service |
949123 |
output = SvPVX(result);
|
|
Packit Service |
949123 |
o_len = rlen;
|
|
Packit Service |
949123 |
output_ctr = 0;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Convestion */
|
|
Packit Service |
949123 |
kanji_convert(NULL);
|
|
Packit Service |
949123 |
nkf_putchar(0); /* Null terminator */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
RETVAL = result;
|
|
Packit Service |
949123 |
SvPOK_on(RETVAL);
|
|
Packit Service |
949123 |
/* We cannot use
|
|
Packit Service |
949123 |
SvCUR_set(RETVAL, strlen(output));
|
|
Packit Service |
949123 |
because output can contain \0.
|
|
Packit Service |
949123 |
*/
|
|
Packit Service |
949123 |
SvCUR_set(RETVAL, output_ctr - 1);
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
OUTPUT:
|
|
Packit Service |
949123 |
RETVAL
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
SV *
|
|
Packit Service |
949123 |
nkf_continue(...)
|
|
Packit Service |
949123 |
PROTOTYPE: @
|
|
Packit Service |
949123 |
PREINIT:
|
|
Packit Service |
949123 |
char *data;
|
|
Packit Service |
949123 |
STRLEN rlen;
|
|
Packit Service |
949123 |
CODE:
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Get input data pointer from the last variable. */
|
|
Packit Service |
949123 |
data = SvPV(ST(0),i_len);
|
|
Packit Service |
949123 |
input_ctr = 0;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* allocate the result buffer */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* During conversion, stirngs length may grow. This is the unit */
|
|
Packit Service |
949123 |
/* of growth */
|
|
Packit Service |
949123 |
incsize = INCSIZE;
|
|
Packit Service |
949123 |
rlen = i_len+INCSIZE;
|
|
Packit Service |
949123 |
result = newSV(rlen);
|
|
Packit Service |
949123 |
input = data;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* SvPV(result,o_len) does not work here. */
|
|
Packit Service |
949123 |
output = SvPVX(result);
|
|
Packit Service |
949123 |
o_len = rlen;
|
|
Packit Service |
949123 |
output_ctr = 0;
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
/* Convestion */
|
|
Packit Service |
949123 |
kanji_convert(NULL);
|
|
Packit Service |
949123 |
nkf_putchar(0); /* Null terminator */
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
RETVAL = result;
|
|
Packit Service |
949123 |
SvPOK_on(RETVAL);
|
|
Packit Service |
949123 |
/* We cannot use
|
|
Packit Service |
949123 |
SvCUR_set(RETVAL, strlen(output));
|
|
Packit Service |
949123 |
because output can contain \0.
|
|
Packit Service |
949123 |
*/
|
|
Packit Service |
949123 |
SvCUR_set(RETVAL, output_ctr - 1);
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
OUTPUT:
|
|
Packit Service |
949123 |
RETVAL
|
|
Packit Service |
949123 |
|
|
Packit Service |
949123 |
SV*
|
|
Packit Service |
949123 |
inputcode(...)
|
|
Packit Service |
949123 |
CODE:
|
|
Packit Service |
949123 |
RETVAL = newSV(strlen(input_codename) + 1);
|
|
Packit Service |
949123 |
sv_setpv(RETVAL, input_codename);
|
|
Packit Service |
949123 |
OUTPUT:
|
|
Packit Service |
949123 |
RETVAL
|