Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file data.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834(**************************************************************************)(* *)(* This file is part of Frama-C. *)(* *)(* Copyright (C) 2007-2024 *)(* CEA (Commissariat à l'énergie atomique et aux énergies *)(* alternatives) *)(* *)(* you can redistribute it and/or modify it under the terms of the GNU *)(* Lesser General Public License as published by the Free Software *)(* Foundation, version 2.1. *)(* *)(* It is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* See the GNU Lesser General Public License version 2.1 *)(* for more details (enclosed in the file licenses/LGPLv2.1). *)(* *)(**************************************************************************)openPackagemoduleJs=Yojson.BasicmoduleJu=Yojson.Basic.Util(* -------------------------------------------------------------------------- *)(* --- Data Encoding --- *)(* -------------------------------------------------------------------------- *)typejson=Js.tletpretty=Js.pretty_print~std:falsemoduletypeS=sigtypetvaljtype:jtypevalof_json:json->tvalto_json:t->jsonendexceptionInputErrorofstringletfailure?jsonmsg=letadd_jsonmsg=letmsg=matchjsonwith|None->msg|Somejson->Format.asprintf"@[%s:@ %s@]"msg(Js.pretty_to_stringjson)inraise(InputError(msg))inPretty_utils.ksfprintfadd_jsonmsgletfailure_from_type_errormsgjson=failure~json"%s"msgletpackage=Package.package~name:"data"~title:"Informations"()(* -------------------------------------------------------------------------- *)(* --- Declared Type --- *)(* -------------------------------------------------------------------------- *)letderived~package~idjtype=letmoduleMd=Markdowninbegindeclare~package~name:(Derived.decodeid).name~descr:(Md.plain"Decoder for"@Md.codeid.name)(D_decoder(id,jtype));declare~package~name:(Derived.orderid).name~descr:(Md.plain"Natural order for"@Md.codeid.name)(D_order(id,jtype));declare~package~name:(Derived.defaultid).name~descr:(Md.plain"Default value for"@Md.codeid.name)(D_default(id,jtype));Jdata(id,jtype)endletdeclare~package~name?descrjtype=letid=declare_id~package~name?descr(D_typejtype)inderived~package~idjtype(* -------------------------------------------------------------------------- *)(* --- Option --- *)(* -------------------------------------------------------------------------- *)moduleJoption(A:S):Swithtypet=A.toption=structtypet=A.toptionletnullable=tryignore(A.of_json`Null);truewith_->falseletjtype=Joption(ifnotnullablethenA.jtypeelseJtuple[A.jtype])letto_json=function|None->`Null|Somev->ifnullablethen`List[A.to_jsonv]elseA.to_jsonvletof_json=function|`Null->None|`List[js]whennullable->Some(A.of_jsonjs)|js->Some(A.of_jsonjs)end(* -------------------------------------------------------------------------- *)(* --- Tuples --- *)(* -------------------------------------------------------------------------- *)moduleJpair(A:S)(B:S):Swithtypet=A.t*B.t=structtypet=A.t*B.tletjtype=Jtuple[A.jtype;B.jtype]letto_json(x,y)=`List[A.to_jsonx;B.to_jsony]letof_json=function|`List[ja;jb]->A.of_jsonja,B.of_jsonjb|js->failure~json:js"Expected list with 2 elements"endmoduleJtriple(A:S)(B:S)(C:S):Swithtypet=A.t*B.t*C.t=structtypet=A.t*B.t*C.tletjtype=Jtuple[A.jtype;B.jtype;C.jtype]letto_json(x,y,z)=`List[A.to_jsonx;B.to_jsony;C.to_jsonz]letof_json=function|`List[ja;jb;jc]->A.of_jsonja,B.of_jsonjb,C.of_jsonjc|js->failure~json:js"Expected list with 3 elements"end(* -------------------------------------------------------------------------- *)(* --- Lists --- *)(* -------------------------------------------------------------------------- *)moduleJlist(A:S):Swithtypet=A.tlist=structtypet=A.tlistletjtype=JarrayA.jtypeletto_jsonxs=`List(List.mapA.to_jsonxs)letof_jsonjs=List.mapA.of_json(Ju.to_listjs)end(* -------------------------------------------------------------------------- *)(* --- Arrays --- *)(* -------------------------------------------------------------------------- *)moduleJarray(A:S):Swithtypet=A.tarray=structtypet=A.tarrayletjtype=JarrayA.jtypeletto_jsonxs=`List(List.mapA.to_json(Array.to_listxs))letof_jsonjs=Array.of_list@@List.mapA.of_json(Ju.to_listjs)end(* -------------------------------------------------------------------------- *)(* --- Atomic Types --- *)(* -------------------------------------------------------------------------- *)moduleJunit:Swithtypet=unit=structtypet=unitletjtype=Jnullletof_json_js=()letto_json()=`NullendmoduleJany:Swithtypet=json=structtypet=jsonletjtype=Janyletof_jsonjs=jsletto_jsonjs=jsendmoduleJbool:Swithtypet=bool=structtypet=boolletjtype=Jbooleanletof_json=Ju.to_boolletto_jsonb=`BoolbendmoduleJint:Swithtypet=int=structtypet=intletjtype=Jnumberletof_json=Ju.to_intletto_jsonn=`IntnendmoduleJfloat:Swithtypet=float=structtypet=floatletjtype=Jnumberletof_json=Ju.to_numberletto_jsonv=`FloatvendmoduleJstring:Swithtypet=string=structtypet=stringletjtype=Jstringletof_json=Ju.to_stringletto_jsons=`StringsendmoduleJalpha:Swithtypet=string=structtypet=stringletjtype=Jalphaletof_json=Ju.to_stringletto_jsons=`StringsendmoduleJfile:Swithtypet=Filepath.Normalized.t=structtypet=Filepath.Normalized.tletjtype=Jstringletof_jsonjs=Ju.to_stringjs|>Filepath.Normalized.of_stringletto_json(file:t)=`String(file:>string)end(* -------------------------------------------------------------------------- *)(* --- Text Datatypes --- *)(* -------------------------------------------------------------------------- *)moduleJmarkdown:Swithtypet=Markdown.text=structtypet=Markdown.textletjtype=letdescr=Markdown.plain"Markdown (inlined) text."indeclare~package~name:"markdown"~descrJstringletof_jsonjs=Markdown.plain(Ju.to_stringjs)letto_jsontxt=`String(Pretty_utils.to_stringMarkdown.pp_texttxt)endmoduleJtext=structincludeJanyletjtype=letdescr=Markdown.plain"Rich text format uses `[tag; …text ]` to apply \
the tag `tag` to the enclosed text. \
Empty tag `\"\"` can also used to simply group text together."inletjdef=Junion[Jnull;Jstring;JarrayJself]indeclare~package~name:"text"~descrjdefendletjpretty=Jbuffer.to_jsonletjtexts=`Strings(* -------------------------------------------------------------------------- *)(* --- Functional API --- *)(* -------------------------------------------------------------------------- *)type'adata=(moduleSwithtypet='a)letdata_of_json(typea)(d:adata)(js:json):a=letmoduleM:Swithtypet=a=(vald)inM.of_jsonjsletdata_to_json(typea)(d:adata)(v:a):json=letmoduleM:Swithtypet=a=(vald)inM.to_jsonvletjunit:unitdata=(moduleJunit)letjany:jsondata=(moduleJany)letjbool:booldata=(moduleJbool)letjint:intdata=(moduleJint)letjfloat:floatdata=(moduleJfloat)letjstring:stringdata=(moduleJstring)letjalpha:stringdata=(moduleJalpha)letjkey~kind=letmoduleJkeyKind=structincludeJstringletjtype=Jkeykindendin(moduleJkeyKind:Swithtypet=string)letjindex~kind=letmoduleJindexKind=structincludeJintletjtype=Jindexkindendin(moduleJindexKind:Swithtypet=int)letjoption(typea)(d:adata):aoptiondata=letmoduleA=Joption(vald)in(moduleA:Swithtypet=aoption)letjlist(typea)(d:adata):alistdata=letmoduleA=Jlist(vald)in(moduleA:Swithtypet=alist)letjalist(typea)(d:adata):alistdata=letmoduleA=Jlist(vald)in(moduleA:Swithtypet=alist)letjarray(typea)(d:adata):aarraydata=letmoduleA=Jarray(vald)in(moduleA:Swithtypet=aarray)(* -------------------------------------------------------------------------- *)(* --- Records --- *)(* -------------------------------------------------------------------------- *)moduleFmap=Map.Make(String)moduleRecord=structtype'arecord=jsonFmap.ttype('r,'a)field={member:'rrecord->bool;getter:'rrecord->'a;setter:'rrecord->'a->'rrecord;}type'asignature={mutablefields:fieldInfolist;mutabledefault:'arecord;mutablepublished:bool;}moduletypeS=sigtyperincludeSwithtypet=rrecordvaldefault:tvalhas:(r,'a)field->t->boolvalget:(r,'a)field->t->'avalset:(r,'a)field->'a->t->tendletsignature()={published=false;fields=[];default=Fmap.empty;}letnot_publisheds=ifs.publishedthenraise(Invalid_argument"Server.Data.Record: already published")letcheck_field_namesname=beginifList.exists(funf->f.Package.fd_name=name)s.fieldsthen(letmsg=Printf.sprintf"Server.Data.Record: duplicate field %S"nameinraise(Invalid_argumentmsg));ifnot(Str.string_match(Str.regexp"[a-zA-Z0-9 _-]+$")name0)then(letmsg=Printf.sprintf"Server.Data.Record: invalid characters for field %S"nameinraise(Invalid_argumentmsg));endletfield(typear)(s:rsignature)~name~descr?default(d:adata):(r,a)field=not_publisheds;check_field_namesname;letmoduleD=(vald)inbeginmatchdefaultwith|None->()|Somev->s.default<-Fmap.addname(D.to_jsonv)s.defaultend;letfield=Package.{fd_name=name;fd_type=D.jtype;fd_descr=descr;}ins.fields<-field::s.fields;letmemberr=Fmap.memnamerinletgetterr=D.of_json(Fmap.findnamer)inletsetterrv=Fmap.addname(D.to_jsonv)rin{member;getter;setter}letoption(typear)(s:rsignature)~name~descr(d:adata):(r,aoption)field=not_publisheds;check_field_namesname;letmoduleD=(vald)inletfield=Package.{fd_name=name;fd_type=JoptionD.jtype;fd_descr=descr;}ins.fields<-field::s.fields;letmemberr=Fmap.memnamerinletgetterr=trySome(D.of_json(Fmap.findnamer))withNot_found->Noneinletsetterr=function|None->Fmap.removenamer|Somev->Fmap.addname(D.to_jsonv)rin{member;getter;setter}letpublish(typer)~package~name?(descr=[])(s:rsignature)=not_publisheds;letmoduleM=structtypenonrecr=rtypet=rrecordletjtype=letfields=List.revs.fieldsinletid=Package.declare_id~package~name~descr(D_recordfields)inderived~package~id(Jrecord(List.mapPackage.fieldfields))letdefault=s.defaultlethasfdr=fd.memberrletgetfdr=fd.getterrletsetfdvr=fd.setterrvletof_jsonjs=List.fold_left(funr(fd,js)->Fmap.addfdjsr)default(Ju.to_assocjs)letto_jsonr:json=`Assoc(Fmap.fold(funfdjsfds->(fd,js)::fds)r[])endinbegins.default<-Fmap.empty;s.fields<-[];s.published<-true;(moduleM:Swithtyper=r)endend(* -------------------------------------------------------------------------- *)(* --- Enums --- *)(* -------------------------------------------------------------------------- *)moduleTag=structtypet=Package.tagInfoletjtype=declare~package~name:"tag"~descr:(Markdown.plain"Enum Tag Description")(Jrecord["name",Jalpha;"label",Jmarkdown.jtype;"descr",Jmarkdown.jtype;])letto_jsontg=`AssocPackage.["name",`Stringtg.tg_name;"label",Jmarkdown.to_jsontg.tg_label;"descr",Jmarkdown.to_jsontg.tg_descr;]letof_jsonjs=Package.{tg_name=Ju.member"name"js|>Ju.to_string;tg_label=Ju.member"label"js|>Jmarkdown.of_json;tg_descr=Ju.member"descr"js|>Jmarkdown.of_json;}endmoduleEnum=structtype'adictionary={values:(string,'aoption)Hashtbl.t;vindex:('a,string)Hashtbl.t;mutablepublished:(package*string)option;mutabletags:tagInfolist;mutableprefix:tagInfolist;mutablelookup:('a->string)option;}type'atag=stringtype'aprefix='adictionary*stringlettag_nametg=tglettag_labela=function|None->Markdown.plain(String.(capitalize_ascii(lowercase_asciia)))|Somelbl->lblletdictionary()={published=None;values=Hashtbl.create0;vindex=Hashtbl.create0;prefix=[];tags=[];lookup=None;}lettag~name?label~descr?value(d:'adictionary):'atag=ifHashtbl.memd.valuesnamethen(letmsg=Printf.sprintf"Server.Data.Enum: duplicate tag %S"nameinraise(Invalid_argumentmsg));lettg=Package.{tg_name=name;tg_label=tag_labelnamelabel;tg_descr=descr;}ind.tags<-tg::d.tags;Hashtbl.addd.valuesnamevalue;beginmatchvaluewith|None->()|Somev->Hashtbl.addd.vindexvnameend;nameletadd~name?label~descr?value(d:'adictionary):unit=ignore(tag~name?label~descr?valued)letfind(d:'adictionary)(tg:'atag):'a=matchHashtbl.findd.valuestgwith|Somev->v|None->raiseNot_foundletfind_tag(d:'adictionary)name:'atag=ifHashtbl.memd.valuesnamethennameelseraiseNot_foundletlookup_indexlookupvindexv=matchlookupwith|None->Hashtbl.findvindexv|Somef->tryfvwithNot_found->Hashtbl.findvindexvletlookup(d:'adictionary)(v:'a):'atag=lookup_indexd.lookupd.vindexvletset_lookup(d:'adictionary)(tag:'a->'atag)=d.lookup<-Sometagletinstance_name=Printf.sprintf"%s_%s"letinstance(_,prefix)=instance_nameprefixletprefix~name?(var="*")?label~descr(d:'adictionary)=lettg=Package.{tg_name=instance_namenamevar;tg_label=tag_label(name^".")label;tg_descr=descr;}ind.prefix<-tg::d.prefix;d,nameletextends~name?label~descr?value((d,prefix):'aprefix):'atag=letname=tag~name:(instance_nameprefixname)?label~descr?valuedin(matchd.publishedwith|None->()|Some(package,name)->Package.update~package~name(D_enum(List.revd.tags)));nameletto_jsonnamelookupvindexv=`Stringbegintrylookup_indexlookupvindexvwithNot_found->failure"[%s] Value not found"nameendletof_jsonnamevaluesjs=lettag=Ju.to_stringjsinmatchHashtbl.findvaluestagwith|Somev->v|None->failure"[%s] No registered value for tag '%s"nametag|exceptionNot_found->failure"[%s] Not registered tag '%s"nametaglettagsd=List.revd.tagsletpublish(typea)~package~name~descr(d:adictionary)=(matchd.publishedwith|None->()|Some_->letmsg="Server.Data.Enums: already published"inraise(Invalid_argumentmsg));letmoduleM=structtypet=aletjtype=lettags=List.revd.tagsinlettagNames=List.map(fun{tg_name}->tg_name)tagsinletid=Package.declare_id~package~name~descr(D_enumtags)inderived~package~id(Jenum(id,tagNames))letof_json=of_jsonnamed.valuesletto_json=to_jsonnamed.lookupd.vindexendinbegind.published<-Some(package,name);(moduleM:Swithtypet=a)endend(* -------------------------------------------------------------------------- *)(* --- Index --- *)(* -------------------------------------------------------------------------- *)moduletypeInfo=sigvalpackage:packagevalname:stringvaldescr:Markdown.textend(** Simplified [Map.S] *)moduletypeMap=sigtype'attypekeyvalempty:'atvaladd:key->'a->'at->'atvalfind:key->'at->'avalremove:key->'at->'atendmoduletypeIndex=sigincludeStypetagvalget:t->tagvalfind:tag->tvalremove:t->unitvalclear:unit->unitendmoduleINDEXER(M:Map)(I:Info):sigtypeindexvalcreate:unit->indexvalclear:index->unitvalget:index->M.key->intvalfind:index->int->M.keyvalremove:index->M.key->unitvalto_json:index->M.key->jsonvalof_json:index->json->M.keyend=structtypeindex={mutablekid:int;mutableindex:intM.t;lookup:(int,M.key)Hashtbl.t;}letcreate()={kid=0;index=M.empty;lookup=Hashtbl.create0;}letclearm=beginm.kid<-0;m.index<-M.empty;Hashtbl.clearm.lookup;endletgetma=tryM.findam.indexwithNot_found->letid=succm.kidinm.kid<-id;m.index<-M.addaidm.index;Hashtbl.addm.lookupida;idletremovema=tryletid=M.findam.indexinHashtbl.removem.lookupid;m.index<-M.removeam.index;withNot_found->()letfindmid=Hashtbl.findm.lookupidletto_jsonma=`Int(getma)letof_jsonmjs=letid=Ju.to_intjsintryfindmidwithNot_found->failure"[%s] No registered id #%d"I.nameidendmoduleStatic(M:Map)(I:Info):Indexwithtypet=M.keyandtypetag:=int=structmoduleINDEX=INDEXER(M)(I)letindex=INDEX.create()letclear()=INDEX.clearindexletget=INDEX.getindexletfind=INDEX.findindexletremove=INDEX.removeindexinclude(structtypet=M.keyletjtype=declare~package:I.package~name:I.name~descr:I.descr(JindexI.name)letof_json=INDEX.of_jsonindexletto_json=INDEX.to_jsonindexend)endmoduleIndex(M:Map)(I:Info):Indexwithtypet=M.keyandtypetag:=int=structmoduleINDEX=INDEXER(M)(I)moduleTYPE:Datatype.Swithtypet=INDEX.index=Datatype.Make(structtypet=INDEX.indexincludeDatatype.Undefinedletreprs=[INDEX.create()]letname="Server.Data.Index.Type."^I.nameletmem_project=Datatype.never_any_projectend)moduleSTATE=State_builder.Ref(TYPE)(structletname="Server.Data.Index.State."^I.nameletdependencies=[]letdefault=INDEX.createend)letindex()=STATE.get()letclear()=INDEX.clear(index())letremovea=INDEX.remove(index())aletgeta=INDEX.get(index())aletfindid=INDEX.find(index())idinclude(structtypet=M.keyletjtype=declare~package:I.package~name:I.name~descr:I.descr(JindexI.name)letof_jsonjs=INDEX.of_json(index())jsletto_jsonv=INDEX.to_json(index())vend)end(* -------------------------------------------------------------------------- *)(* --- Identified & Tagged Indexers --- *)(* -------------------------------------------------------------------------- *)moduletypeHASH=sigtypettypetagvalid:t->tagendmoduletypeTAG=sigtypetagvaljtype:string->jtypevalto_json:tag->Json.tvalof_json:Json.t->tagendmoduleHASHED(T:TAG)(A:HASHwithtypetag:=T.tag)(I:Info):Indexwithtypet=A.tandtypetag:=T.tag=structtypeindex=(T.tag,A.t)Hashtbl.tmoduleTYPE:Datatype.Swithtypet=index=Datatype.Make(structtypet=indexincludeDatatype.Undefinedletreprs=[Hashtbl.create0]letname="Server.Data.Identified.Type."^I.nameletmem_project=Datatype.never_any_projectend)moduleSTATE=State_builder.Ref(TYPE)(structletname="Server.Data.Identified.State."^I.nameletdependencies=[]letdefault()=Hashtbl.create0end)letlookup()=STATE.get()letclear()=Hashtbl.clear(lookup())letfindid=Hashtbl.find(lookup())idletgetx=lettag=A.idxinlethash=lookup()inifnot(Hashtbl.memhashtag)thenHashtbl.addhashtagx;tagletremovex=lettag=A.idxinlethash=lookup()inHashtbl.removehashtaginclude(structtypet=A.tletjtype=declare~package:I.package~descr:I.descr~name:I.name(T.jtypeI.name)letto_jsona=T.to_json(geta)letof_jsonjs=letk=T.of_jsonjsintryfindkwithNot_found->failure"[%s] Not registered tag (%a)"I.nameJson.ppjsend)endmoduletypeIdentifiedType=sigtypetvalid:t->intendmoduleIdentified(A:IdentifiedType)(I:Info):Indexwithtypet=A.tandtypetag:=int=HASHED(structincludeJinttypetag=intletjtypea=Jindexaend)(A)(I)moduletypeTaggedType=sigtypetvalid:t->stringendmoduleTagged(A:TaggedType)(I:Info):Indexwithtypet=A.tandtypetag:=string=HASHED(structincludeJstringtypetag=stringletjtypea=Jkeyaend)(A)(I)(* -------------------------------------------------------------------------- *)