tree-sitter-gitcommit 0.5.0

gitcommit grammar for the tree-sitter parsing library
Documentation
#include <tree_sitter/parser.h>
#include <wctype.h>

enum TokenType { CONVENTIONAL_PREFIX, TRAILER_VALUE };

void *tree_sitter_gitcommit_external_scanner_create() { return NULL; }

void tree_sitter_gitcommit_external_scanner_destroy(void *p) {}

void tree_sitter_gitcommit_external_scanner_reset(void *p) {}

unsigned tree_sitter_gitcommit_external_scanner_serialize(void *p,
                                                          char *buffer) {
  return 0;
}

void tree_sitter_gitcommit_external_scanner_deserialize(void *p, const char *b,
                                                        unsigned n) {}

bool tree_sitter_gitcommit_external_scanner_scan(void *payload, TSLexer *lexer,
                                                 const bool *valid_symbols) {
  if (valid_symbols[CONVENTIONAL_PREFIX]) {
    lexer->result_symbol = CONVENTIONAL_PREFIX;
    if (iswcntrl(lexer->lookahead) || iswspace(lexer->lookahead) ||
        lexer->lookahead == ':' || lexer->lookahead == '!' ||
        lexer->lookahead == '\0') {
      return false;
    }
    lexer->advance(lexer, false);

    while (!iswcntrl(lexer->lookahead) && !iswspace(lexer->lookahead) &&
           lexer->lookahead != ':' && lexer->lookahead != '!' &&
           lexer->lookahead != '(' && lexer->lookahead != ')' &&
           lexer->lookahead != '\0') {
      lexer->advance(lexer, false);
    }
    lexer->mark_end(lexer);

    if (lexer->lookahead == '(') {
      lexer->advance(lexer, false);

      if (lexer->lookahead == ')') {
        return false;
      }

      while (!iswcntrl(lexer->lookahead) && lexer->lookahead != '(' &&
             lexer->lookahead != ')' && lexer->lookahead != '\0') {
        lexer->advance(lexer, false);
      }

      if (lexer->lookahead != ')') {
        return false;
      }
      lexer->advance(lexer, false);
    }

    if (lexer->lookahead == '!') {
      lexer->advance(lexer, false);
    }

    return lexer->lookahead == ':' || lexer->lookahead == 0xff1a;
  }

  return false;
}