Blame NKF.mod/NKF.xs

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