Reader.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "Reader.h"
  2. #include "Text.h"
  3. using namespace Framework;
  4. //! \param buffer der Buffer der gelesen werden soll
  5. //! \param length Die länge des buffers
  6. //! \param deleteBuffer true, wenn der buffer automatisch mit delete[] gelöscht werden soll
  7. ByteArrayReader::ByteArrayReader(const char* buffer, int length, bool deleteBuffer)
  8. : ReferenceCounter(),
  9. length(length),
  10. buffer(buffer),
  11. deleteBuffer(deleteBuffer),
  12. position(0)
  13. {}
  14. ByteArrayReader::~ByteArrayReader()
  15. {
  16. if (deleteBuffer)
  17. delete[] buffer;
  18. }
  19. //! Ließt aus der Datei
  20. //! \param bytes Ein Array, der mit Bytes aus der Resource gefüllt werden soll
  21. //! \param len Wie viele Bytes aus der Resource gelesen werden sollen
  22. void ByteArrayReader::lese(char* bytes, int len)
  23. {
  24. if (position < length)
  25. memcpy(bytes, buffer + position, min(len, length - position));
  26. position = min(position + len, length);
  27. }
  28. //! Ließt die nächste zeile der Resource ein
  29. //! \return Die gelesene Zeile als Text mit zeilenumbruch
  30. Text* ByteArrayReader::leseZeile()
  31. {
  32. if (position >= length)
  33. return 0;
  34. int start = position;
  35. for (; buffer[position] != '\n' && position < length; position++);
  36. Text* ret = new Text("");
  37. ret->fillText('\0', position - start + 1);
  38. lese((char*)ret->getText(), position - start + 1);
  39. return ret;
  40. }
  41. //! Prüft, ob die Resource vollständig gelesen wurde
  42. //! return 1, wenn die Resource vollständig gelesen wurde. 0, sonst
  43. bool ByteArrayReader::istEnde() const
  44. {
  45. return position >= length;
  46. }
  47. //! Setzt die Position des Bytes, das als nächstes gelesen werden soll
  48. //! \param pos Der Index des Bytes
  49. //! \param ende 1, wenn der Index vom ende der Resource zählt. 0, wenn der Index vom Beginn der Resource zählt
  50. void ByteArrayReader::setLPosition(__int64 pos, bool ende)
  51. {
  52. position = ende ? max(length - (int)pos, 0) : min((int)pos, length);
  53. }
  54. //! Gibt den Index des Bytes aus der Resource zurück, welches als nächstes gelesen werden würde
  55. //! return -1, falls ein Fehler aufgetreten ist. Sonst die Position des Lesezeigers
  56. __int64 ByteArrayReader::getLPosition() const
  57. {
  58. return position;
  59. }
  60. //! Gibt die Anzahl der zu lesenden Bytes zurück
  61. __int64 ByteArrayReader::getSize() const
  62. {
  63. return length;
  64. }