Blame NKF.mod/NKF.xs

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