1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889(**************************************************************************)(* *)(* This file is part of Frama-C. *)(* *)(* Copyright (C) 2007-2025 *)(* 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). *)(* *)(**************************************************************************)letrecgcdab=ifa=0thenabsbelseifb=0thenabsaelsegcdb(amodb)let(%.)=gcd(* -------------------------------------------------------------------------- *)(* --- Range Maps --- *)(* -------------------------------------------------------------------------- *)type'arange={offset:int;length:int;data:'a;}letpp_rangefmtr=Format.fprintffmt"%04d..%04d"r.offset(r.offset+r.length-1)letpp_offsetfmtr=Format.fprintffmt"%04d:%04d"r.offsetr.lengthtype'at=Rof'arangelist(* sorted, no-overlap *)letempty=R[]letsingletonr=ifnot(0<=r.offset&&0<r.length)thenraise(Invalid_argument"Region.Ranges.singleton");R[r]letrange?(offset=0)?(length=1)data=singleton{offset;length;data}letrecfind(k:int)=function|[]->raiseNot_found|({offset;length}asr)::rs->ifoffset<=k&&k<offset+lengththenrelsefindkrsletfindk(Rrs)=findkrsletrecmergefrarb=matchra,rbwith|[],rs|rs,[]->rs|a::wa,b::wb->leta'=a.offset+a.lengthinletb'=b.offset+b.lengthinifa'<=b.offsetthena::mergefwarbelseifb'<=a.offsetthenb::mergefrawbelseletoffset=mina.offsetb.offsetinletlength=maxa'b'-offsetinletdata=fabinletr={offset;length;data}inifa'<b'thenmergefwa(r::wb)elseifb'<a'thenmergef(r::wa)wbelser::mergefwawbletmergef(Rx)(Ry)=R(mergefxy)letiterif(Rxs)=List.iterfxsletfoldifw(Rxs)=List.fold_leftfwxsletiterf(Rxs)=List.iter(funr->fr.data)xsletfoldfw(Rxs)=List.fold_left(funwr->fwr.data)wxsletmapif(Rxs)=R(List.mapfxs)letmapf(Rxs)=R(List.map(funr->{rwithdata=fr.data})xs)(* -------------------------------------------------------------------------- *)