TokenStream.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include "tokenizer/TokenStream.h"
  5. TokenStream* newTokenStream() {
  6. TokenStream* tokenStream = malloc(sizeof (TokenStream));
  7. tokenStream->readIndex = 0;
  8. tokenStream->index = 0;
  9. tokenStream->length = 1024;
  10. tokenStream->buffer = malloc(sizeof (char) * tokenStream->length);
  11. return tokenStream;
  12. }
  13. void deleteTokenStream(TokenStream** tokenStream) {
  14. if(tokenStream == NULL || (*tokenStream) == NULL) {
  15. return;
  16. }
  17. free((*tokenStream)->buffer);
  18. free(*tokenStream);
  19. *tokenStream = NULL;
  20. }
  21. bool hasToken(TokenStream* tokenStream) {
  22. return tokenStream->readIndex < tokenStream->index;
  23. }
  24. static size_t tokenstream_concat(char* dst, const char* src, size_t bufferLength) {
  25. size_t length = strlen(src);
  26. strncat(dst, src, bufferLength);
  27. if(length > bufferLength) {
  28. return 0;
  29. }
  30. return bufferLength - length;
  31. }
  32. void nextTokenString(TokenStream* tokenStream, char* buffer, size_t bufferLength) {
  33. if(bufferLength == 0) {
  34. return;
  35. }
  36. buffer[0] = '\0';
  37. bufferLength--;
  38. bufferLength = tokenstream_concat(buffer, "(", bufferLength);
  39. // line
  40. char lineBuffer[32];
  41. unsigned int line = nextLine(tokenStream);
  42. snprintf(lineBuffer, 32, "%u, ", line);
  43. bufferLength = tokenstream_concat(buffer, lineBuffer, bufferLength);
  44. // tokentype
  45. Token token = nextToken(tokenStream);
  46. bufferLength = tokenstream_concat(buffer, getTokenEnumName(token), bufferLength);
  47. if(token == STRING || token == LITERAL || token == LABEL) {
  48. bufferLength = tokenstream_concat(buffer, ", \"", bufferLength);
  49. bufferLength = tokenstream_concat(buffer, nextString(tokenStream), bufferLength);
  50. bufferLength = tokenstream_concat(buffer, "\"", bufferLength);
  51. }
  52. if(token == NUMBER) {
  53. char doubleBuffer[32];
  54. double d = nextDouble(tokenStream);
  55. snprintf(doubleBuffer, 32, (d == (long) d) ? ", %lg.0" : ", %lg", d);
  56. bufferLength = tokenstream_concat(buffer, doubleBuffer, bufferLength);
  57. }
  58. bufferLength = tokenstream_concat(buffer, ")", bufferLength);
  59. }
  60. void tokenstream_read(TokenStream* tokenStream, void* data, size_t length) {
  61. memcpy(data, tokenStream->buffer + tokenStream->readIndex, length);
  62. tokenStream->readIndex += length;
  63. }
  64. Token nextToken(TokenStream* tokenStream) {
  65. Token token = EOF_TOKEN;
  66. tokenstream_read(tokenStream, &token, sizeof (Token));
  67. return token;
  68. }
  69. unsigned int nextLine(TokenStream* tokenStream) {
  70. unsigned int line = 0;
  71. tokenstream_read(tokenStream, &line, sizeof (unsigned int));
  72. return line;
  73. }
  74. const char* nextString(TokenStream* tokenStream) {
  75. size_t offset = tokenStream->readIndex;
  76. tokenStream->readIndex += strlen(tokenStream->buffer + tokenStream->readIndex) + 1;
  77. return tokenStream->buffer + offset;
  78. }
  79. double nextDouble(TokenStream* tokenStream) {
  80. double d;
  81. tokenstream_read(tokenStream, &d, sizeof (double));
  82. return d;
  83. }
  84. static void tokenstream_write(TokenStream* tokenStream, const void* data, size_t length) {
  85. if(tokenStream->index + length >= tokenStream->length) {
  86. size_t newSize = tokenStream->length;
  87. while(newSize < tokenStream->index + length) {
  88. newSize *= 2;
  89. }
  90. tokenStream->buffer = realloc(tokenStream->buffer, sizeof (char) * newSize);
  91. tokenStream->length = newSize;
  92. }
  93. const char* chars = (const char*) data;
  94. for(size_t i = 0; i < length; i++) {
  95. tokenStream->buffer[tokenStream->index++] = chars[i];
  96. }
  97. }
  98. void addToken(TokenStream* tokenStream, Token token, unsigned int line) {
  99. tokenstream_write(tokenStream, &line, sizeof (unsigned int));
  100. tokenstream_write(tokenStream, &token, sizeof (Token));
  101. }
  102. void addDoubleToken(TokenStream* tokenStream, Token token, unsigned int line, double d) {
  103. addToken(tokenStream, token, line);
  104. tokenstream_write(tokenStream, &d, sizeof (double));
  105. }
  106. void addStringToken(TokenStream* tokenStream, Token token, unsigned int line, const char* text) {
  107. addToken(tokenStream, token, line);
  108. tokenstream_write(tokenStream, text, strlen(text) + 1);
  109. }