package jetbrains.mps.build.util; /*Generated by MPS */ import java.util.Set; import java.util.HashSet; import java.util.Arrays; import java.util.concurrent.ConcurrentMap; import org.jetbrains.annotations.NotNull; import jetbrains.mps.generator.template.TemplateQueryContext; import org.jetbrains.mps.openapi.model.SNode; public class PathProvider { private static Set<String> reservedNames = new HashSet<String>(Arrays.asList("con", "prn", "aux", "clock$", "nul", "com0", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt0", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9")); private final ConcurrentMap<String, String> usedNames; public PathProvider(@NotNull TemplateQueryContext genContext, SNode project) { this.usedNames = GenerationUtil.<String,String>getSessionMap(project, genContext, "pathProvider"); } public String createTempPath(String name, String... categories) { StringBuilder sb = new StringBuilder("${build.tmp}/"); for (String s : categories) { if ((s == null || s.length() == 0)) { continue; } if (appendFileName(sb, s)) { sb.append('/'); } } if (!(appendFileName(sb, name))) { sb.append("noname"); } final int before = sb.length(); String result = sb.toString(); int i = 1; while (usedNames.putIfAbsent(result, result) != null) { sb.setLength(before); sb.append(i++); result = sb.toString(); } return result; } /** * * @return @code {true} if buffer was augmented */ private static boolean appendFileName(StringBuilder sb, String name) { int before = sb.length(); for (int i = 0; i < name.length(); i++) { char c = name.charAt(i); if (c < 0x20 || c == 0x7f) { continue; } switch (c) { case '/': sb.append("_sl_"); break; case '\\': sb.append("_bs_"); break; case '>': sb.append("_gt_"); break; case '<': sb.append("_lt_"); break; case '"': sb.append("_quot_"); break; case '|': sb.append("_bar_"); break; case ':': sb.append("_colon_"); break; case '*': sb.append("_star_"); break; case '?': sb.append("_qmark_"); break; case '%': sb.append("_perc_"); break; case '$': sb.append("_dl_"); break; case '{': sb.append("_lbrace_"); break; case '}': sb.append("_rbrace_"); break; default: sb.append(c); } } String escaped = sb.substring(before); if (reservedNames.contains(escaped) || escaped.startsWith("$")) { sb.insert(before, "_"); } return before < sb.length(); } }