#/*-*- Mode: C++ -*- */

MODULE = Moot		PACKAGE = Moot::TokenReader

PROTOTYPES: DISABLE

##=====================================================================
## TokenReader: Constructors etc.

##--------------------------------------------------------------
## -- NO abstract constructor!
#TokenReader *
#new(char *CLASS, TokenIOFormatMask fmt=tiofWellDone)
#CODE:
#  RETVAL=new TokenReader();
#OUTPUT:
#  RETVAL

##--------------------------------------------------------------
void
DESTROY(TokenReader* tr)
CODE:
 //fprintf(stderr, "TokenReader::DESTROY(%s) --> %p=%i\n", sv_getclass(ST(0)), tr,tr);
 if (tr) delete tr;

##=====================================================================
## TokenReader: Input Selection

##--------------------------------------------------------------
void
close(TokenReader* tr)
CODE:
 tr->close();

##--------------------------------------------------------------
int
opened(TokenReader* tr)
CODE:
 RETVAL = tr->opened() ? 1 : 0;
OUTPUT:
 RETVAL

##--------------------------------------------------------------
void
from_fh(TokenReader* tr, SV *ioref)
PREINIT:
 mootPerlInputFH *mfh;
CODE:
 mfh = new mootPerlInputFH(ioref);
 tr->from_mstream(mfh);
 tr->tr_istream_created = true;

##--------------------------------------------------------------
void
from_file(TokenReader* tr, const char *filename)
CODE:
 tr->from_filename(filename);

##--------------------------------------------------------------
void
from_string(TokenReader* tr, SV *buf)
PREINIT:
 mootPerlInputBuf *mfh;
CODE:
 mfh = new mootPerlInputBuf(buf);
 tr->from_mstream(mfh);
 tr->tr_istream_created = true;

##=====================================================================
## Token-Level Access
##=====================================================================

##--------------------------------------------------------------
HV*
get_token(TokenReader* tr, bool utf8=TRUE)
PREINIT:
  mootTokenType toktyp;
CODE:
  toktyp = tr->get_token();
  if (toktyp==TokTypeEOF) {
    XSRETURN_UNDEF;
  }
  else RETVAL = token2hv( tr->token(), utf8 );
OUTPUT:
  RETVAL

##--------------------------------------------------------------
AV*
get_sentence(TokenReader* tr, bool utf8=TRUE)
PREINIT:
  mootTokenType toktyp;
CODE:
  toktyp = tr->get_sentence();
  if (toktyp==TokTypeEOF) {
    XSRETURN_UNDEF;
  }
  else RETVAL = sentence2av( tr->sentence(), utf8 );
OUTPUT:
  RETVAL

##=====================================================================
## TokenReader: Accessors

##--------------------------------------------------------------
TokenIOFormatMask
format(TokenReader* tr, ...)
CODE:
 if (items > 1) {
   TokenIOFormatMask fmt = SvUV( ST(1) );
   tr->tr_format = fmt;
 }
 RETVAL = (TokenIOFormatMask)tr->tr_format;
OUTPUT:
 RETVAL

##--------------------------------------------------------------
const char *
name(TokenReader* tr, ...)
CODE:
 if (items > 1) {
   const char *myname = SvPV_nolen( ST(1) );
   tr->tr_name = myname;
 }
 RETVAL = tr->tr_name.c_str();
OUTPUT:
 RETVAL

##--------------------------------------------------------------
size_t
line_number(TokenReader* tr, ...)
CODE:
 if (items > 1) {
   size_t n = (size_t)SvUV( ST(1) );
   tr->line_number(n);
 }
 RETVAL = tr->line_number();
OUTPUT:
 RETVAL

##--------------------------------------------------------------
size_t
column_number(TokenReader* tr, ...)
CODE:
 if (items > 1) {
   size_t n = (size_t)SvUV( ST(1) );
   tr->column_number(n);
 }
 RETVAL = tr->column_number();
OUTPUT:
 RETVAL

##--------------------------------------------------------------
size_t
byte_number(TokenReader* tr, ...)
CODE:
 if (items > 1) {
   size_t n = (size_t)SvUV( ST(1) );
   tr->byte_number(n);
 }
RETVAL = (size_t)tr->byte_number();
OUTPUT:
 RETVAL

##=====================================================================
## TokenReaderNative
##=====================================================================

MODULE = Moot		PACKAGE = Moot::TokenReader::Native

TokenReaderNative *
new(char *CLASS, TokenIOFormatMask fmt=tiofWellDone)
CODE:
  RETVAL=new TokenReaderNative(fmt, CLASS);
OUTPUT:
  RETVAL

##=====================================================================
## TokenReaderXML
##=====================================================================

MODULE = Moot		PACKAGE = Moot::TokenReader::XML

##--------------------------------------------------------------
TokenReaderExpat *
new(char *CLASS, TokenIOFormatMask fmt=tiofXML)
CODE:
  RETVAL=new TokenReaderExpat(fmt);
  RETVAL->tr_name = CLASS;
OUTPUT:
  RETVAL