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();
}
}