BsIncludeHandler.cpp 2.0 KB

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