/src/org/ooc/backend/cdirty/CoverDeclWriter.java

http://github.com/nddrylliog/ooc · Java · 111 lines · 82 code · 24 blank · 5 comment · 31 complexity · 758e03b1b993b4b275ffeaa7933eeabb MD5 · raw file

  1. package org.ooc.backend.cdirty;
  2. import java.io.IOException;
  3. import org.ooc.frontend.model.CoverDecl;
  4. import org.ooc.frontend.model.FuncType;
  5. import org.ooc.frontend.model.FunctionDecl;
  6. import org.ooc.frontend.model.Type;
  7. import org.ooc.frontend.model.VariableDecl;
  8. public class CoverDeclWriter {
  9. public static void write(CoverDecl cover, CGenerator cgen) throws IOException {
  10. cgen.current = cgen.hw;
  11. if(cover.getVersion() != null) {
  12. VersionBlockWriter.writeVersionBlockStart(cover.getVersion(), cgen);
  13. }
  14. // addons only add functions to an already imported cover, so
  15. // we don't need to struct it again, it would confuse the C compiler
  16. if(!cover.isAddon() && !cover.isExtern() && cover.getFromType() == null) {
  17. cgen.current.app("struct _").app(cover.getUnderName()).app(' ').openBlock();
  18. for(VariableDecl decl: cover.getVariables()) {
  19. cgen.current.nl();
  20. if(VariableDeclWriter.write(decl, cgen)) {
  21. cgen.current.app(';');
  22. }
  23. }
  24. cgen.current.closeBlock().app(';').nl();
  25. }
  26. if(cover.getVersion() != null) {
  27. VersionBlockWriter.writeVersionBlockEnd(cgen);
  28. }
  29. /* and now the functions */
  30. cgen.current = cgen.cw;
  31. //cgen.current.app("/* cover " + cover.getName() + " has version " +
  32. // (cover.getVersion() != null ? cover.getVersion().getVersion().toString() : "null") + " */");
  33. if(cover.getVersion() != null) {
  34. VersionBlockWriter.writeVersionBlockStart(cover.getVersion(), cgen);
  35. }
  36. for(FunctionDecl decl: cover.getFunctions()) {
  37. if(decl.getName().equals("class") && decl.getSuffix().length() == 0) {
  38. if(!cover.isAddon()) writeClassFunction(cover, cgen);
  39. } else {
  40. decl.accept(cgen);
  41. cgen.current.nl();
  42. }
  43. }
  44. if(cover.getVersion() != null) {
  45. VersionBlockWriter.writeVersionBlockEnd(cgen);
  46. }
  47. }
  48. public static void writeClassFunction(CoverDecl cover, CGenerator cgen) throws IOException {
  49. cgen.current = cgen.fw;
  50. cgen.current.nl().app("lang_types__Class *"). app(cover.getUnderName()). app("_class();");
  51. cgen.current = cgen.cw;
  52. cgen.current.nl().
  53. app("lang_types__Class *"). app(cover.getUnderName()). app("_class() {"). tab(). nl().
  54. app("static lang_types__Class _class = {"). tab(). nl().
  55. app(".size = sizeof("). app(cover.getUnderName()). app("),"). nl().
  56. app(".instanceSize = sizeof("). app(cover.getUnderName()). app("),"). nl().
  57. app(".name = \""). app(cover.getName()). app("\"").
  58. untab(). nl(). app("};").
  59. nl(). app("return &_class;").
  60. untab(). nl(). app("}").
  61. nl();
  62. }
  63. public static void writeTypedef(CoverDecl cover, CGenerator cgen) throws IOException {
  64. if(cover.getVersion() != null) {
  65. VersionBlockWriter.writeVersionBlockStart(cover.getVersion(), cgen);
  66. }
  67. if(!cover.isAddon() && !cover.isExtern()) {
  68. Type fromType = cover.getFromType();
  69. if(fromType == null) {
  70. cgen.current.nl().app("typedef struct _").app(cover.getUnderName())
  71. .app(' ').app(cover.getUnderName()).app(';');
  72. } else {
  73. cgen.current.nl().app("typedef ");
  74. if(fromType instanceof FuncType) {
  75. TypeWriter.writeFuncPointer(((FuncType) fromType).getDecl(), cover.getUnderName(), cgen);
  76. } else {
  77. TypeWriter.writeSpaced(fromType.getGroundType(), cgen, true);
  78. cgen.current.app(cover.getUnderName());
  79. }
  80. cgen.current.app(';');
  81. }
  82. }
  83. if(cover.getVersion() != null) {
  84. VersionBlockWriter.writeVersionBlockEnd(cgen);
  85. }
  86. }
  87. }