Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file base64.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207openCore_kernelmoduletypeT=sigvalencode:string->stringvaldecode:string->string*[`Unconsumed_dataofstring]optionvaldecode_exn:string->stringendmoduleMake(D:sigvalchar62:charvalchar63:charvalpad_char:charvalpad_when_encoding:boolvalignore_char:char->boolend)=structletencode_chari=if0<=i&&i<=25thenChar.of_int_exn(Char.to_int'A'+i)elseif26<=i&&i<=51thenChar.of_int_exn(Char.to_int'a'+i-26)elseif52<=i&&i<=61thenChar.of_int_exn(Char.to_int'0'+i-52)elseifi=62thenD.char62elseifi=63thenD.char63elsefailwithf"Impossible Base64 encoder bug: not representable as a base64 character: %d"i();;typebase64_char=|Dataofint|Skip|Otherletdecode_charc=if'A'<=c&&c<='Z'thenData(Char.to_intc-Char.to_int'A')elseif'a'<=c&&c<='z'thenData(Char.to_intc-Char.to_int'a'+26)elseif'0'<=c&&c<='9'thenData(Char.to_intc-Char.to_int'0'+52)elseifc=D.char62thenData62elseifc=D.char63thenData63elseifD.ignore_charcthenSkipelseOther;;letencodesource=letdest=Bytes.create((String.lengthsource+2)/3*4)inletsource_geti=ifi<String.lengthsourcethensource.[i]|>Char.to_intelse0inletrecloop~i~j=ifi<String.lengthsourcethen(leta=source_get(i+0)inletb=source_get(i+1)inletc=source_get(i+2)inBytes.setdest(j+0)Int.(shift_righta2|>bit_and0x3f|>encode_char);Bytes.setdest(j+1)Int.(bit_or(shift_lefta4)(shift_rightb4)|>bit_and0x3f|>encode_char);Bytes.setdest(j+2)Int.(bit_or(shift_leftb2)(shift_rightc6)|>bit_and0x3f|>encode_char);Bytes.setdest(j+3)Int.(c|>bit_and0x3f|>encode_char);loop~i:(i+3)~j:(j+4))else(matchString.lengthsource%3,D.pad_when_encodingwith|0,_->Bytes.unsafe_to_string~no_mutation_while_string_reachable:dest|rest,false->(* Remove extra bytes *)Bytes.To_string.subdest~pos:0~len:(j-3+rest)|1,true->(* Set padding *)Bytes.setdest(j-2)D.pad_char;Bytes.setdest(j-1)D.pad_char;Bytes.unsafe_to_string~no_mutation_while_string_reachable:dest|2,true->(* Set padding *)Bytes.setdest(j-1)D.pad_char;Bytes.unsafe_to_string~no_mutation_while_string_reachable:dest|_,_->failwith"Impossible")inloop~i:0~j:0;;typeblock=|No_chars|Two_charsof{a:int;b:int;i:int}|Three_charsof{a:int;b:int;c:int;i:int}|Four_charsof{a:int;b:int;c:int;d:int;i:int}letread_base64_blocksourcei=letrecread_chari=ifi>=String.lengthsourcethenNoneelse(matchsource.[i]|>decode_charwith|Datab->Some(b,i+1)|Skip->read_char(i+1)|Other->None)inmatchread_chariwith|None->No_chars|Some(a,i)->(matchread_chariwith|None->No_chars|Some(b,i)->(matchread_chariwith|None->Two_chars{a;b;i}|Some(c,i)->(matchread_chariwith|None->Three_chars{a;b;c;i}|Some(d,i)->Four_chars{a;b;c;d;i})));;letdecodesource=(* We need 3 bytes for every 4 bytes of [source]. We round up to handle the
possibility of no padding *)letdest=Bytes.create((String.lengthsource+2)/4*3)inletset~a~b?(c=0)?(d=0)j=Bytes.setdest(j+0)Int.(bit_or(shift_lefta2)(shift_rightb4)|>bit_and0xff|>Char.of_int_exn);Bytes.setdest(j+1)Int.(bit_or(shift_leftb4)(shift_rightc2)|>bit_and0xff|>Char.of_int_exn);Bytes.setdest(j+2)Int.(bit_or(shift_leftc6)d|>bit_and0xff|>Char.of_int_exn)inletfinishij=letresult=Bytes.To_string.subdest~pos:0~len:jinletrecstopi=ifi<String.lengthsourcethen(letc=source.[i]inifD.ignore_charc||c=D.pad_charthenstop(i+1)elseSome(`Unconsumed_data(String.subsource~pos:i~len:(String.lengthsource-i))))elseNoneinletunconsumed_data=stopiinresult,unconsumed_datainletrecloopij=matchread_base64_blocksourceiwith|No_chars->finishij|Two_chars{a;b;i}->setj~a~b;finishi(j+1)|Three_chars{a;b;c;i}->setj~a~b~c;finishi(j+2)|Four_chars{a;b;c;d;i}->setj~a~b~c~d;loopi(j+3)inloop00;;letdecode_exnsource=matchdecodesourcewith|result,None->result|decoded,Some(`Unconsumed_dataunconsumed_data)->raise_s[%message"[decode_exn] failed with warnings"(decoded:string)(unconsumed_data:string)];;endincludeMake(structletchar62='+'letchar63='/'letpad_char='='letpad_when_encoding=trueletignore_char=Char.is_whitespaceend)moduleWebsafe=Make(structletchar62='-'letchar63='_'letpad_char='='letpad_when_encoding=falseletignore_char_=falseend)