BsIncludeHandler.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "BsSLPrerequisites.h"
  2. #include "BsShaderManager.h"
  3. #include "BsShaderInclude.h"
  4. extern "C" {
  5. #include "BsIncludeHandler.h"
  6. #include "BsMMAlloc.h"
  7. }
  8. using namespace BansheeEngine;
  9. char* includePush(ParseState* state, const char* filename, int line, int column, int* size)
  10. {
  11. int filenameQuotesLen = (int)strlen(filename);
  12. char* filenameNoQuote = (char*)mmalloc(state->memContext, filenameQuotesLen - 1);
  13. memcpy(filenameNoQuote, filename + 1, filenameQuotesLen - 2);
  14. filenameNoQuote[filenameQuotesLen - 2] = '\0';
  15. HShaderInclude include = ShaderManager::instance().findInclude(filenameNoQuote);
  16. if (include != nullptr)
  17. include.blockUntilLoaded();
  18. int filenameLen = (int)strlen(filenameNoQuote);
  19. if (include.isLoaded())
  20. {
  21. String includeSource = include->getString();
  22. *size = (int)includeSource.size() + 2;
  23. char* output = (char*)mmalloc(state->memContext, *size);
  24. memcpy(output, includeSource.data(), *size - 2);
  25. output[*size - 2] = 0;
  26. output[*size - 1] = 0;
  27. int linkSize = sizeof(IncludeLink) + sizeof(IncludeData) + filenameLen + 1;
  28. char* linkData = (char*)mmalloc(state->memContext, linkSize);
  29. IncludeLink* newLink = (IncludeLink*)linkData;
  30. linkData += sizeof(IncludeLink);
  31. IncludeData* includeData = (IncludeData*)linkData;
  32. linkData += sizeof(IncludeData);
  33. memcpy(linkData, filenameNoQuote, filenameLen);
  34. linkData[filenameLen] = '\0';
  35. includeData->filename = linkData;
  36. includeData->buffer = output;
  37. newLink->data = includeData;
  38. newLink->next = state->includeStack;
  39. state->includeStack = newLink;
  40. mmfree(filenameNoQuote);
  41. return output;
  42. }
  43. const char* errorLabel = "Error opening include file :";
  44. int labelLen = (int)strlen(errorLabel);
  45. int messageLen = filenameLen + labelLen + 1;
  46. char* message = (char*)mmalloc(state->memContext, messageLen);
  47. memcpy(message, filename, filenameLen);
  48. memcpy(message + filenameLen, errorLabel, labelLen);
  49. message[messageLen - 1] = '\0';
  50. state->hasError = 1;
  51. state->errorLine = line;
  52. state->errorColumn = column;
  53. state->errorMessage = message;
  54. mmfree(filenameNoQuote);
  55. return nullptr;
  56. }
  57. void includePop(ParseState* state)
  58. {
  59. IncludeLink* current = state->includeStack;
  60. if (!current)
  61. return;
  62. state->includeStack = current->next;
  63. current->next = state->includes;
  64. state->includes = current;
  65. mmfree(current->data->buffer);
  66. current->data->buffer = nullptr;
  67. }