xyntax -- Header-only library for syntax highlighting control.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 line
4.5KB

  1. #ifndef XYNTAX_SOURCE
  2. #define XYNTAX_SOURCE
  3. #include <xolatile/xtandard.c>
  4. #include <xolatile/xyntax.h>
  5. static int syntax_count = 0;
  6. static int syntax_active = false;
  7. static int * syntax_enrange = null;
  8. static int * syntax_derange = null;
  9. static char * * syntax_begin = null;
  10. static char * * syntax_end = null;
  11. static char * syntax_escape = null;
  12. static int * syntax_colour = null;
  13. static int * syntax_effect = null;
  14. static void syntax_delete (void) {
  15. int offset;
  16. if (syntax_active == false) {
  17. return;
  18. }
  19. for (offset = 0; offset < syntax_count; ++offset) {
  20. syntax_begin [offset] = deallocate (syntax_begin [offset]);
  21. syntax_end [offset] = deallocate (syntax_end [offset]);
  22. }
  23. syntax_enrange = deallocate (syntax_enrange);
  24. syntax_derange = deallocate (syntax_derange);
  25. syntax_begin = deallocate (syntax_begin);
  26. syntax_end = deallocate (syntax_end);
  27. syntax_escape = deallocate (syntax_escape);
  28. syntax_colour = deallocate (syntax_colour);
  29. syntax_effect = deallocate (syntax_effect);
  30. syntax_active = false;
  31. syntax_count = 0;
  32. }
  33. int syntax_define (int enrange, int derange, char * begin, char * end, char escape, int colour, int effect) {
  34. if (syntax_active == false) {
  35. syntax_active = true;
  36. atexit (syntax_delete);
  37. }
  38. fatal_failure (begin == null, "syntax_define: Begin string is null pointer.");
  39. fatal_failure (end == null, "syntax_define: End string is null pointer.");
  40. ++syntax_count;
  41. syntax_enrange = reallocate (syntax_enrange, syntax_count * (int) sizeof (* syntax_enrange));
  42. syntax_derange = reallocate (syntax_derange, syntax_count * (int) sizeof (* syntax_derange));
  43. syntax_begin = reallocate (syntax_begin, syntax_count * (int) sizeof (* syntax_begin));
  44. syntax_end = reallocate (syntax_end, syntax_count * (int) sizeof (* syntax_end));
  45. syntax_escape = reallocate (syntax_escape, syntax_count * (int) sizeof (* syntax_escape));
  46. syntax_colour = reallocate (syntax_colour, syntax_count * (int) sizeof (* syntax_colour));
  47. syntax_effect = reallocate (syntax_effect, syntax_count * (int) sizeof (* syntax_effect));
  48. syntax_begin [syntax_count - 1] = allocate ((string_length (begin) + 1) * (int) sizeof (* * syntax_begin));
  49. syntax_end [syntax_count - 1] = allocate ((string_length (end) + 1) * (int) sizeof (* * syntax_end));
  50. syntax_enrange [syntax_count - 1] = enrange;
  51. syntax_derange [syntax_count - 1] = derange;
  52. syntax_escape [syntax_count - 1] = escape;
  53. syntax_colour [syntax_count - 1] = colour;
  54. syntax_effect [syntax_count - 1] = effect;
  55. string_copy (syntax_begin [syntax_count - 1], begin);
  56. string_copy (syntax_end [syntax_count - 1], end);
  57. return (syntax_count - 1);
  58. }
  59. int syntax_select (char * string, int * length) {
  60. int offset, subset, select;
  61. fatal_failure (syntax_active == false, "syntax_select: Syntax is not active.");
  62. fatal_failure (string == null, "syntax_select: String is null.");
  63. fatal_failure (length == null, "syntax_select: Length is null.");
  64. for (select = offset = 0; select != syntax_count; ++select) {
  65. if (syntax_enrange [select] == false) {
  66. if (syntax_derange [select] == false) {
  67. if (string_compare_limit (string, syntax_begin [select], string_length (syntax_begin [select])) == true) {
  68. break;
  69. }
  70. } else {
  71. if ((string_compare_limit (string, syntax_begin [select], string_length (syntax_begin [select])) == true)
  72. && (character_compare_array (string [offset + string_length (syntax_begin [select])], syntax_end [select]) == true)) {
  73. break;
  74. }
  75. }
  76. } else {
  77. for (subset = 0; subset != string_length (syntax_begin [select]); ++subset) {
  78. if (string [offset] == syntax_begin [select] [subset]) {
  79. goto selected;
  80. }
  81. }
  82. }
  83. }
  84. selected:
  85. if (select >= syntax_count) {
  86. * length = 1;
  87. return (syntax_count);
  88. }
  89. for (offset = 1; string [offset - 1] != '\0'; ++offset) {
  90. if (string [offset] == syntax_escape [select]) {
  91. ++offset;
  92. continue;
  93. }
  94. if (syntax_derange [select] == false) {
  95. if (string_compare_limit (& string [offset], syntax_end [select], string_length (syntax_end [select])) == true) {
  96. * length = offset + string_length (syntax_end [select]);
  97. return (select);
  98. }
  99. } else {
  100. subset = 0;
  101. if (string_compare (syntax_end [select], "") == false) {
  102. break;
  103. } do {
  104. if (string [offset] == syntax_end [select] [subset]) {
  105. * length = offset;
  106. goto finished;
  107. }
  108. } while (++subset != string_length (syntax_end [select]));
  109. }
  110. }
  111. finished:
  112. return (select);
  113. }
  114. #endif