Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file stream.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311(* Copyright (c) 2017 Anil Madhavapeddy <anil@recoil.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. *)openSexplib.ConvopenRresultopenTypesmoduleB=Yaml_ffi.MmoduleT=Yaml_types.Mtypetag_directive={handle:string;prefix:string;}[@@derivingsexp]leterror_to_msge=matchewith|`None->"No error"|`Memory->"Reader error"|`Scanner->"Scanner error"|`Parser->"Parser error"|`Composer->"Compose error"|`Writer->"Writer error"|`Emitter->"Emitter error"|`Ei->"Unknown error code "^(Int64.to_stringi)letscalar_style_of_ffis:scalar_style=matchswith|`Any->`Any|`Plain->`Plain|`Single_quoted->`Single_quoted|`Double_quoted->`Double_quoted|`Literal->`Literal|`Folded->`Folded|`Eerr->raise(Invalid_argument("invalid scalar style"^(Int64.to_stringerr)))letlayout_style_of_ffis:layout_style=matchswith|`Any->`Any|`Block->`Block|`Flow->`Flow|`Eerr->raise(Invalid_argument("invalid mapping style"^(Int64.to_stringerr)))letlayout_style_of_ffis:layout_style=matchswith|`Any->`Any|`Block->`Block|`Flow->`Flow|`Eerr->raise(Invalid_argument("invalid sequence style"^(Int64.to_stringerr)))letencoding_of_ffie:encoding=matchewith|`Any->`Any|`Utf16be->`Utf16be|`Utf16le->`Utf16le|`Utf8->`Utf8|`Eerr->raise(Invalid_argument("invalid encoding "^(Int64.to_stringerr)))lettag_directive_of_ffie=letopenCtypesinlethandle=!@(e|->T.Tag_directive.handle)inletprefix=!@(e|->T.Tag_directive.prefix)in{handle;prefix}letlist_of_tag_directivestds=letopenCtypesinletmoduleTEDT=T.Event.Document_start.Tag_directivesinlethd=!@(tds|->TEDT.start)in(* TODO not clear how to parse this as not a linked list *)letacc=[hd]inList.maptag_directive_of_ffiaccletversion_of_directive~major~minor=matchmajor,minorwith|1,0->`V1_0|1,1->`V1_1|_->raise(Invalid_argument(Printf.sprintf"Unsupported Yaml version %d.%d"majorminor))moduleMark=structtypet={index:int;line:int;column:int;}[@@derivingsexp]letof_ffim=letopenCtypesinletint_fieldf=getfmf|>Unsigned.Size_t.to_intinletindex=int_fieldT.Mark.indexinletline=int_fieldT.Mark.lineinletcolumn=int_fieldT.Mark.columnin{index;line;column}endmoduleEvent=structtypepos={start_mark:Mark.t;end_mark:Mark.t;}[@@derivingsexp]typet=|Stream_startof{encoding:encoding}|Document_startof{version:versionoption;implicit:bool}|Document_endof{implicit:bool}|Mapping_startof{anchor:stringoption;tag:stringoption;implicit:bool;style:layout_style}|Mapping_end|Stream_end|Scalarof{anchor:stringoption;tag:stringoption;value:string;plain_implicit:bool;quoted_implicit:bool;style:scalar_style}|Sequence_startof{anchor:stringoption;tag:stringoption;implicit:bool;style:layout_style}|Sequence_end|Aliasof{anchor:string}|Nothing[@@derivingsexp]letof_ffie:t*pos=letopenT.EventinletopenCtypesinletty=getfe_typeinletdata=getfedatainletstart_mark=getfestart_mark|>Mark.of_ffiinletend_mark=getfeend_mark|>Mark.of_ffiinletpos={start_mark;end_mark}inletr=matchtywith|`Stream_start->letstart=getfdataData.stream_startinletencoding=getfstartStream_start.encoding|>encoding_of_ffiinStream_start{encoding}|`Document_start->letds=getfdataData.document_startinletversion=letvd=getfdsDocument_start.version_directiveinmatchvdwith|None->None|Somevd->letvd=!@vdinletmajor=getfvdT.Version_directive.majorinletminor=getfvdT.Version_directive.minorinSome(version_of_directive~major~minor)inletimplicit=getfdsDocument_start.implicit<>0inDocument_start{version;implicit}|`Mapping_start->letms=getfdataData.mapping_startinletanchor=getfmsMapping_start.anchorinlettag=getfmsMapping_start.taginletimplicit=getfmsMapping_start.implicit<>0inletstyle=getfmsMapping_start.style|>layout_style_of_ffiinMapping_start{anchor;tag;implicit;style}|`Scalar->lets=getfdataData.scalarinletanchor=getfsScalar.anchorinlettag=getfsScalar.taginletvalue=getfsScalar.valueinletplain_implicit=getfsScalar.plain_implicit<>0inletquoted_implicit=getfsScalar.quoted_implicit<>0inletstyle=getfsScalar.style|>scalar_style_of_ffiinScalar{anchor;tag;value;plain_implicit;quoted_implicit;style}|`Document_end->letde=getfdataData.document_endinletimplicit=getfdeDocument_end.implicit<>0inDocument_end{implicit}|`Sequence_start->letss=getfdataData.sequence_startinletanchor=getfssSequence_start.anchorinlettag=getfssSequence_start.taginletimplicit=getfssSequence_start.implicit<>0inletstyle=getfssSequence_start.style|>layout_style_of_ffiinSequence_start{anchor;tag;implicit;style}|`Sequence_end->Sequence_end|`Mapping_end->Mapping_end|`Stream_end->Stream_end|`Alias->leta=getfdataData.aliasinletanchor=matchgetfaAlias.anchorwith|None->raise(Invalid_argument"empty anchor alias")|Somea->ainAlias{anchor}|`None->Nothing|`Ei->raise(Invalid_argument("Unexpected event, internal library error "^(Int64.to_stringi)))inr,posendletversion=B.versionletget_version()=letmajor=Ctypes.(allocateint0)inletminor=Ctypes.(allocateint0)inletpatch=Ctypes.(allocateint0)inB.get_versionmajorminorpatch;letmajor=Ctypes.((!@)major)inletminor=Ctypes.((!@)minor)inletpatch=Ctypes.((!@)patch)inmajor,minor,patchtypeparser={p:T.Parser.tCtypes.structureCtypes.ptr;event:T.Event.tCtypes.structureCtypes.ptr;buf:string;}letparserbuf=letp=Ctypes.(allocate_nT.Parser.t~count:1)inletevent=Ctypes.(allocate_nT.Event.t~count:1)inletr=B.parser_initpinletlen=String.lengthbuf|>Unsigned.Size_t.of_intinB.parser_set_input_stringpbuflen;matchrwith|1->R.ok{buf;p;event}|_->R.error_msg"error initialising parser"letdo_parse{p;event}=letopenCtypesinletr=B.parser_parsepeventinmatchrwith|1->Event.of_ffi(!@event)|>R.ok|_->R.error_msg"error calling parser"typeemitter={e:T.Emitter.tCtypes.structureCtypes.ptr;event:T.Event.tCtypes.structureCtypes.ptr;buf:Bytes.t;written:Unsigned.size_tCtypes.ptr;}letemitter_written{written;_}=Ctypes.(!@written)|>Unsigned.Size_t.to_intletemitter?(len=16386)()=lete=Ctypes.(allocate_nT.Emitter.t~count:1)inletevent=Ctypes.(allocate_nT.Event.t~count:1)inletwritten=Ctypes.allocate_nCtypes.size_t~count:1inletr=B.emitter_initeinletbuf=Bytes.createleninletlen=Bytes.lengthbuf|>Unsigned.Size_t.of_intinB.emitter_set_output_stringe(Ctypes.ocaml_bytes_startbuf)lenwritten;matchrwith|1->R.ok{e;event;written;buf}|_->R.error_msg"error initialising emitter"letemitter_buf{buf;written}=Ctypes.(!@written)|>Unsigned.Size_t.to_int|>Bytes.subbuf0letcheckla=matchawith|0->R.error_msg(l^" failed")|1->R.ok()|_->R.error_msg"unexpected return value"letcheck_emitl{e;event}a=checkla>>=fun()->checkl@@B.emitter_emiteeventletstream_starttencoding=check_emit"stream_start"t@@B.stream_start_event_initt.event(encoding:>T.Encoding.t)letstream_endt=check_emit"stream_end"t@@B.stream_end_event_initt.eventletdocument_start?(implicit=true)t=letopenCtypesinletver=from_voidpT.Version_directive.tnullinlettag=from_voidpT.Tag_directive.tnullincheck_emit"doc_start"t@@B.document_start_event_initt.eventvertagtagimplicitletdocument_end?(implicit=true)t=check_emit"doc_end"t@@B.document_end_event_initt.eventimplicitletscalar?(plain_implicit=true)?(quoted_implicit=false)?anchor?tag?(style=`Plain)tvalue=check_emit"scalar"t@@B.scalar_event_initt.eventanchortagvalue(String.lengthvalue)plain_implicitquoted_implicit(style:>T.Scalar_style.t)letsequence_start?anchor?tag?(implicit=true)?(style=`Block)t=check_emit"seq_start"t@@B.sequence_start_event_initt.eventanchortagimplicit(style:>T.Sequence_style.t)letsequence_endt=check_emit"seq_end"t@@B.sequence_end_event_initt.eventletmapping_start?anchor?tag?(implicit=true)?(style=`Block)t=check_emit"mapping_start"t@@B.mapping_start_event_initt.eventanchortagimplicit(style:>T.Mapping_style.t)letmapping_endt=check_emit"mapping_end"t@@B.mapping_end_event_initt.eventletaliastvalue=check_emit"alias"t@@B.alias_event_initt.eventvalueletemitt=letopenEventinfunction|Stream_start{encoding}->stream_starttencoding|Document_start{version;implicit}->document_start~implicitt|Document_end{implicit}->document_end~implicitt|Mapping_start{anchor;tag;implicit;style}->mapping_start?anchor?tag~implicit~stylet|Mapping_end->mapping_endt|Stream_end->stream_endt|Scalar{anchor;tag;value;plain_implicit;quoted_implicit;style}->scalar?anchor?tag~plain_implicit~quoted_implicit~styletvalue|Sequence_start{anchor;tag;implicit;style}->sequence_start?anchor?tag~implicit~stylet|Sequence_end->sequence_endt|Alias{anchor}->aliastanchor|Nothing->Ok()