BsIncludeHandler.cpp 2.0 KB

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