123456789101112131415161718192021222324252627282930313233343536373839404142434445openMetadataBasemoduleR=Readerletparsef:metadata=(* Start of image *)ifR.readf2<>"\xff\xd8"thenraiseInvalid;letmetadata=ref[]inletaddlv=metadata:=(l,v)::!metadatainletrecread_maker()=ifR.bytef<>0xffthenraiseInvalid;letkind=R.bytefinletlen=R.int16_befin(* Printf.printf "Marker: %x (len: %d)\n%!" kind len; *)matchkindwith(* | 0xe0 -> *)(* Printf.printf "JFIF\n%!"; *)(* if R.read f 5 <> "JFIF\x00" then raise Invalid; *)(* let _ (\* major version *\) = R.byte f in *)(* let _ (\* minor version *\) = R.byte f in *)(* | 0xe1 -> *)(* Printf.printf "EXIF\n%!"; *)(* if R.read f 6 <> "Exif\x00\x00" then raise Invalid; *)(* let endianness = R.read f 2 in *)(* let endianness = if endianness = "MM" then Big_endian else if endianness = "II" then Little_endian else raise Invalid in *)(* let int16 = R.int16 endianness in *)(* if int16 f <> 0x2a then raise Invalid; *)(* let skip = int16 f in *)(* let _ = R.read f (skip - 8) in *)(* let entries = int16 f in *)|0xc0|0xc2->let_(* precision *)=R.bytefinletheight=R.int16_befinletwidth=R.int16_befinadd"width"(string_of_intwidth);add"height"(string_of_intheight);(* Ignore after that. *)()|_->let_=R.readf(len-2)inread_maker()inread_maker();List.rev!metadataletparse_file=R.with_fileparse