#pragma once

#define IS_CREATE(p) ( \
  p[0] == 'C' &&        \
  p[1] == 'R' &&        \
  p[2] == 'E' &&        \
  p[3] == 'A' &&        \
  p[4] == 'T' &&        \
  p[5] == 'E'           \
)

#define IS_TABLE(p) (   \
  p[0] == 'T' &&        \
  p[1] == 'A' &&        \
  p[2] == 'B' &&        \
  p[3] == 'L' &&        \
  p[4] == 'E'           \
)

#define IS_INSERT(p) ( \
  p[0] == 'I' &&        \
  p[1] == 'N' &&        \
  p[2] == 'S' &&        \
  p[3] == 'E' &&        \
  p[4] == 'R' &&        \
  p[5] == 'T'           \
)

#define IS_INTO(p) (   \
  p[0] == 'I' &&        \
  p[1] == 'N' &&        \
  p[2] == 'T' &&        \
  p[3] == 'O'           \
)

#define IS_VALUES(p) ( \
  p[0] == 'V' &&        \
  p[1] == 'A' &&        \
  p[2] == 'L' &&        \
  p[3] == 'U' &&        \
  p[4] == 'E' &&        \
  p[5] == 'S'           \
)

#define IS_KEY(p) (     \
  p[0] == 'K' &&        \
  p[1] == 'E' &&        \
  p[2] == 'Y'           \
)

#define IS_INDEX(p) (   \
  p[0] == 'I' &&        \
  p[1] == 'N' &&        \
  p[2] == 'D' &&        \
  p[3] == 'E' &&        \
  p[4] == 'X'           \
)

#define IS_UNIQUE(p) ( \
  p[0] == 'U' &&        \
  p[1] == 'N' &&        \
  p[2] == 'I' &&        \
  p[3] == 'Q' &&        \
  p[4] == 'U' &&        \
  p[5] == 'E'           \
)

#define IS_PRIMARY(p) ( \
  p[0] == 'P' &&         \
  p[1] == 'R' &&         \
  p[2] == 'I' &&         \
  p[3] == 'M' &&         \
  p[4] == 'A' &&         \
  p[5] == 'R' &&         \
  p[6] == 'Y'            \
)

#define IS_NULL_STR(p) ( \
  p[0] == 'N' &&         \
  p[1] == 'U' &&         \
  p[2] == 'L' &&         \
  p[3] == 'L'            \
)

#define IS__binary(p) ( \
  p[0] == '_' &&        \
  p[1] == 'b' &&        \
  p[2] == 'i' &&        \
  p[3] == 'n' &&        \
  p[4] == 'a' &&        \
  p[5] == 'r' &&        \
  p[6] == 'y'           \
)

#define IS_MAYBE_KEY(p) (IS_KEY(p) || IS_INDEX(p) || IS_UNIQUE(p) || IS_PRIMARY(p))

#define IS_WSPACE(p) (*p == ' ' || *p == '\t')
#define SKIP_WSPACE(p) { \
  while (*p != '\0' && IS_WSPACE(p)) p++;     \
}
#define SKIP_UNTIL_WSPACE(p) { \
  while (*p != '\0' && !IS_WSPACE(p)) p++;          \
}