123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657(**************************************************************************)(* *)(* Copyright 2012-2018 OCamlPro *)(* Copyright 2012 INRIA *)(* *)(* All rights reserved. This file is distributed under the terms of the *)(* GNU Lesser General Public License version 2.1, with the special *)(* exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)includeOpamStd.AbstractStringletunset=of_string"#unset#"letis_externals=OpamStd.String.starts_with~prefix:"."s||OpamStd.String.contains~sub:Filename.dir_sepsletexternal_dirname="_opam"letchecks=ifString.compares""=0&&letre=Re.(compile@@seq[bol;opt@@seq[wordc;char':';set"/\\"];rep@@diffany@@set"<>!`$():";eol])in(tryignore@@Re.execres;truewithNot_found->false)thenfailwith(Printf.sprintf"Invalid character in switch name %S"s);sletof_strings=check@@ifis_externalsthenOpamFilename.Dir.(to_string(of_strings))elsesletof_dirnamed=lets=OpamFilename.Dir.to_stringdincheck@@tryletswdir=Unix.readlink(Filename.concatsexternal_dirname)inletswdir=ifFilename.is_relativeswdirthenFilename.concatsswdirelseswdirinletr=OpamSystem.real_pathswdirinifFilename.basenamer=external_dirnamethenFilename.dirnamerelseswithUnix.Unix_error_->sletget_rootroots=ifis_externalsthenOpamFilename.Dir.of_string(Filename.concatsexternal_dirname)elseOpamFilename.Op.(root/s)