1N/A * $Id: encoding.xs,v 0.3 2002/04/21 22:14:41 dankogai Exp $ 1N/A The layer defined here "inherits" in an object-oriented sense from 1N/A the "perlio" layer with its PerlIOBuf_* "methods". The 1N/A implementation is particularly efficient as until Encode settles 1N/A down there is no point in tryint to tune it. 1N/A The layer works by overloading the "fill" and "flush" methods. 1N/A "fill" calls "SUPER::fill" in perl terms, then calls the encode OO 1N/A perl API to convert the encoded data to UTF-8 form, then copies it 1N/A back to the buffer. The "base class's" read methods then see the 1N/A "flush" transforms the UTF-8 data deposited by the "base class's 1N/A write method in the buffer back into the encoded form using the 1N/A encode OO perl API, then copies data back into the buffer and calls 1N/A Note that "flush" is _also_ called for read mode - we still do the 1N/A (back)-translate so that the base class's "flush" sees the 1N/A correct number of encoded chars for positioning the seek 1N/A pointer. (This double translation is the worst performance issue - 1N/A particularly with all-perl encode engine.) 1N/A int flags;
/* Flags currently just needs lines */ 1N/A /* Not 100% sure stack swap is right thing to do during dup ... */ 1N/A /* should never happen */ 1N/A /* Things get too messy if we don't have a buffer layer 1N/A push a :perlio to do the job */ 1N/A /* Encoding needs whole lines (e.g. iso-2022-*) 1N/A search back from end of available data for 1N/A /* found a line - take up to and including that */ 1N/A /* No line, but not EOF - append avail to the pending data */ 1N/A /* something left over from last time - create a normal 1N/A SV with new data appended 1N/A /* Have to grow buffer */ 1N/A /* Create a "dummy" SV to represent the available data from layer below */ 1N/A /* Have to grow buffer */ 1N/A /* Now get translated string (forced to UTF-8) and use as buffer */ 1N/A /* Got _something */ 1N/A /* if decode gave us back dataSV then data may vanish when 1N/A we do ptrcnt adjust - so take our copy now. 1N/A (The copy is a pain - need a put-it-here option for decode.) 1N/A did not translate - not clear this is a win */ 1N/A /* compute amount we took */ 1N/A /* and as we did not take it it isn't pending */ 1N/A /* Got nothing - assume partial character so we need some more */ 1N/A /* Make sure e->dataSV is a normal SV before re-filling as 1N/A buffer alias will change under us 1N/A /* Write case - encode the buffer and write() to layer below */ 1N/A /* Did not all translate */ 1N/A /* if we have any untranslated stuff then unread that first */ 1N/A /* FIXME - unread is fragile is there a better way ? */ 1N/A /* See if there is anything left in the buffer */ 1N/A /* Bother - have unread data. 1N/A re-encode and unread() to layer below 1N/A /* Discard partial character */ 1N/A /* Don't back decode and unread any pending data */ 1N/A /* This should only fire for write case */ 1N/A /* Unfortunately the only way to get a postion is to (re-)translate, 1N/A the UTF8 we have in bufefr and then ask layer below 1N/A while (
nl <
end && *
nl++ !=
'\n')
/* empty body */;
1N/A#
endif /* encode layer */ 1N/A * we now "use Encode ()" here instead of 1N/A * is invoked without prior "use Encode". -- dankogai 1N/A /* This would just be an irritant now loading works */ 1N/A /* Encode needs a lot of stack - it is likely to move ... */ 1N/A /* The SV is magically freed by load_module */ 1N/A /* should never happen */