/src/org/ooc/frontend/model/VersionBlock.java

http://github.com/nddrylliog/ooc · Java · 130 lines · 99 code · 25 blank · 6 comment · 5 complexity · d420d84761bbb95d927ce9bf47a81c4e MD5 · raw file

  1. package org.ooc.frontend.model;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.ooc.frontend.Target;
  6. import org.ooc.frontend.Visitor;
  7. import org.ooc.frontend.model.VersionNodes.VersionAnd;
  8. import org.ooc.frontend.model.VersionNodes.VersionName;
  9. import org.ooc.frontend.model.VersionNodes.VersionNegation;
  10. import org.ooc.frontend.model.VersionNodes.VersionNode;
  11. import org.ooc.frontend.model.VersionNodes.VersionNodeVisitor;
  12. import org.ooc.frontend.model.VersionNodes.VersionOr;
  13. import org.ooc.frontend.model.VersionNodes.VersionParen;
  14. import org.ooc.frontend.model.interfaces.MustBeResolved;
  15. import org.ooc.frontend.model.tokens.Token;
  16. import org.ooc.middle.OocCompilationError;
  17. import org.ooc.middle.hobgoblins.Resolver;
  18. import org.ubi.CompilationFailedError;
  19. public class VersionBlock extends Block implements MustBeResolved {
  20. protected static Map<String, String> map = new HashMap<String, String>();
  21. static {
  22. // Java's excuse for a Map literal
  23. map.put("windows", "__WIN32__) || defined(__WIN64__"); // FIXME: does that imply that we're not 64 ?
  24. map.put("linux", "__linux__");
  25. map.put("solaris", "__sun");
  26. map.put("unix", "__unix__");
  27. map.put("beos", "__BEOS__");
  28. map.put("haiku", "__HAIKU__");
  29. map.put("apple", "__APPLE__");
  30. map.put("gnuc", "__GNUC__");
  31. map.put("i386", "__i386__");
  32. map.put("x86", "__X86__");
  33. map.put("x86_64", "__x86_64__");
  34. map.put("ppc", "__ppc__");
  35. map.put("ppc64", "__ppc64__");
  36. map.put("64", "__x86_64__) || defined(__ppc64__");
  37. map.put("gc", "__OOC_USE_GC__");
  38. }
  39. private VersionNode version;
  40. /**
  41. * Default constructor
  42. * @param location
  43. * @param id The id of this version. One of "linux", "windows", etc.
  44. */
  45. public VersionBlock(VersionNode version, Token startToken) {
  46. super(startToken);
  47. this.version = version;
  48. }
  49. public VersionNode getVersion() {
  50. return version;
  51. }
  52. public boolean isResolved() {
  53. return false;
  54. }
  55. public Response resolve(final NodeList<Node> stack, Resolver res, boolean fatal) {
  56. try {
  57. version.accept(new VersionNodeVisitor() {
  58. public void visit(VersionOr versionOr) throws IOException {
  59. versionOr.acceptChildren(this);
  60. }
  61. public void visit(VersionAnd versionAnd) throws IOException {
  62. versionAnd.acceptChildren(this);
  63. }
  64. public void visit(VersionNegation versionNegation) throws IOException {
  65. versionNegation.acceptChildren(this);
  66. }
  67. public void visit(VersionName versionName) {
  68. if(versionName.solved) return;
  69. String match = map.get(versionName.name.toLowerCase());
  70. if(match != null) {
  71. versionName.name = match;
  72. versionName.solved = true;
  73. } else {
  74. System.out.println(new OocCompilationError(VersionBlock.this, stack,
  75. "Unknown version id: '" + versionName.name
  76. + "', compiling anyway (who knows?)").toString());
  77. }
  78. }
  79. public void visit(VersionParen versionParen) throws IOException {
  80. versionParen.acceptChildren(this);
  81. }
  82. });
  83. } catch (IOException e) {
  84. throw new CompilationFailedError(e);
  85. }
  86. return Response.OK;
  87. }
  88. @Override
  89. public void accept(Visitor visitor) throws IOException {
  90. visitor.visit(this);
  91. }
  92. @Override
  93. public boolean equals(Object o) {
  94. if(!(o instanceof VersionBlock)) return super.equals(o);
  95. VersionBlock vb = (VersionBlock) o;
  96. return this.version.toString().equals(vb.version.toString());
  97. }
  98. public boolean isSatisfied(Target target) {
  99. return version.isSatisfied(target);
  100. }
  101. @Override
  102. public String toString() {
  103. return version.toString();
  104. }
  105. }