1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344 |
- @c -*-texinfo-*-
- @c This is part of the GNU Guile Reference Manual.
- @c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2007, 2009,
- @c 2010, 2011 Free Software Foundation, Inc.
- @c See the file guile.texi for copying conditions.
- @node Input and Output
- @section Input and Output
- @menu
- * Ports:: The idea of the port abstraction.
- * Reading:: Procedures for reading from a port.
- * Writing:: Procedures for writing to a port.
- * Closing:: Procedures to close a port.
- * Random Access:: Moving around a random access port.
- * Line/Delimited:: Read and write lines or delimited text.
- * Block Reading and Writing:: Reading and writing blocks of text.
- * Default Ports:: Defaults for input, output and errors.
- * Port Types:: Types of port and how to make them.
- * R6RS I/O Ports:: The R6RS port API.
- * I/O Extensions:: Using and extending ports in C.
- @end menu
- @node Ports
- @subsection Ports
- @cindex Port
- Sequential input/output in Scheme is represented by operations on a
- @dfn{port}. This chapter explains the operations that Guile provides
- for working with ports.
- Ports are created by opening, for instance @code{open-file} for a file
- (@pxref{File Ports}). Characters can be read from an input port and
- written to an output port, or both on an input/output port. A port
- can be closed (@pxref{Closing}) when no longer required, after which
- any attempt to read or write is an error.
- The formal definition of a port is very generic: an input port is
- simply ``an object which can deliver characters on demand,'' and an
- output port is ``an object which can accept characters.'' Because
- this definition is so loose, it is easy to write functions that
- simulate ports in software. @dfn{Soft ports} and @dfn{string ports}
- are two interesting and powerful examples of this technique.
- (@pxref{Soft Ports}, and @ref{String Ports}.)
- Ports are garbage collected in the usual way (@pxref{Memory
- Management}), and will be closed at that time if not already closed.
- In this case any errors occurring in the close will not be reported.
- Usually a program will want to explicitly close so as to be sure all
- its operations have been successful. Of course if a program has
- abandoned something due to an error or other condition then closing
- problems are probably not of interest.
- It is strongly recommended that file ports be closed explicitly when
- no longer required. Most systems have limits on how many files can be
- open, both on a per-process and a system-wide basis. A program that
- uses many files should take care not to hit those limits. The same
- applies to similar system resources such as pipes and sockets.
- Note that automatic garbage collection is triggered only by memory
- consumption, not by file or other resource usage, so a program cannot
- rely on that to keep it away from system limits. An explicit call to
- @code{gc} can of course be relied on to pick up unreferenced ports.
- If program flow makes it hard to be certain when to close then this
- may be an acceptable way to control resource usage.
- All file access uses the ``LFS'' large file support functions when
- available, so files bigger than 2 Gbytes (@math{2^31} bytes) can be
- read and written on a 32-bit system.
- Each port has an associated character encoding that controls how bytes
- read from the port are converted to characters and string and controls
- how characters and strings written to the port are converted to bytes.
- When ports are created, they inherit their character encoding from the
- current locale, but, that can be modified after the port is created.
- Currently, the ports only work with @emph{non-modal} encodings. Most
- encodings are non-modal, meaning that the conversion of bytes to a
- string doesn't depend on its context: the same byte sequence will always
- return the same string. A couple of modal encodings are in common use,
- like ISO-2022-JP and ISO-2022-KR, and they are not yet supported.
- Each port also has an associated conversion strategy: what to do when
- a Guile character can't be converted to the port's encoded character
- representation for output. There are three possible strategies: to
- raise an error, to replace the character with a hex escape, or to
- replace the character with a substitute character.
- @rnindex input-port?
- @deffn {Scheme Procedure} input-port? x
- @deffnx {C Function} scm_input_port_p (x)
- Return @code{#t} if @var{x} is an input port, otherwise return
- @code{#f}. Any object satisfying this predicate also satisfies
- @code{port?}.
- @end deffn
- @rnindex output-port?
- @deffn {Scheme Procedure} output-port? x
- @deffnx {C Function} scm_output_port_p (x)
- Return @code{#t} if @var{x} is an output port, otherwise return
- @code{#f}. Any object satisfying this predicate also satisfies
- @code{port?}.
- @end deffn
- @deffn {Scheme Procedure} port? x
- @deffnx {C Function} scm_port_p (x)
- Return a boolean indicating whether @var{x} is a port.
- Equivalent to @code{(or (input-port? @var{x}) (output-port?
- @var{x}))}.
- @end deffn
- @deffn {Scheme Procedure} set-port-encoding! port enc
- @deffnx {C Function} scm_set_port_encoding_x (port, enc)
- Sets the character encoding that will be used to interpret all port I/O.
- @var{enc} is a string containing the name of an encoding. Valid
- encoding names are those
- @url{http://www.iana.org/assignments/character-sets, defined by IANA}.
- @end deffn
- @defvr {Scheme Variable} %default-port-encoding
- A fluid containing @code{#f} or the name of the encoding to
- be used by default for newly created ports (@pxref{Fluids and Dynamic
- States}). The value @code{#f} is equivalent to @code{"ISO-8859-1"}.
- New ports are created with the encoding appropriate for the current
- locale if @code{setlocale} has been called or the value specified by
- this fluid otherwise.
- @end defvr
- @deffn {Scheme Procedure} port-encoding port
- @deffnx {C Function} scm_port_encoding
- Returns, as a string, the character encoding that @var{port} uses to interpret
- its input and output. The value @code{#f} is equivalent to @code{"ISO-8859-1"}.
- @end deffn
- @deffn {Scheme Procedure} set-port-conversion-strategy! port sym
- @deffnx {C Function} scm_set_port_conversion_strategy_x (port, sym)
- Sets the behavior of the interpreter when outputting a character that
- is not representable in the port's current encoding. @var{sym} can be
- either @code{'error}, @code{'substitute}, or @code{'escape}. If it is
- @code{'error}, an error will be thrown when an nonconvertible character
- is encountered. If it is @code{'substitute}, then nonconvertible
- characters will be replaced with approximate characters, or with
- question marks if no approximately correct character is available. If
- it is @code{'escape}, it will appear as a hex escape when output.
- If @var{port} is an open port, the conversion error behavior
- is set for that port. If it is @code{#f}, it is set as the
- default behavior for any future ports that get created in
- this thread.
- @end deffn
- @deffn {Scheme Procedure} port-conversion-strategy port
- @deffnx {C Function} scm_port_conversion_strategy (port)
- Returns the behavior of the port when outputting a character that is
- not representable in the port's current encoding. It returns the
- symbol @code{error} if unrepresentable characters should cause
- exceptions, @code{substitute} if the port should try to replace
- unrepresentable characters with question marks or approximate
- characters, or @code{escape} if unrepresentable characters should be
- converted to string escapes.
- If @var{port} is @code{#f}, then the current default behavior will be
- returned. New ports will have this default behavior when they are
- created.
- @end deffn
- @node Reading
- @subsection Reading
- @cindex Reading
- [Generic procedures for reading from ports.]
- These procedures pertain to reading characters and strings from
- ports. To read general S-expressions from ports, @xref{Scheme Read}.
- @rnindex eof-object?
- @cindex End of file object
- @deffn {Scheme Procedure} eof-object? x
- @deffnx {C Function} scm_eof_object_p (x)
- Return @code{#t} if @var{x} is an end-of-file object; otherwise
- return @code{#f}.
- @end deffn
- @rnindex char-ready?
- @deffn {Scheme Procedure} char-ready? [port]
- @deffnx {C Function} scm_char_ready_p (port)
- Return @code{#t} if a character is ready on input @var{port}
- and return @code{#f} otherwise. If @code{char-ready?} returns
- @code{#t} then the next @code{read-char} operation on
- @var{port} is guaranteed not to hang. If @var{port} is a file
- port at end of file then @code{char-ready?} returns @code{#t}.
- @code{char-ready?} exists to make it possible for a
- program to accept characters from interactive ports without
- getting stuck waiting for input. Any input editors associated
- with such ports must make sure that characters whose existence
- has been asserted by @code{char-ready?} cannot be rubbed out.
- If @code{char-ready?} were to return @code{#f} at end of file,
- a port at end of file would be indistinguishable from an
- interactive port that has no ready characters.
- @end deffn
- @rnindex read-char
- @deffn {Scheme Procedure} read-char [port]
- @deffnx {C Function} scm_read_char (port)
- Return the next character available from @var{port}, updating
- @var{port} to point to the following character. If no more
- characters are available, the end-of-file object is returned.
- When @var{port}'s data cannot be decoded according to its
- character encoding, a @code{decoding-error} is raised and
- @var{port} points past the erroneous byte sequence.
- @end deffn
- @deftypefn {C Function} size_t scm_c_read (SCM port, void *buffer, size_t size)
- Read up to @var{size} bytes from @var{port} and store them in
- @var{buffer}. The return value is the number of bytes actually read,
- which can be less than @var{size} if end-of-file has been reached.
- Note that this function does not update @code{port-line} and
- @code{port-column} below.
- @end deftypefn
- @rnindex peek-char
- @deffn {Scheme Procedure} peek-char [port]
- @deffnx {C Function} scm_peek_char (port)
- Return the next character available from @var{port},
- @emph{without} updating @var{port} to point to the following
- character. If no more characters are available, the
- end-of-file object is returned.
- The value returned by
- a call to @code{peek-char} is the same as the value that would
- have been returned by a call to @code{read-char} on the same
- port. The only difference is that the very next call to
- @code{read-char} or @code{peek-char} on that @var{port} will
- return the value returned by the preceding call to
- @code{peek-char}. In particular, a call to @code{peek-char} on
- an interactive port will hang waiting for input whenever a call
- to @code{read-char} would have hung.
- As for @code{read-char}, a @code{decoding-error} may be raised
- if such a situation occurs. However, unlike with @code{read-char},
- @var{port} still points at the beginning of the erroneous byte
- sequence when the error is raised.
- @end deffn
- @deffn {Scheme Procedure} unread-char cobj [port]
- @deffnx {C Function} scm_unread_char (cobj, port)
- Place @var{char} in @var{port} so that it will be read by the
- next read operation. If called multiple times, the unread characters
- will be read again in last-in first-out order. If @var{port} is
- not supplied, the current input port is used.
- @end deffn
- @deffn {Scheme Procedure} unread-string str port
- @deffnx {C Function} scm_unread_string (str, port)
- Place the string @var{str} in @var{port} so that its characters will
- be read from left-to-right as the next characters from @var{port}
- during subsequent read operations. If called multiple times, the
- unread characters will be read again in last-in first-out order. If
- @var{port} is not supplied, the @code{current-input-port} is used.
- @end deffn
- @deffn {Scheme Procedure} drain-input port
- @deffnx {C Function} scm_drain_input (port)
- This procedure clears a port's input buffers, similar
- to the way that force-output clears the output buffer. The
- contents of the buffers are returned as a single string, e.g.,
- @lisp
- (define p (open-input-file ...))
- (drain-input p) => empty string, nothing buffered yet.
- (unread-char (read-char p) p)
- (drain-input p) => initial chars from p, up to the buffer size.
- @end lisp
- Draining the buffers may be useful for cleanly finishing
- buffered I/O so that the file descriptor can be used directly
- for further input.
- @end deffn
- @deffn {Scheme Procedure} port-column port
- @deffnx {Scheme Procedure} port-line port
- @deffnx {C Function} scm_port_column (port)
- @deffnx {C Function} scm_port_line (port)
- Return the current column number or line number of @var{port}.
- If the number is
- unknown, the result is #f. Otherwise, the result is a 0-origin integer
- - i.e.@: the first character of the first line is line 0, column 0.
- (However, when you display a file position, for example in an error
- message, we recommend you add 1 to get 1-origin integers. This is
- because lines and column numbers traditionally start with 1, and that is
- what non-programmers will find most natural.)
- @end deffn
- @deffn {Scheme Procedure} set-port-column! port column
- @deffnx {Scheme Procedure} set-port-line! port line
- @deffnx {C Function} scm_set_port_column_x (port, column)
- @deffnx {C Function} scm_set_port_line_x (port, line)
- Set the current column or line number of @var{port}.
- @end deffn
- @node Writing
- @subsection Writing
- @cindex Writing
- [Generic procedures for writing to ports.]
- These procedures are for writing characters and strings to
- ports. For more information on writing arbitrary Scheme objects to
- ports, @xref{Scheme Write}.
- @deffn {Scheme Procedure} get-print-state port
- @deffnx {C Function} scm_get_print_state (port)
- Return the print state of the port @var{port}. If @var{port}
- has no associated print state, @code{#f} is returned.
- @end deffn
- @rnindex newline
- @deffn {Scheme Procedure} newline [port]
- @deffnx {C Function} scm_newline (port)
- Send a newline to @var{port}.
- If @var{port} is omitted, send to the current output port.
- @end deffn
- @deffn {Scheme Procedure} port-with-print-state port [pstate]
- @deffnx {C Function} scm_port_with_print_state (port, pstate)
- Create a new port which behaves like @var{port}, but with an
- included print state @var{pstate}. @var{pstate} is optional.
- If @var{pstate} isn't supplied and @var{port} already has
- a print state, the old print state is reused.
- @end deffn
- @deffn {Scheme Procedure} print-options-interface [setting]
- @deffnx {C Function} scm_print_options (setting)
- Option interface for the print options. Instead of using
- this procedure directly, use the procedures
- @code{print-enable}, @code{print-disable}, @code{print-set!}
- and @code{print-options}.
- @end deffn
- @deffn {Scheme Procedure} simple-format destination message . args
- @deffnx {C Function} scm_simple_format (destination, message, args)
- Write @var{message} to @var{destination}, defaulting to
- the current output port.
- @var{message} can contain @code{~A} (was @code{%s}) and
- @code{~S} (was @code{%S}) escapes. When printed,
- the escapes are replaced with corresponding members of
- @var{ARGS}:
- @code{~A} formats using @code{display} and @code{~S} formats
- using @code{write}.
- If @var{destination} is @code{#t}, then use the current output
- port, if @var{destination} is @code{#f}, then return a string
- containing the formatted text. Does not add a trailing newline.
- @end deffn
- @rnindex write-char
- @deffn {Scheme Procedure} write-char chr [port]
- @deffnx {C Function} scm_write_char (chr, port)
- Send character @var{chr} to @var{port}.
- @end deffn
- @deftypefn {C Function} void scm_c_write (SCM port, const void *buffer, size_t size)
- Write @var{size} bytes at @var{buffer} to @var{port}.
- Note that this function does not update @code{port-line} and
- @code{port-column} (@pxref{Reading}).
- @end deftypefn
- @findex fflush
- @deffn {Scheme Procedure} force-output [port]
- @deffnx {C Function} scm_force_output (port)
- Flush the specified output port, or the current output port if @var{port}
- is omitted. The current output buffer contents are passed to the
- underlying port implementation (e.g., in the case of fports, the
- data will be written to the file and the output buffer will be cleared.)
- It has no effect on an unbuffered port.
- The return value is unspecified.
- @end deffn
- @deffn {Scheme Procedure} flush-all-ports
- @deffnx {C Function} scm_flush_all_ports ()
- Equivalent to calling @code{force-output} on
- all open output ports. The return value is unspecified.
- @end deffn
- @node Closing
- @subsection Closing
- @cindex Closing ports
- @cindex Port, close
- @deffn {Scheme Procedure} close-port port
- @deffnx {C Function} scm_close_port (port)
- Close the specified port object. Return @code{#t} if it
- successfully closes a port or @code{#f} if it was already
- closed. An exception may be raised if an error occurs, for
- example when flushing buffered output. See also @ref{Ports and
- File Descriptors, close}, for a procedure which can close file
- descriptors.
- @end deffn
- @deffn {Scheme Procedure} close-input-port port
- @deffnx {Scheme Procedure} close-output-port port
- @deffnx {C Function} scm_close_input_port (port)
- @deffnx {C Function} scm_close_output_port (port)
- @rnindex close-input-port
- @rnindex close-output-port
- Close the specified input or output @var{port}. An exception may be
- raised if an error occurs while closing. If @var{port} is already
- closed, nothing is done. The return value is unspecified.
- See also @ref{Ports and File Descriptors, close}, for a procedure
- which can close file descriptors.
- @end deffn
- @deffn {Scheme Procedure} port-closed? port
- @deffnx {C Function} scm_port_closed_p (port)
- Return @code{#t} if @var{port} is closed or @code{#f} if it is
- open.
- @end deffn
- @node Random Access
- @subsection Random Access
- @cindex Random access, ports
- @cindex Port, random access
- @deffn {Scheme Procedure} seek fd_port offset whence
- @deffnx {C Function} scm_seek (fd_port, offset, whence)
- Sets the current position of @var{fd/port} to the integer
- @var{offset}, which is interpreted according to the value of
- @var{whence}.
- One of the following variables should be supplied for
- @var{whence}:
- @defvar SEEK_SET
- Seek from the beginning of the file.
- @end defvar
- @defvar SEEK_CUR
- Seek from the current position.
- @end defvar
- @defvar SEEK_END
- Seek from the end of the file.
- @end defvar
- If @var{fd/port} is a file descriptor, the underlying system
- call is @code{lseek}. @var{port} may be a string port.
- The value returned is the new position in the file. This means
- that the current position of a port can be obtained using:
- @lisp
- (seek port 0 SEEK_CUR)
- @end lisp
- @end deffn
- @deffn {Scheme Procedure} ftell fd_port
- @deffnx {C Function} scm_ftell (fd_port)
- Return an integer representing the current position of
- @var{fd/port}, measured from the beginning. Equivalent to:
- @lisp
- (seek port 0 SEEK_CUR)
- @end lisp
- @end deffn
- @findex truncate
- @findex ftruncate
- @deffn {Scheme Procedure} truncate-file file [length]
- @deffnx {C Function} scm_truncate_file (file, length)
- Truncate @var{file} to @var{length} bytes. @var{file} can be a
- filename string, a port object, or an integer file descriptor. The
- return value is unspecified.
- For a port or file descriptor @var{length} can be omitted, in which
- case the file is truncated at the current position (per @code{ftell}
- above).
- On most systems a file can be extended by giving a length greater than
- the current size, but this is not mandatory in the POSIX standard.
- @end deffn
- @node Line/Delimited
- @subsection Line Oriented and Delimited Text
- @cindex Line input/output
- @cindex Port, line input/output
- The delimited-I/O module can be accessed with:
- @lisp
- (use-modules (ice-9 rdelim))
- @end lisp
- It can be used to read or write lines of text, or read text delimited by
- a specified set of characters. It's similar to the @code{(scsh rdelim)}
- module from guile-scsh, but does not use multiple values or character
- sets and has an extra procedure @code{write-line}.
- @c begin (scm-doc-string "rdelim.scm" "read-line")
- @deffn {Scheme Procedure} read-line [port] [handle-delim]
- Return a line of text from @var{port} if specified, otherwise from the
- value returned by @code{(current-input-port)}. Under Unix, a line of text
- is terminated by the first end-of-line character or by end-of-file.
- If @var{handle-delim} is specified, it should be one of the following
- symbols:
- @table @code
- @item trim
- Discard the terminating delimiter. This is the default, but it will
- be impossible to tell whether the read terminated with a delimiter or
- end-of-file.
- @item concat
- Append the terminating delimiter (if any) to the returned string.
- @item peek
- Push the terminating delimiter (if any) back on to the port.
- @item split
- Return a pair containing the string read from the port and the
- terminating delimiter or end-of-file object.
- @end table
- Like @code{read-char}, this procedure can throw to @code{decoding-error}
- (@pxref{Reading, @code{read-char}}).
- @end deffn
- @c begin (scm-doc-string "rdelim.scm" "read-line!")
- @deffn {Scheme Procedure} read-line! buf [port]
- Read a line of text into the supplied string @var{buf} and return the
- number of characters added to @var{buf}. If @var{buf} is filled, then
- @code{#f} is returned.
- Read from @var{port} if
- specified, otherwise from the value returned by @code{(current-input-port)}.
- @end deffn
- @c begin (scm-doc-string "rdelim.scm" "read-delimited")
- @deffn {Scheme Procedure} read-delimited delims [port] [handle-delim]
- Read text until one of the characters in the string @var{delims} is found
- or end-of-file is reached. Read from @var{port} if supplied, otherwise
- from the value returned by @code{(current-input-port)}.
- @var{handle-delim} takes the same values as described for @code{read-line}.
- @end deffn
- @c begin (scm-doc-string "rdelim.scm" "read-delimited!")
- @deffn {Scheme Procedure} read-delimited! delims buf [port] [handle-delim] [start] [end]
- Read text into the supplied string @var{buf}.
- If a delimiter was found, return the number of characters written,
- except if @var{handle-delim} is @code{split}, in which case the return
- value is a pair, as noted above.
- As a special case, if @var{port} was already at end-of-stream, the EOF
- object is returned. Also, if no characters were written because the
- buffer was full, @code{#f} is returned.
- It's something of a wacky interface, to be honest.
- @end deffn
- @deffn {Scheme Procedure} write-line obj [port]
- @deffnx {C Function} scm_write_line (obj, port)
- Display @var{obj} and a newline character to @var{port}. If
- @var{port} is not specified, @code{(current-output-port)} is
- used. This function is equivalent to:
- @lisp
- (display obj [port])
- (newline [port])
- @end lisp
- @end deffn
- Some of the aforementioned I/O functions rely on the following C
- primitives. These will mainly be of interest to people hacking Guile
- internals.
- @deffn {Scheme Procedure} %read-delimited! delims str gobble [port [start [end]]]
- @deffnx {C Function} scm_read_delimited_x (delims, str, gobble, port, start, end)
- Read characters from @var{port} into @var{str} until one of the
- characters in the @var{delims} string is encountered. If
- @var{gobble} is true, discard the delimiter character;
- otherwise, leave it in the input stream for the next read. If
- @var{port} is not specified, use the value of
- @code{(current-input-port)}. If @var{start} or @var{end} are
- specified, store data only into the substring of @var{str}
- bounded by @var{start} and @var{end} (which default to the
- beginning and end of the string, respectively).
- Return a pair consisting of the delimiter that terminated the
- string and the number of characters read. If reading stopped
- at the end of file, the delimiter returned is the
- @var{eof-object}; if the string was filled without encountering
- a delimiter, this value is @code{#f}.
- @end deffn
- @deffn {Scheme Procedure} %read-line [port]
- @deffnx {C Function} scm_read_line (port)
- Read a newline-terminated line from @var{port}, allocating storage as
- necessary. The newline terminator (if any) is removed from the string,
- and a pair consisting of the line and its delimiter is returned. The
- delimiter may be either a newline or the @var{eof-object}; if
- @code{%read-line} is called at the end of file, it returns the pair
- @code{(#<eof> . #<eof>)}.
- @end deffn
- @node Block Reading and Writing
- @subsection Block reading and writing
- @cindex Block read/write
- @cindex Port, block read/write
- The Block-string-I/O module can be accessed with:
- @lisp
- (use-modules (ice-9 rw))
- @end lisp
- It currently contains procedures that help to implement the
- @code{(scsh rw)} module in guile-scsh.
- @deffn {Scheme Procedure} read-string!/partial str [port_or_fdes [start [end]]]
- @deffnx {C Function} scm_read_string_x_partial (str, port_or_fdes, start, end)
- Read characters from a port or file descriptor into a
- string @var{str}. A port must have an underlying file
- descriptor --- a so-called fport. This procedure is
- scsh-compatible and can efficiently read large strings.
- It will:
- @itemize
- @item
- attempt to fill the entire string, unless the @var{start}
- and/or @var{end} arguments are supplied. i.e., @var{start}
- defaults to 0 and @var{end} defaults to
- @code{(string-length str)}
- @item
- use the current input port if @var{port_or_fdes} is not
- supplied.
- @item
- return fewer than the requested number of characters in some
- cases, e.g., on end of file, if interrupted by a signal, or if
- not all the characters are immediately available.
- @item
- wait indefinitely for some input if no characters are
- currently available,
- unless the port is in non-blocking mode.
- @item
- read characters from the port's input buffers if available,
- instead from the underlying file descriptor.
- @item
- return @code{#f} if end-of-file is encountered before reading
- any characters, otherwise return the number of characters
- read.
- @item
- return 0 if the port is in non-blocking mode and no characters
- are immediately available.
- @item
- return 0 if the request is for 0 bytes, with no
- end-of-file check.
- @end itemize
- @end deffn
- @deffn {Scheme Procedure} write-string/partial str [port_or_fdes [start [end]]]
- @deffnx {C Function} scm_write_string_partial (str, port_or_fdes, start, end)
- Write characters from a string @var{str} to a port or file
- descriptor. A port must have an underlying file descriptor
- --- a so-called fport. This procedure is
- scsh-compatible and can efficiently write large strings.
- It will:
- @itemize
- @item
- attempt to write the entire string, unless the @var{start}
- and/or @var{end} arguments are supplied. i.e., @var{start}
- defaults to 0 and @var{end} defaults to
- @code{(string-length str)}
- @item
- use the current output port if @var{port_of_fdes} is not
- supplied.
- @item
- in the case of a buffered port, store the characters in the
- port's output buffer, if all will fit. If they will not fit
- then any existing buffered characters will be flushed
- before attempting
- to write the new characters directly to the underlying file
- descriptor. If the port is in non-blocking mode and
- buffered characters can not be flushed immediately, then an
- @code{EAGAIN} system-error exception will be raised (Note:
- scsh does not support the use of non-blocking buffered ports.)
- @item
- write fewer than the requested number of
- characters in some cases, e.g., if interrupted by a signal or
- if not all of the output can be accepted immediately.
- @item
- wait indefinitely for at least one character
- from @var{str} to be accepted by the port, unless the port is
- in non-blocking mode.
- @item
- return the number of characters accepted by the port.
- @item
- return 0 if the port is in non-blocking mode and can not accept
- at least one character from @var{str} immediately
- @item
- return 0 immediately if the request size is 0 bytes.
- @end itemize
- @end deffn
- @node Default Ports
- @subsection Default Ports for Input, Output and Errors
- @cindex Default ports
- @cindex Port, default
- @rnindex current-input-port
- @deffn {Scheme Procedure} current-input-port
- @deffnx {C Function} scm_current_input_port ()
- @cindex standard input
- Return the current input port. This is the default port used
- by many input procedures.
- Initially this is the @dfn{standard input} in Unix and C terminology.
- When the standard input is a tty the port is unbuffered, otherwise
- it's fully buffered.
- Unbuffered input is good if an application runs an interactive
- subprocess, since any type-ahead input won't go into Guile's buffer
- and be unavailable to the subprocess.
- Note that Guile buffering is completely separate from the tty ``line
- discipline''. In the usual cooked mode on a tty Guile only sees a
- line of input once the user presses @key{Return}.
- @end deffn
- @rnindex current-output-port
- @deffn {Scheme Procedure} current-output-port
- @deffnx {C Function} scm_current_output_port ()
- @cindex standard output
- Return the current output port. This is the default port used
- by many output procedures.
- Initially this is the @dfn{standard output} in Unix and C terminology.
- When the standard output is a tty this port is unbuffered, otherwise
- it's fully buffered.
- Unbuffered output to a tty is good for ensuring progress output or a
- prompt is seen. But an application which always prints whole lines
- could change to line buffered, or an application with a lot of output
- could go fully buffered and perhaps make explicit @code{force-output}
- calls (@pxref{Writing}) at selected points.
- @end deffn
- @deffn {Scheme Procedure} current-error-port
- @deffnx {C Function} scm_current_error_port ()
- @cindex standard error output
- Return the port to which errors and warnings should be sent.
- Initially this is the @dfn{standard error} in Unix and C terminology.
- When the standard error is a tty this port is unbuffered, otherwise
- it's fully buffered.
- @end deffn
- @deffn {Scheme Procedure} set-current-input-port port
- @deffnx {Scheme Procedure} set-current-output-port port
- @deffnx {Scheme Procedure} set-current-error-port port
- @deffnx {C Function} scm_set_current_input_port (port)
- @deffnx {C Function} scm_set_current_output_port (port)
- @deffnx {C Function} scm_set_current_error_port (port)
- Change the ports returned by @code{current-input-port},
- @code{current-output-port} and @code{current-error-port}, respectively,
- so that they use the supplied @var{port} for input or output.
- @end deffn
- @deftypefn {C Function} void scm_dynwind_current_input_port (SCM port)
- @deftypefnx {C Function} void scm_dynwind_current_output_port (SCM port)
- @deftypefnx {C Function} void scm_dynwind_current_error_port (SCM port)
- These functions must be used inside a pair of calls to
- @code{scm_dynwind_begin} and @code{scm_dynwind_end} (@pxref{Dynamic
- Wind}). During the dynwind context, the indicated port is set to
- @var{port}.
- More precisely, the current port is swapped with a `backup' value
- whenever the dynwind context is entered or left. The backup value is
- initialized with the @var{port} argument.
- @end deftypefn
- @node Port Types
- @subsection Types of Port
- @cindex Types of ports
- @cindex Port, types
- [Types of port; how to make them.]
- @menu
- * File Ports:: Ports on an operating system file.
- * String Ports:: Ports on a Scheme string.
- * Soft Ports:: Ports on arbitrary Scheme procedures.
- * Void Ports:: Ports on nothing at all.
- @end menu
- @node File Ports
- @subsubsection File Ports
- @cindex File port
- @cindex Port, file
- The following procedures are used to open file ports.
- See also @ref{Ports and File Descriptors, open}, for an interface
- to the Unix @code{open} system call.
- Most systems have limits on how many files can be open, so it's
- strongly recommended that file ports be closed explicitly when no
- longer required (@pxref{Ports}).
- @deffn {Scheme Procedure} open-file filename mode
- @deffnx {C Function} scm_open_file (filename, mode)
- Open the file whose name is @var{filename}, and return a port
- representing that file. The attributes of the port are
- determined by the @var{mode} string. The way in which this is
- interpreted is similar to C stdio. The first character must be
- one of the following:
- @table @samp
- @item r
- Open an existing file for input.
- @item w
- Open a file for output, creating it if it doesn't already exist
- or removing its contents if it does.
- @item a
- Open a file for output, creating it if it doesn't already
- exist. All writes to the port will go to the end of the file.
- The "append mode" can be turned off while the port is in use
- @pxref{Ports and File Descriptors, fcntl}
- @end table
- The following additional characters can be appended:
- @table @samp
- @item +
- Open the port for both input and output. E.g., @code{r+}: open
- an existing file for both input and output.
- @item 0
- Create an "unbuffered" port. In this case input and output
- operations are passed directly to the underlying port
- implementation without additional buffering. This is likely to
- slow down I/O operations. The buffering mode can be changed
- while a port is in use @pxref{Ports and File Descriptors,
- setvbuf}
- @item l
- Add line-buffering to the port. The port output buffer will be
- automatically flushed whenever a newline character is written.
- @item b
- Use binary mode. On DOS systems the default text mode converts CR+LF
- in the file to newline for the program, whereas binary mode reads and
- writes all bytes unchanged. On Unix-like systems there is no such
- distinction, text files already contain just newlines and no
- conversion is ever made. The @code{b} flag is accepted on all
- systems, but has no effect on Unix-like systems.
- (For reference, Guile leaves text versus binary up to the C library,
- @code{b} here just adds @code{O_BINARY} to the underlying @code{open}
- call, when that flag is available.)
- Also, open the file using the 8-bit character encoding "ISO-8859-1",
- ignoring any coding declaration or port encoding.
- Note that, when reading or writing binary data with ports, the
- bytevector ports in the @code{(rnrs io ports)} module are preferred,
- as they return vectors, and not strings (@pxref{R6RS I/O Ports}).
- @end table
- If a file cannot be opened with the access
- requested, @code{open-file} throws an exception.
- When the file is opened, this procedure will scan for a coding
- declaration (@pxref{Character Encoding of Source Files}). If present
- will use that encoding for interpreting the file. Otherwise, the
- port's encoding will be used. To suppress this behavior, open
- the file in binary mode and then set the port encoding explicitly
- using @code{set-port-encoding!}.
- In theory we could create read/write ports which were buffered
- in one direction only. However this isn't included in the
- current interfaces.
- @end deffn
- @rnindex open-input-file
- @deffn {Scheme Procedure} open-input-file filename
- Open @var{filename} for input. Equivalent to
- @lisp
- (open-file @var{filename} "r")
- @end lisp
- @end deffn
- @rnindex open-output-file
- @deffn {Scheme Procedure} open-output-file filename
- Open @var{filename} for output. Equivalent to
- @lisp
- (open-file @var{filename} "w")
- @end lisp
- @end deffn
- @deffn {Scheme Procedure} call-with-input-file filename proc
- @deffnx {Scheme Procedure} call-with-output-file filename proc
- @rnindex call-with-input-file
- @rnindex call-with-output-file
- Open @var{filename} for input or output, and call @code{(@var{proc}
- port)} with the resulting port. Return the value returned by
- @var{proc}. @var{filename} is opened as per @code{open-input-file} or
- @code{open-output-file} respectively, and an error is signaled if it
- cannot be opened.
- When @var{proc} returns, the port is closed. If @var{proc} does not
- return (e.g.@: if it throws an error), then the port might not be
- closed automatically, though it will be garbage collected in the usual
- way if not otherwise referenced.
- @end deffn
- @deffn {Scheme Procedure} with-input-from-file filename thunk
- @deffnx {Scheme Procedure} with-output-to-file filename thunk
- @deffnx {Scheme Procedure} with-error-to-file filename thunk
- @rnindex with-input-from-file
- @rnindex with-output-to-file
- Open @var{filename} and call @code{(@var{thunk})} with the new port
- setup as respectively the @code{current-input-port},
- @code{current-output-port}, or @code{current-error-port}. Return the
- value returned by @var{thunk}. @var{filename} is opened as per
- @code{open-input-file} or @code{open-output-file} respectively, and an
- error is signaled if it cannot be opened.
- When @var{thunk} returns, the port is closed and the previous setting
- of the respective current port is restored.
- The current port setting is managed with @code{dynamic-wind}, so the
- previous value is restored no matter how @var{thunk} exits (eg.@: an
- exception), and if @var{thunk} is re-entered (via a captured
- continuation) then it's set again to the @var{FILENAME} port.
- The port is closed when @var{thunk} returns normally, but not when
- exited via an exception or new continuation. This ensures it's still
- ready for use if @var{thunk} is re-entered by a captured continuation.
- Of course the port is always garbage collected and closed in the usual
- way when no longer referenced anywhere.
- @end deffn
- @deffn {Scheme Procedure} port-mode port
- @deffnx {C Function} scm_port_mode (port)
- Return the port modes associated with the open port @var{port}.
- These will not necessarily be identical to the modes used when
- the port was opened, since modes such as "append" which are
- used only during port creation are not retained.
- @end deffn
- @deffn {Scheme Procedure} port-filename port
- @deffnx {C Function} scm_port_filename (port)
- Return the filename associated with @var{port}, or @code{#f} if no
- filename is associated with the port.
- @var{port} must be open, @code{port-filename} cannot be used once the
- port is closed.
- @end deffn
- @deffn {Scheme Procedure} set-port-filename! port filename
- @deffnx {C Function} scm_set_port_filename_x (port, filename)
- Change the filename associated with @var{port}, using the current input
- port if none is specified. Note that this does not change the port's
- source of data, but only the value that is returned by
- @code{port-filename} and reported in diagnostic output.
- @end deffn
- @deffn {Scheme Procedure} file-port? obj
- @deffnx {C Function} scm_file_port_p (obj)
- Determine whether @var{obj} is a port that is related to a file.
- @end deffn
- @node String Ports
- @subsubsection String Ports
- @cindex String port
- @cindex Port, string
- The following allow string ports to be opened by analogy to R4RS
- file port facilities:
- With string ports, the port-encoding is treated differently than other
- types of ports. When string ports are created, they do not inherit a
- character encoding from the current locale. They are given a
- default locale that allows them to handle all valid string characters.
- Typically one should not modify a string port's character encoding
- away from its default.
- @deffn {Scheme Procedure} call-with-output-string proc
- @deffnx {C Function} scm_call_with_output_string (proc)
- Calls the one-argument procedure @var{proc} with a newly created output
- port. When the function returns, the string composed of the characters
- written into the port is returned. @var{proc} should not close the port.
- Note that which characters can be written to a string port depend on the port's
- encoding. The default encoding of string ports is specified by the
- @code{%default-port-encoding} fluid (@pxref{Ports,
- @code{%default-port-encoding}}). For instance, it is an error to write Greek
- letter alpha to an ISO-8859-1-encoded string port since this character cannot be
- represented with ISO-8859-1:
- @example
- (define alpha (integer->char #x03b1)) ; GREEK SMALL LETTER ALPHA
- (with-fluids ((%default-port-encoding "ISO-8859-1"))
- (call-with-output-string
- (lambda (p)
- (display alpha p))))
- @result{}
- Throw to key `encoding-error'
- @end example
- Changing the string port's encoding to a Unicode-capable encoding such as UTF-8
- solves the problem.
- @end deffn
- @deffn {Scheme Procedure} call-with-input-string string proc
- @deffnx {C Function} scm_call_with_input_string (string, proc)
- Calls the one-argument procedure @var{proc} with a newly
- created input port from which @var{string}'s contents may be
- read. The value yielded by the @var{proc} is returned.
- @end deffn
- @deffn {Scheme Procedure} with-output-to-string thunk
- Calls the zero-argument procedure @var{thunk} with the current output
- port set temporarily to a new string port. It returns a string
- composed of the characters written to the current output.
- See @code{call-with-output-string} above for character encoding considerations.
- @end deffn
- @deffn {Scheme Procedure} with-input-from-string string thunk
- Calls the zero-argument procedure @var{thunk} with the current input
- port set temporarily to a string port opened on the specified
- @var{string}. The value yielded by @var{thunk} is returned.
- @end deffn
- @deffn {Scheme Procedure} open-input-string str
- @deffnx {C Function} scm_open_input_string (str)
- Take a string and return an input port that delivers characters
- from the string. The port can be closed by
- @code{close-input-port}, though its storage will be reclaimed
- by the garbage collector if it becomes inaccessible.
- @end deffn
- @deffn {Scheme Procedure} open-output-string
- @deffnx {C Function} scm_open_output_string ()
- Return an output port that will accumulate characters for
- retrieval by @code{get-output-string}. The port can be closed
- by the procedure @code{close-output-port}, though its storage
- will be reclaimed by the garbage collector if it becomes
- inaccessible.
- @end deffn
- @deffn {Scheme Procedure} get-output-string port
- @deffnx {C Function} scm_get_output_string (port)
- Given an output port created by @code{open-output-string},
- return a string consisting of the characters that have been
- output to the port so far.
- @code{get-output-string} must be used before closing @var{port}, once
- closed the string cannot be obtained.
- @end deffn
- A string port can be used in many procedures which accept a port
- but which are not dependent on implementation details of fports.
- E.g., seeking and truncating will work on a string port,
- but trying to extract the file descriptor number will fail.
- @node Soft Ports
- @subsubsection Soft Ports
- @cindex Soft port
- @cindex Port, soft
- A @dfn{soft-port} is a port based on a vector of procedures capable of
- accepting or delivering characters. It allows emulation of I/O ports.
- @deffn {Scheme Procedure} make-soft-port pv modes
- @deffnx {C Function} scm_make_soft_port (pv, modes)
- Return a port capable of receiving or delivering characters as
- specified by the @var{modes} string (@pxref{File Ports,
- open-file}). @var{pv} must be a vector of length 5 or 6. Its
- components are as follows:
- @enumerate 0
- @item
- procedure accepting one character for output
- @item
- procedure accepting a string for output
- @item
- thunk for flushing output
- @item
- thunk for getting one character
- @item
- thunk for closing port (not by garbage collection)
- @item
- (if present and not @code{#f}) thunk for computing the number of
- characters that can be read from the port without blocking.
- @end enumerate
- For an output-only port only elements 0, 1, 2, and 4 need be
- procedures. For an input-only port only elements 3 and 4 need
- be procedures. Thunks 2 and 4 can instead be @code{#f} if
- there is no useful operation for them to perform.
- If thunk 3 returns @code{#f} or an @code{eof-object}
- (@pxref{Input, eof-object?, ,r5rs, The Revised^5 Report on
- Scheme}) it indicates that the port has reached end-of-file.
- For example:
- @lisp
- (define stdout (current-output-port))
- (define p (make-soft-port
- (vector
- (lambda (c) (write c stdout))
- (lambda (s) (display s stdout))
- (lambda () (display "." stdout))
- (lambda () (char-upcase (read-char)))
- (lambda () (display "@@" stdout)))
- "rw"))
- (write p p) @result{} #<input-output: soft 8081e20>
- @end lisp
- @end deffn
- @node Void Ports
- @subsubsection Void Ports
- @cindex Void port
- @cindex Port, void
- This kind of port causes any data to be discarded when written to, and
- always returns the end-of-file object when read from.
- @deffn {Scheme Procedure} %make-void-port mode
- @deffnx {C Function} scm_sys_make_void_port (mode)
- Create and return a new void port. A void port acts like
- @file{/dev/null}. The @var{mode} argument
- specifies the input/output modes for this port: see the
- documentation for @code{open-file} in @ref{File Ports}.
- @end deffn
- @node R6RS I/O Ports
- @subsection R6RS I/O Ports
- @cindex R6RS
- @cindex R6RS ports
- The I/O port API of the @uref{http://www.r6rs.org/, Revised Report^6 on
- the Algorithmic Language Scheme (R6RS)} is provided by the @code{(rnrs
- io ports)} module. It provides features, such as binary I/O and Unicode
- string I/O, that complement or refine Guile's historical port API
- presented above (@pxref{Input and Output}). Note that R6RS ports are not
- disjoint from Guile's native ports, so Guile-specific procedures will
- work on ports created using the R6RS API, and vice versa.
- The text in this section is taken from the R6RS standard libraries
- document, with only minor adaptions for inclusion in this manual. The
- Guile developers offer their thanks to the R6RS editors for having
- provided the report's text under permissive conditions making this
- possible.
- @c FIXME: Update description when implemented.
- @emph{Note}: The implementation of this R6RS API is not complete yet.
- @menu
- * R6RS File Names:: File names.
- * R6RS File Options:: Options for opening files.
- * R6RS Buffer Modes:: Influencing buffering behavior.
- * R6RS Transcoders:: Influencing port encoding.
- * R6RS End-of-File:: The end-of-file object.
- * R6RS Port Manipulation:: Manipulating R6RS ports.
- * R6RS Input Ports:: Input Ports.
- * R6RS Binary Input:: Binary input.
- * R6RS Textual Input:: Textual input.
- * R6RS Output Ports:: Output Ports.
- * R6RS Binary Output:: Binary output.
- * R6RS Textual Output:: Textual output.
- @end menu
- A subset of the @code{(rnrs io ports)} module is provided by the
- @code{(ice-9 binary-ports)} module. It contains binary input/output
- procedures and does not rely on R6RS support.
- @node R6RS File Names
- @subsubsection File Names
- Some of the procedures described in this chapter accept a file name as an
- argument. Valid values for such a file name include strings that name a file
- using the native notation of filesystem paths on an implementation's
- underlying operating system, and may include implementation-dependent
- values as well.
- A @var{filename} parameter name means that the
- corresponding argument must be a file name.
- @node R6RS File Options
- @subsubsection File Options
- @cindex file options
- When opening a file, the various procedures in this library accept a
- @code{file-options} object that encapsulates flags to specify how the
- file is to be opened. A @code{file-options} object is an enum-set
- (@pxref{rnrs enums}) over the symbols constituting valid file options.
- A @var{file-options} parameter name means that the corresponding
- argument must be a file-options object.
- @deffn {Scheme Syntax} file-options @var{file-options-symbol} ...
- Each @var{file-options-symbol} must be a symbol.
- The @code{file-options} syntax returns a file-options object that
- encapsulates the specified options.
- When supplied to an operation that opens a file for output, the
- file-options object returned by @code{(file-options)} specifies that the
- file is created if it does not exist and an exception with condition
- type @code{&i/o-file-already-exists} is raised if it does exist. The
- following standard options can be included to modify the default
- behavior.
- @table @code
- @item no-create
- If the file does not already exist, it is not created;
- instead, an exception with condition type @code{&i/o-file-does-not-exist}
- is raised.
- If the file already exists, the exception with condition type
- @code{&i/o-file-already-exists} is not raised
- and the file is truncated to zero length.
- @item no-fail
- If the file already exists, the exception with condition type
- @code{&i/o-file-already-exists} is not raised,
- even if @code{no-create} is not included,
- and the file is truncated to zero length.
- @item no-truncate
- If the file already exists and the exception with condition type
- @code{&i/o-file-already-exists} has been inhibited by inclusion of
- @code{no-create} or @code{no-fail}, the file is not truncated, but
- the port's current position is still set to the beginning of the
- file.
- @end table
- These options have no effect when a file is opened only for input.
- Symbols other than those listed above may be used as
- @var{file-options-symbol}s; they have implementation-specific meaning,
- if any.
- @quotation Note
- Only the name of @var{file-options-symbol} is significant.
- @end quotation
- @end deffn
- @node R6RS Buffer Modes
- @subsubsection Buffer Modes
- Each port has an associated buffer mode. For an output port, the
- buffer mode defines when an output operation flushes the buffer
- associated with the output port. For an input port, the buffer mode
- defines how much data will be read to satisfy read operations. The
- possible buffer modes are the symbols @code{none} for no buffering,
- @code{line} for flushing upon line endings and reading up to line
- endings, or other implementation-dependent behavior,
- and @code{block} for arbitrary buffering. This section uses
- the parameter name @var{buffer-mode} for arguments that must be
- buffer-mode symbols.
- If two ports are connected to the same mutable source, both ports
- are unbuffered, and reading a byte or character from that shared
- source via one of the two ports would change the bytes or characters
- seen via the other port, a lookahead operation on one port will
- render the peeked byte or character inaccessible via the other port,
- while a subsequent read operation on the peeked port will see the
- peeked byte or character even though the port is otherwise unbuffered.
- In other words, the semantics of buffering is defined in terms of side
- effects on shared mutable sources, and a lookahead operation has the
- same side effect on the shared source as a read operation.
- @deffn {Scheme Syntax} buffer-mode @var{buffer-mode-symbol}
- @var{buffer-mode-symbol} must be a symbol whose name is one of
- @code{none}, @code{line}, and @code{block}. The result is the
- corresponding symbol, and specifies the associated buffer mode.
- @quotation Note
- Only the name of @var{buffer-mode-symbol} is significant.
- @end quotation
- @end deffn
- @deffn {Scheme Procedure} buffer-mode? obj
- Returns @code{#t} if the argument is a valid buffer-mode symbol, and
- returns @code{#f} otherwise.
- @end deffn
- @node R6RS Transcoders
- @subsubsection Transcoders
- @cindex codec
- @cindex end-of-line style
- @cindex transcoder
- @cindex binary port
- @cindex textual port
- Several different Unicode encoding schemes describe standard ways to
- encode characters and strings as byte sequences and to decode those
- sequences. Within this document, a @dfn{codec} is an immutable Scheme
- object that represents a Unicode or similar encoding scheme.
- An @dfn{end-of-line style} is a symbol that, if it is not @code{none},
- describes how a textual port transcodes representations of line endings.
- A @dfn{transcoder} is an immutable Scheme object that combines a codec
- with an end-of-line style and a method for handling decoding errors.
- Each transcoder represents some specific bidirectional (but not
- necessarily lossless), possibly stateful translation between byte
- sequences and Unicode characters and strings. Every transcoder can
- operate in the input direction (bytes to characters) or in the output
- direction (characters to bytes). A @var{transcoder} parameter name
- means that the corresponding argument must be a transcoder.
- A @dfn{binary port} is a port that supports binary I/O, does not have an
- associated transcoder and does not support textual I/O. A @dfn{textual
- port} is a port that supports textual I/O, and does not support binary
- I/O. A textual port may or may not have an associated transcoder.
- @deffn {Scheme Procedure} latin-1-codec
- @deffnx {Scheme Procedure} utf-8-codec
- @deffnx {Scheme Procedure} utf-16-codec
- These are predefined codecs for the ISO 8859-1, UTF-8, and UTF-16
- encoding schemes.
- A call to any of these procedures returns a value that is equal in the
- sense of @code{eqv?} to the result of any other call to the same
- procedure.
- @end deffn
- @deffn {Scheme Syntax} eol-style @var{eol-style-symbol}
- @var{eol-style-symbol} should be a symbol whose name is one of
- @code{lf}, @code{cr}, @code{crlf}, @code{nel}, @code{crnel}, @code{ls},
- and @code{none}.
- The form evaluates to the corresponding symbol. If the name of
- @var{eol-style-symbol} is not one of these symbols, the effect and
- result are implementation-dependent; in particular, the result may be an
- eol-style symbol acceptable as an @var{eol-style} argument to
- @code{make-transcoder}. Otherwise, an exception is raised.
- All eol-style symbols except @code{none} describe a specific
- line-ending encoding:
- @table @code
- @item lf
- linefeed
- @item cr
- carriage return
- @item crlf
- carriage return, linefeed
- @item nel
- next line
- @item crnel
- carriage return, next line
- @item ls
- line separator
- @end table
- For a textual port with a transcoder, and whose transcoder has an
- eol-style symbol @code{none}, no conversion occurs. For a textual input
- port, any eol-style symbol other than @code{none} means that all of the
- above line-ending encodings are recognized and are translated into a
- single linefeed. For a textual output port, @code{none} and @code{lf}
- are equivalent. Linefeed characters are encoded according to the
- specified eol-style symbol, and all other characters that participate in
- possible line endings are encoded as is.
- @quotation Note
- Only the name of @var{eol-style-symbol} is significant.
- @end quotation
- @end deffn
- @deffn {Scheme Procedure} native-eol-style
- Returns the default end-of-line style of the underlying platform, e.g.,
- @code{lf} on Unix and @code{crlf} on Windows.
- @end deffn
- @deffn {Condition Type} &i/o-decoding
- @deffnx {Scheme Procedure} make-i/o-decoding-error port
- @deffnx {Scheme Procedure} i/o-decoding-error? obj
- This condition type could be defined by
- @lisp
- (define-condition-type &i/o-decoding &i/o-port
- make-i/o-decoding-error i/o-decoding-error?)
- @end lisp
- An exception with this type is raised when one of the operations for
- textual input from a port encounters a sequence of bytes that cannot be
- translated into a character or string by the input direction of the
- port's transcoder.
- When such an exception is raised, the port's position is past the
- invalid encoding.
- @end deffn
- @deffn {Condition Type} &i/o-encoding
- @deffnx {Scheme Procedure} make-i/o-encoding-error port char
- @deffnx {Scheme Procedure} i/o-encoding-error? obj
- @deffnx {Scheme Procedure} i/o-encoding-error-char condition
- This condition type could be defined by
- @lisp
- (define-condition-type &i/o-encoding &i/o-port
- make-i/o-encoding-error i/o-encoding-error?
- (char i/o-encoding-error-char))
- @end lisp
- An exception with this type is raised when one of the operations for
- textual output to a port encounters a character that cannot be
- translated into bytes by the output direction of the port's transcoder.
- @var{Char} is the character that could not be encoded.
- @end deffn
- @deffn {Scheme Syntax} error-handling-mode @var{error-handling-mode-symbol}
- @var{error-handling-mode-symbol} should be a symbol whose name is one of
- @code{ignore}, @code{raise}, and @code{replace}. The form evaluates to
- the corresponding symbol. If @var{error-handling-mode-symbol} is not
- one of these identifiers, effect and result are
- implementation-dependent: The result may be an error-handling-mode
- symbol acceptable as a @var{handling-mode} argument to
- @code{make-transcoder}. If it is not acceptable as a
- @var{handling-mode} argument to @code{make-transcoder}, an exception is
- raised.
- @quotation Note
- Only the name of @var{error-handling-style-symbol} is significant.
- @end quotation
- The error-handling mode of a transcoder specifies the behavior
- of textual I/O operations in the presence of encoding or decoding
- errors.
- If a textual input operation encounters an invalid or incomplete
- character encoding, and the error-handling mode is @code{ignore}, an
- appropriate number of bytes of the invalid encoding are ignored and
- decoding continues with the following bytes.
- If the error-handling mode is @code{replace}, the replacement
- character U+FFFD is injected into the data stream, an appropriate
- number of bytes are ignored, and decoding
- continues with the following bytes.
- If the error-handling mode is @code{raise}, an exception with condition
- type @code{&i/o-decoding} is raised.
- If a textual output operation encounters a character it cannot encode,
- and the error-handling mode is @code{ignore}, the character is ignored
- and encoding continues with the next character. If the error-handling
- mode is @code{replace}, a codec-specific replacement character is
- emitted by the transcoder, and encoding continues with the next
- character. The replacement character is U+FFFD for transcoders whose
- codec is one of the Unicode encodings, but is the @code{?} character
- for the Latin-1 encoding. If the error-handling mode is @code{raise},
- an exception with condition type @code{&i/o-encoding} is raised.
- @end deffn
- @deffn {Scheme Procedure} make-transcoder codec
- @deffnx {Scheme Procedure} make-transcoder codec eol-style
- @deffnx {Scheme Procedure} make-transcoder codec eol-style handling-mode
- @var{codec} must be a codec; @var{eol-style}, if present, an eol-style
- symbol; and @var{handling-mode}, if present, an error-handling-mode
- symbol.
- @var{eol-style} may be omitted, in which case it defaults to the native
- end-of-line style of the underlying platform. @var{Handling-mode} may
- be omitted, in which case it defaults to @code{replace}. The result is
- a transcoder with the behavior specified by its arguments.
- @end deffn
- @deffn {Scheme procedure} native-transcoder
- Returns an implementation-dependent transcoder that represents a
- possibly locale-dependent ``native'' transcoding.
- @end deffn
- @deffn {Scheme Procedure} transcoder-codec transcoder
- @deffnx {Scheme Procedure} transcoder-eol-style transcoder
- @deffnx {Scheme Procedure} transcoder-error-handling-mode transcoder
- These are accessors for transcoder objects; when applied to a
- transcoder returned by @code{make-transcoder}, they return the
- @var{codec}, @var{eol-style}, and @var{handling-mode} arguments,
- respectively.
- @end deffn
- @deffn {Scheme Procedure} bytevector->string bytevector transcoder
- Returns the string that results from transcoding the
- @var{bytevector} according to the input direction of the transcoder.
- @end deffn
- @deffn {Scheme Procedure} string->bytevector string transcoder
- Returns the bytevector that results from transcoding the
- @var{string} according to the output direction of the transcoder.
- @end deffn
- @node R6RS End-of-File
- @subsubsection The End-of-File Object
- @cindex EOF
- @cindex end-of-file
- R5RS' @code{eof-object?} procedure is provided by the @code{(rnrs io
- ports)} module:
- @deffn {Scheme Procedure} eof-object? obj
- @deffnx {C Function} scm_eof_object_p (obj)
- Return true if @var{obj} is the end-of-file (EOF) object.
- @end deffn
- In addition, the following procedure is provided:
- @deffn {Scheme Procedure} eof-object
- @deffnx {C Function} scm_eof_object ()
- Return the end-of-file (EOF) object.
- @lisp
- (eof-object? (eof-object))
- @result{} #t
- @end lisp
- @end deffn
- @node R6RS Port Manipulation
- @subsubsection Port Manipulation
- The procedures listed below operate on any kind of R6RS I/O port.
- @deffn {Scheme Procedure} port? obj
- Returns @code{#t} if the argument is a port, and returns @code{#f}
- otherwise.
- @end deffn
- @deffn {Scheme Procedure} port-transcoder port
- Returns the transcoder associated with @var{port} if @var{port} is
- textual and has an associated transcoder, and returns @code{#f} if
- @var{port} is binary or does not have an associated transcoder.
- @end deffn
- @deffn {Scheme Procedure} binary-port? port
- Return @code{#t} if @var{port} is a @dfn{binary port}, suitable for
- binary data input/output.
- Note that internally Guile does not differentiate between binary and
- textual ports, unlike the R6RS. Thus, this procedure returns true when
- @var{port} does not have an associated encoding---i.e., when
- @code{(port-encoding @var{port})} is @code{#f} (@pxref{Ports,
- port-encoding}). This is the case for ports returned by R6RS procedures
- such as @code{open-bytevector-input-port} and
- @code{make-custom-binary-output-port}.
- However, Guile currently does not prevent use of textual I/O procedures
- such as @code{display} or @code{read-char} with binary ports. Doing so
- ``upgrades'' the port from binary to textual, under the ISO-8859-1
- encoding. Likewise, Guile does not prevent use of
- @code{set-port-encoding!} on a binary port, which also turns it into a
- ``textual'' port.
- @end deffn
- @deffn {Scheme Procedure} textual-port? port
- Always return @var{#t}, as all ports can be used for textual I/O in
- Guile.
- @end deffn
- @deffn {Scheme Procedure} transcoded-port obj
- The @code{transcoded-port} procedure
- returns a new textual port with the specified @var{transcoder}.
- Otherwise the new textual port's state is largely the same as
- that of @var{binary-port}.
- If @var{binary-port} is an input port, the new textual
- port will be an input port and
- will transcode the bytes that have not yet been read from
- @var{binary-port}.
- If @var{binary-port} is an output port, the new textual
- port will be an output port and
- will transcode output characters into bytes that are
- written to the byte sink represented by @var{binary-port}.
- As a side effect, however, @code{transcoded-port}
- closes @var{binary-port} in
- a special way that allows the new textual port to continue to
- use the byte source or sink represented by @var{binary-port},
- even though @var{binary-port} itself is closed and cannot
- be used by the input and output operations described in this
- chapter.
- @end deffn
- @deffn {Scheme Procedure} port-position port
- If @var{port} supports it (see below), return the offset (an integer)
- indicating where the next octet will be read from/written to in
- @var{port}. If @var{port} does not support this operation, an error
- condition is raised.
- This is similar to Guile's @code{seek} procedure with the
- @code{SEEK_CUR} argument (@pxref{Random Access}).
- @end deffn
- @deffn {Scheme Procedure} port-has-port-position? port
- Return @code{#t} is @var{port} supports @code{port-position}.
- @end deffn
- @deffn {Scheme Procedure} set-port-position! port offset
- If @var{port} supports it (see below), set the position where the next
- octet will be read from/written to @var{port} to @var{offset} (an
- integer). If @var{port} does not support this operation, an error
- condition is raised.
- This is similar to Guile's @code{seek} procedure with the
- @code{SEEK_SET} argument (@pxref{Random Access}).
- @end deffn
- @deffn {Scheme Procedure} port-has-set-port-position!? port
- Return @code{#t} is @var{port} supports @code{set-port-position!}.
- @end deffn
- @deffn {Scheme Procedure} call-with-port port proc
- Call @var{proc}, passing it @var{port} and closing @var{port} upon exit
- of @var{proc}. Return the return values of @var{proc}.
- @end deffn
- @node R6RS Input Ports
- @subsubsection Input Ports
- @deffn {Scheme Procedure} input-port? obj@
- Returns @code{#t} if the argument is an input port (or a combined input
- and output port), and returns @code{#f} otherwise.
- @end deffn
- @deffn {Scheme Procedure} port-eof? port
- Returns @code{#t}
- if the @code{lookahead-u8} procedure (if @var{input-port} is a binary port)
- or the @code{lookahead-char} procedure (if @var{input-port} is a textual port)
- would return
- the end-of-file object, and @code{#f} otherwise.
- The operation may block indefinitely if no data is available
- but the port cannot be determined to be at end of file.
- @end deffn
- @deffn {Scheme Procedure} open-file-input-port filename
- @deffnx {Scheme Procedure} open-file-input-port filename file-options
- @deffnx {Scheme Procedure} open-file-input-port filename file-options buffer-mode
- @deffnx {Scheme Procedure} open-file-input-port filename file-options buffer-mode maybe-transcoder
- @var{Maybe-transcoder} must be either a transcoder or @code{#f}.
- The @code{open-file-input-port} procedure returns an
- input port for the named file. The @var{file-options} and
- @var{maybe-transcoder} arguments are optional.
- The @var{file-options} argument, which may determine
- various aspects of the returned port (@pxref{R6RS File Options}),
- defaults to the value of @code{(file-options)}.
- The @var{buffer-mode} argument, if supplied,
- must be one of the symbols that name a buffer mode.
- The @var{buffer-mode} argument defaults to @code{block}.
- If @var{maybe-transcoder} is a transcoder, it becomes the transcoder associated
- with the returned port.
- If @var{maybe-transcoder} is @code{#f} or absent,
- the port will be a binary port and will support the
- @code{port-position} and @code{set-port-position!} operations.
- Otherwise the port will be a textual port, and whether it supports
- the @code{port-position} and @code{set-port-position!} operations
- is implementation-dependent (and possibly transcoder-dependent).
- @end deffn
- @deffn {Scheme Procedure} standard-input-port
- Returns a fresh binary input port connected to standard input. Whether
- the port supports the @code{port-position} and @code{set-port-position!}
- operations is implementation-dependent.
- @end deffn
- @deffn {Scheme Procedure} current-input-port
- This returns a default textual port for input. Normally, this default
- port is associated with standard input, but can be dynamically
- re-assigned using the @code{with-input-from-file} procedure from the
- @code{io simple (6)} library (@pxref{rnrs io simple}). The port may or
- may not have an associated transcoder; if it does, the transcoder is
- implementation-dependent.
- @end deffn
- @node R6RS Binary Input
- @subsubsection Binary Input
- @cindex binary input
- R6RS binary input ports can be created with the procedures described
- below.
- @deffn {Scheme Procedure} open-bytevector-input-port bv [transcoder]
- @deffnx {C Function} scm_open_bytevector_input_port (bv, transcoder)
- Return an input port whose contents are drawn from bytevector @var{bv}
- (@pxref{Bytevectors}).
- @c FIXME: Update description when implemented.
- The @var{transcoder} argument is currently not supported.
- @end deffn
- @cindex custom binary input ports
- @deffn {Scheme Procedure} make-custom-binary-input-port id read! get-position set-position! close
- @deffnx {C Function} scm_make_custom_binary_input_port (id, read!, get-position, set-position!, close)
- Return a new custom binary input port@footnote{This is similar in spirit
- to Guile's @dfn{soft ports} (@pxref{Soft Ports}).} named @var{id} (a
- string) whose input is drained by invoking @var{read!} and passing it a
- bytevector, an index where bytes should be written, and the number of
- bytes to read. The @code{read!} procedure must return an integer
- indicating the number of bytes read, or @code{0} to indicate the
- end-of-file.
- Optionally, if @var{get-position} is not @code{#f}, it must be a thunk
- that will be called when @var{port-position} is invoked on the custom
- binary port and should return an integer indicating the position within
- the underlying data stream; if @var{get-position} was not supplied, the
- returned port does not support @var{port-position}.
- Likewise, if @var{set-position!} is not @code{#f}, it should be a
- one-argument procedure. When @var{set-port-position!} is invoked on the
- custom binary input port, @var{set-position!} is passed an integer
- indicating the position of the next byte is to read.
- Finally, if @var{close} is not @code{#f}, it must be a thunk. It is
- invoked when the custom binary input port is closed.
- Using a custom binary input port, the @code{open-bytevector-input-port}
- procedure could be implemented as follows:
- @lisp
- (define (open-bytevector-input-port source)
- (define position 0)
- (define length (bytevector-length source))
- (define (read! bv start count)
- (let ((count (min count (- length position))))
- (bytevector-copy! source position
- bv start count)
- (set! position (+ position count))
- count))
- (define (get-position) position)
- (define (set-position! new-position)
- (set! position new-position))
- (make-custom-binary-input-port "the port" read!
- get-position
- set-position!))
- (read (open-bytevector-input-port (string->utf8 "hello")))
- @result{} hello
- @end lisp
- @end deffn
- @cindex binary input
- Binary input is achieved using the procedures below:
- @deffn {Scheme Procedure} get-u8 port
- @deffnx {C Function} scm_get_u8 (port)
- Return an octet read from @var{port}, a binary input port, blocking as
- necessary, or the end-of-file object.
- @end deffn
- @deffn {Scheme Procedure} lookahead-u8 port
- @deffnx {C Function} scm_lookahead_u8 (port)
- Like @code{get-u8} but does not update @var{port}'s position to point
- past the octet.
- @end deffn
- @deffn {Scheme Procedure} get-bytevector-n port count
- @deffnx {C Function} scm_get_bytevector_n (port, count)
- Read @var{count} octets from @var{port}, blocking as necessary and
- return a bytevector containing the octets read. If fewer bytes are
- available, a bytevector smaller than @var{count} is returned.
- @end deffn
- @deffn {Scheme Procedure} get-bytevector-n! port bv start count
- @deffnx {C Function} scm_get_bytevector_n_x (port, bv, start, count)
- Read @var{count} bytes from @var{port} and store them in @var{bv}
- starting at index @var{start}. Return either the number of bytes
- actually read or the end-of-file object.
- @end deffn
- @deffn {Scheme Procedure} get-bytevector-some port
- @deffnx {C Function} scm_get_bytevector_some (port)
- Read from @var{port}, blocking as necessary, until data are available or
- and end-of-file is reached. Return either a new bytevector containing
- the data read or the end-of-file object.
- @end deffn
- @deffn {Scheme Procedure} get-bytevector-all port
- @deffnx {C Function} scm_get_bytevector_all (port)
- Read from @var{port}, blocking as necessary, until the end-of-file is
- reached. Return either a new bytevector containing the data read or the
- end-of-file object (if no data were available).
- @end deffn
- @node R6RS Textual Input
- @subsubsection Textual Input
- @deffn {Scheme Procedure} get-char port
- Reads from @var{textual-input-port}, blocking as necessary, until a
- complete character is available from @var{textual-input-port},
- or until an end of file is reached.
- If a complete character is available before the next end of file,
- @code{get-char} returns that character and updates the input port to
- point past the character. If an end of file is reached before any
- character is read, @code{get-char} returns the end-of-file object.
- @end deffn
- @deffn {Scheme Procedure} lookahead-char port
- The @code{lookahead-char} procedure is like @code{get-char}, but it does
- not update @var{textual-input-port} to point past the character.
- @end deffn
- @deffn {Scheme Procedure} get-string-n port count
- @var{Count} must be an exact, non-negative integer object, representing
- the number of characters to be read.
- The @code{get-string-n} procedure reads from @var{textual-input-port},
- blocking as necessary, until @var{count} characters are available, or
- until an end of file is reached.
- If @var{count} characters are available before end of file,
- @code{get-string-n} returns a string consisting of those @var{count}
- characters. If fewer characters are available before an end of file, but
- one or more characters can be read, @code{get-string-n} returns a string
- containing those characters. In either case, the input port is updated
- to point just past the characters read. If no characters can be read
- before an end of file, the end-of-file object is returned.
- @end deffn
- @deffn {Scheme Procedure} get-string-n! port string start count
- @var{Start} and @var{count} must be exact, non-negative integer objects,
- with @var{count} representing the number of characters to be read.
- @var{String} must be a string with at least $@var{start} + @var{count}$
- characters.
- The @code{get-string-n!} procedure reads from @var{textual-input-port}
- in the same manner as @code{get-string-n}. If @var{count} characters
- are available before an end of file, they are written into @var{string}
- starting at index @var{start}, and @var{count} is returned. If fewer
- characters are available before an end of file, but one or more can be
- read, those characters are written into @var{string} starting at index
- @var{start} and the number of characters actually read is returned as an
- exact integer object. If no characters can be read before an end of
- file, the end-of-file object is returned.
- @end deffn
- @deffn {Scheme Procedure} get-string-all port count
- Reads from @var{textual-input-port} until an end of file, decoding
- characters in the same manner as @code{get-string-n} and
- @code{get-string-n!}.
- If characters are available before the end of file, a string containing
- all the characters decoded from that data are returned. If no character
- precedes the end of file, the end-of-file object is returned.
- @end deffn
- @deffn {Scheme Procedure} get-line port
- Reads from @var{textual-input-port} up to and including the linefeed
- character or end of file, decoding characters in the same manner as
- @code{get-string-n} and @code{get-string-n!}.
- If a linefeed character is read, a string containing all of the text up
- to (but not including) the linefeed character is returned, and the port
- is updated to point just past the linefeed character. If an end of file
- is encountered before any linefeed character is read, but some
- characters have been read and decoded as characters, a string containing
- those characters is returned. If an end of file is encountered before
- any characters are read, the end-of-file object is returned.
- @quotation Note
- The end-of-line style, if not @code{none}, will cause all line endings
- to be read as linefeed characters. @xref{R6RS Transcoders}.
- @end quotation
- @end deffn
- @deffn {Scheme Procedure} get-datum port count
- Reads an external representation from @var{textual-input-port} and returns the
- datum it represents. The @code{get-datum} procedure returns the next
- datum that can be parsed from the given @var{textual-input-port}, updating
- @var{textual-input-port} to point exactly past the end of the external
- representation of the object.
- Any @emph{interlexeme space} (comment or whitespace, @pxref{Scheme
- Syntax}) in the input is first skipped. If an end of file occurs after
- the interlexeme space, the end-of-file object (@pxref{R6RS End-of-File})
- is returned.
- If a character inconsistent with an external representation is
- encountered in the input, an exception with condition types
- @code{&lexical} and @code{&i/o-read} is raised. Also, if the end of
- file is encountered after the beginning of an external representation,
- but the external representation is incomplete and therefore cannot be
- parsed, an exception with condition types @code{&lexical} and
- @code{&i/o-read} is raised.
- @end deffn
- @node R6RS Output Ports
- @subsubsection Output Ports
- @deffn {Scheme Procedure} output-port? obj
- Returns @code{#t} if the argument is an output port (or a
- combined input and output port), @code{#f} otherwise.
- @end deffn
- @deffn {Scheme Procedure} flush-output-port port
- Flushes any buffered output from the buffer of @var{output-port} to the
- underlying file, device, or object. The @code{flush-output-port}
- procedure returns an unspecified values.
- @end deffn
- @deffn {Scheme Procedure} open-file-output-port filename
- @deffnx {Scheme Procedure} open-file-output-port filename file-options
- @deffnx {Scheme Procedure} open-file-output-port filename file-options buffer-mode
- @deffnx {Scheme Procedure} open-file-output-port filename file-options buffer-mode maybe-transcoder
- @var{maybe-transcoder} must be either a transcoder or @code{#f}.
- The @code{open-file-output-port} procedure returns an output port for the named file.
- The @var{file-options} argument, which may determine various aspects of
- the returned port (@pxref{R6RS File Options}), defaults to the value of
- @code{(file-options)}.
- The @var{buffer-mode} argument, if supplied,
- must be one of the symbols that name a buffer mode.
- The @var{buffer-mode} argument defaults to @code{block}.
- If @var{maybe-transcoder} is a transcoder, it becomes the transcoder
- associated with the port.
- If @var{maybe-transcoder} is @code{#f} or absent,
- the port will be a binary port and will support the
- @code{port-position} and @code{set-port-position!} operations.
- Otherwise the port will be a textual port, and whether it supports
- the @code{port-position} and @code{set-port-position!} operations
- is implementation-dependent (and possibly transcoder-dependent).
- @end deffn
- @deffn {Scheme Procedure} standard-output-port
- @deffnx {Scheme Procedure} standard-error-port
- Returns a fresh binary output port connected to the standard output or
- standard error respectively. Whether the port supports the
- @code{port-position} and @code{set-port-position!} operations is
- implementation-dependent.
- @end deffn
- @deffn {Scheme Procedure} current-output-port
- @deffnx {Scheme Procedure} current-error-port
- These return default textual ports for regular output and error output.
- Normally, these default ports are associated with standard output, and
- standard error, respectively. The return value of
- @code{current-output-port} can be dynamically re-assigned using the
- @code{with-output-to-file} procedure from the @code{io simple (6)}
- library (@pxref{rnrs io simple}). A port returned by one of these
- procedures may or may not have an associated transcoder; if it does, the
- transcoder is implementation-dependent.
- @end deffn
- @node R6RS Binary Output
- @subsubsection Binary Output
- Binary output ports can be created with the procedures below.
- @deffn {Scheme Procedure} open-bytevector-output-port [transcoder]
- @deffnx {C Function} scm_open_bytevector_output_port (transcoder)
- Return two values: a binary output port and a procedure. The latter
- should be called with zero arguments to obtain a bytevector containing
- the data accumulated by the port, as illustrated below.
- @lisp
- (call-with-values
- (lambda ()
- (open-bytevector-output-port))
- (lambda (port get-bytevector)
- (display "hello" port)
- (get-bytevector)))
- @result{} #vu8(104 101 108 108 111)
- @end lisp
- @c FIXME: Update description when implemented.
- The @var{transcoder} argument is currently not supported.
- @end deffn
- @cindex custom binary output ports
- @deffn {Scheme Procedure} make-custom-binary-output-port id write! get-position set-position! close
- @deffnx {C Function} scm_make_custom_binary_output_port (id, write!, get-position, set-position!, close)
- Return a new custom binary output port named @var{id} (a string) whose
- output is sunk by invoking @var{write!} and passing it a bytevector, an
- index where bytes should be read from this bytevector, and the number of
- bytes to be ``written''. The @code{write!} procedure must return an
- integer indicating the number of bytes actually written; when it is
- passed @code{0} as the number of bytes to write, it should behave as
- though an end-of-file was sent to the byte sink.
- The other arguments are as for @code{make-custom-binary-input-port}
- (@pxref{R6RS Binary Input, @code{make-custom-binary-input-port}}).
- @end deffn
- @cindex binary output
- Writing to a binary output port can be done using the following
- procedures:
- @deffn {Scheme Procedure} put-u8 port octet
- @deffnx {C Function} scm_put_u8 (port, octet)
- Write @var{octet}, an integer in the 0--255 range, to @var{port}, a
- binary output port.
- @end deffn
- @deffn {Scheme Procedure} put-bytevector port bv [start [count]]
- @deffnx {C Function} scm_put_bytevector (port, bv, start, count)
- Write the contents of @var{bv} to @var{port}, optionally starting at
- index @var{start} and limiting to @var{count} octets.
- @end deffn
- @node R6RS Textual Output
- @subsubsection Textual Output
- @deffn {Scheme Procedure} put-char port char
- Writes @var{char} to the port. The @code{put-char} procedure returns
- @end deffn
- @deffn {Scheme Procedure} put-string port string
- @deffnx {Scheme Procedure} put-string port string start
- @deffnx {Scheme Procedure} put-string port string start count
- @var{start} and @var{count} must be non-negative exact integer objects.
- @var{string} must have a length of at least @math{@var{start} +
- @var{count}}. @var{start} defaults to 0. @var{count} defaults to
- @math{@code{(string-length @var{string})} - @var{start}}$. The
- @code{put-string} procedure writes the @var{count} characters of
- @var{string} starting at index @var{start} to the port. The
- @code{put-string} procedure returns an unspecified value.
- @end deffn
- @deffn {Scheme Procedure} put-datum port datum
- @var{datum} should be a datum value. The @code{put-datum} procedure
- writes an external representation of @var{datum} to
- @var{textual-output-port}. The specific external representation is
- implementation-dependent. However, whenever possible, an implementation
- should produce a representation for which @code{get-datum}, when reading
- the representation, will return an object equal (in the sense of
- @code{equal?}) to @var{datum}.
- @quotation Note
- Not all datums may allow producing an external representation for which
- @code{get-datum} will produce an object that is equal to the
- original. Specifically, NaNs contained in @var{datum} may make
- this impossible.
- @end quotation
- @quotation Note
- The @code{put-datum} procedure merely writes the external
- representation, but no trailing delimiter. If @code{put-datum} is
- used to write several subsequent external representations to an
- output port, care should be taken to delimit them properly so they can
- be read back in by subsequent calls to @code{get-datum}.
- @end quotation
- @end deffn
- @node I/O Extensions
- @subsection Using and Extending Ports in C
- @menu
- * C Port Interface:: Using ports from C.
- * Port Implementation:: How to implement a new port type in C.
- @end menu
- @node C Port Interface
- @subsubsection C Port Interface
- @cindex C port interface
- @cindex Port, C interface
- This section describes how to use Scheme ports from C.
- @subsubheading Port basics
- @cindex ptob
- @tindex scm_ptob_descriptor
- @tindex scm_port
- @findex SCM_PTAB_ENTRY
- @findex SCM_PTOBNUM
- @vindex scm_ptobs
- There are two main data structures. A port type object (ptob) is of
- type @code{scm_ptob_descriptor}. A port instance is of type
- @code{scm_port}. Given an @code{SCM} variable which points to a port,
- the corresponding C port object can be obtained using the
- @code{SCM_PTAB_ENTRY} macro. The ptob can be obtained by using
- @code{SCM_PTOBNUM} to give an index into the @code{scm_ptobs}
- global array.
- @subsubheading Port buffers
- An input port always has a read buffer and an output port always has a
- write buffer. However the size of these buffers is not guaranteed to be
- more than one byte (e.g., the @code{shortbuf} field in @code{scm_port}
- which is used when no other buffer is allocated). The way in which the
- buffers are allocated depends on the implementation of the ptob. For
- example in the case of an fport, buffers may be allocated with malloc
- when the port is created, but in the case of an strport the underlying
- string is used as the buffer.
- @subsubheading The @code{rw_random} flag
- Special treatment is required for ports which can be seeked at random.
- Before various operations, such as seeking the port or changing from
- input to output on a bidirectional port or vice versa, the port
- implementation must be given a chance to update its state. The write
- buffer is updated by calling the @code{flush} ptob procedure and the
- input buffer is updated by calling the @code{end_input} ptob procedure.
- In the case of an fport, @code{flush} causes buffered output to be
- written to the file descriptor, while @code{end_input} causes the
- descriptor position to be adjusted to account for buffered input which
- was never read.
- The special treatment must be performed if the @code{rw_random} flag in
- the port is non-zero.
- @subsubheading The @code{rw_active} variable
- The @code{rw_active} variable in the port is only used if
- @code{rw_random} is set. It's defined as an enum with the following
- values:
- @table @code
- @item SCM_PORT_READ
- the read buffer may have unread data.
- @item SCM_PORT_WRITE
- the write buffer may have unwritten data.
- @item SCM_PORT_NEITHER
- neither the write nor the read buffer has data.
- @end table
- @subsubheading Reading from a port.
- To read from a port, it's possible to either call existing libguile
- procedures such as @code{scm_getc} and @code{scm_read_line} or to read
- data from the read buffer directly. Reading from the buffer involves
- the following steps:
- @enumerate
- @item
- Flush output on the port, if @code{rw_active} is @code{SCM_PORT_WRITE}.
- @item
- Fill the read buffer, if it's empty, using @code{scm_fill_input}.
- @item Read the data from the buffer and update the read position in
- the buffer. Steps 2) and 3) may be repeated as many times as required.
- @item Set rw_active to @code{SCM_PORT_READ} if @code{rw_random} is set.
- @item update the port's line and column counts.
- @end enumerate
- @subsubheading Writing to a port.
- To write data to a port, calling @code{scm_lfwrite} should be sufficient for
- most purposes. This takes care of the following steps:
- @enumerate
- @item
- End input on the port, if @code{rw_active} is @code{SCM_PORT_READ}.
- @item
- Pass the data to the ptob implementation using the @code{write} ptob
- procedure. The advantage of using the ptob @code{write} instead of
- manipulating the write buffer directly is that it allows the data to be
- written in one operation even if the port is using the single-byte
- @code{shortbuf}.
- @item
- Set @code{rw_active} to @code{SCM_PORT_WRITE} if @code{rw_random}
- is set.
- @end enumerate
- @node Port Implementation
- @subsubsection Port Implementation
- @cindex Port implementation
- This section describes how to implement a new port type in C.
- As described in the previous section, a port type object (ptob) is
- a structure of type @code{scm_ptob_descriptor}. A ptob is created by
- calling @code{scm_make_port_type}.
- @deftypefun scm_t_bits scm_make_port_type (char *name, int (*fill_input) (SCM port), void (*write) (SCM port, const void *data, size_t size))
- Return a new port type object. The @var{name}, @var{fill_input} and
- @var{write} parameters are initial values for those port type fields,
- as described below. The other fields are initialized with default
- values and can be changed later.
- @end deftypefun
- All of the elements of the ptob, apart from @code{name}, are procedures
- which collectively implement the port behaviour. Creating a new port
- type mostly involves writing these procedures.
- @table @code
- @item name
- A pointer to a NUL terminated string: the name of the port type. This
- is the only element of @code{scm_ptob_descriptor} which is not
- a procedure. Set via the first argument to @code{scm_make_port_type}.
- @item mark
- Called during garbage collection to mark any SCM objects that a port
- object may contain. It doesn't need to be set unless the port has
- @code{SCM} components. Set using
- @deftypefun void scm_set_port_mark (scm_t_bits tc, SCM (*mark) (SCM port))
- @end deftypefun
- @item free
- Called when the port is collected during gc. It
- should free any resources used by the port.
- Set using
- @deftypefun void scm_set_port_free (scm_t_bits tc, size_t (*free) (SCM port))
- @end deftypefun
- @item print
- Called when @code{write} is called on the port object, to print a
- port description. E.g., for an fport it may produce something like:
- @code{#<input: /etc/passwd 3>}. Set using
- @deftypefun void scm_set_port_print (scm_t_bits tc, int (*print) (SCM port, SCM dest_port, scm_print_state *pstate))
- The first argument @var{port} is the object being printed, the second
- argument @var{dest_port} is where its description should go.
- @end deftypefun
- @item equalp
- Not used at present. Set using
- @deftypefun void scm_set_port_equalp (scm_t_bits tc, SCM (*equalp) (SCM, SCM))
- @end deftypefun
- @item close
- Called when the port is closed, unless it was collected during gc. It
- should free any resources used by the port.
- Set using
- @deftypefun void scm_set_port_close (scm_t_bits tc, int (*close) (SCM port))
- @end deftypefun
- @item write
- Accept data which is to be written using the port. The port implementation
- may choose to buffer the data instead of processing it directly.
- Set via the third argument to @code{scm_make_port_type}.
- @item flush
- Complete the processing of buffered output data. Reset the value of
- @code{rw_active} to @code{SCM_PORT_NEITHER}.
- Set using
- @deftypefun void scm_set_port_flush (scm_t_bits tc, void (*flush) (SCM port))
- @end deftypefun
- @item end_input
- Perform any synchronization required when switching from input to output
- on the port. Reset the value of @code{rw_active} to @code{SCM_PORT_NEITHER}.
- Set using
- @deftypefun void scm_set_port_end_input (scm_t_bits tc, void (*end_input) (SCM port, int offset))
- @end deftypefun
- @item fill_input
- Read new data into the read buffer and return the first character. It
- can be assumed that the read buffer is empty when this procedure is called.
- Set via the second argument to @code{scm_make_port_type}.
- @item input_waiting
- Return a lower bound on the number of bytes that could be read from the
- port without blocking. It can be assumed that the current state of
- @code{rw_active} is @code{SCM_PORT_NEITHER}.
- Set using
- @deftypefun void scm_set_port_input_waiting (scm_t_bits tc, int (*input_waiting) (SCM port))
- @end deftypefun
- @item seek
- Set the current position of the port. The procedure can not make
- any assumptions about the value of @code{rw_active} when it's
- called. It can reset the buffers first if desired by using something
- like:
- @example
- if (pt->rw_active == SCM_PORT_READ)
- scm_end_input (port);
- else if (pt->rw_active == SCM_PORT_WRITE)
- ptob->flush (port);
- @end example
- However note that this will have the side effect of discarding any data
- in the unread-char buffer, in addition to any side effects from the
- @code{end_input} and @code{flush} ptob procedures. This is undesirable
- when seek is called to measure the current position of the port, i.e.,
- @code{(seek p 0 SEEK_CUR)}. The libguile fport and string port
- implementations take care to avoid this problem.
- The procedure is set using
- @deftypefun void scm_set_port_seek (scm_t_bits tc, scm_t_off (*seek) (SCM port, scm_t_off offset, int whence))
- @end deftypefun
- @item truncate
- Truncate the port data to be specified length. It can be assumed that the
- current state of @code{rw_active} is @code{SCM_PORT_NEITHER}.
- Set using
- @deftypefun void scm_set_port_truncate (scm_t_bits tc, void (*truncate) (SCM port, scm_t_off length))
- @end deftypefun
- @end table
- @c Local Variables:
- @c TeX-master: "guile.texi"
- @c End:
|