summaryrefslogtreecommitdiff
path: root/deps/acore/mysql-tools/dump-parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/acore/mysql-tools/dump-parser.c')
-rw-r--r--deps/acore/mysql-tools/dump-parser.c129
1 files changed, 129 insertions, 0 deletions
diff --git a/deps/acore/mysql-tools/dump-parser.c b/deps/acore/mysql-tools/dump-parser.c
new file mode 100644
index 0000000000..a9262d4f92
--- /dev/null
+++ b/deps/acore/mysql-tools/dump-parser.c
@@ -0,0 +1,129 @@
+/* gcc -O2 -Wall -pedantic dump-parser.c -o dump-parser
+ Usage: cat dump.sql | dump-parser
+ Or : dump-parser dump.sql
+ bugs :
+ * the parser will fail if the 10001st character of a line is an escaped quote, it will see it as an unescaped quote.
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+
+#define BUFFER 100000
+
+bool is_escaped(char* string, int offset) {
+ if (offset == 0) {
+ return false;
+ } else if (string[offset - 1] == '\\') {
+ return !is_escaped(string, offset - 1);
+ } else {
+ return false;
+ }
+}
+
+bool is_commented(char* string) {
+ char buffer[4];
+
+ sprintf(buffer, "%.3s", string);
+
+ return strcmp(buffer, "-- ") == 0;
+}
+
+int main(int argc, char *argv[])
+{
+ FILE* file = argc > 1 ? fopen(argv[1], "r") : stdin;
+
+ char buffer[BUFFER];
+ char* line;
+ int pos;
+ int parenthesis = 0;
+ bool quote = false;
+ bool escape = false;
+ bool comment = false;
+
+ while (fgets(buffer, BUFFER, file) != NULL) {
+ line = buffer;
+
+ /* skip commented */
+ if (comment || is_commented(line)) {
+ comment = line[strlen(line) - 1] != '\n';
+ fputs(line, stdout);
+ } else {
+ pos = 0;
+
+ nullchar:
+ while (line[pos] != '\0') {
+ /* if we are still in escape state, we need to check first char. */
+ if (!escape) {
+ /* find any character in ()' */
+ pos = strcspn(line, "()'\\");
+ }
+
+ if (pos > 0) {
+ /* print before match */
+ printf("%.*s", pos, line);
+ }
+
+ switch (line[pos]) {
+ case '(':
+ if (!quote) {
+ if (parenthesis == 0) {
+ putchar('\n');
+ }
+ parenthesis++;
+ }
+ if (escape) {
+ escape = false;
+ }
+ break;
+
+ case ')':
+ if (!quote) {
+ if (parenthesis > 0) {
+ parenthesis--;
+ } else {
+ /* whoops */
+ puts("\n");
+ fputs(line, stdout);
+ fputs("Found closing parenthesis without opening one.\n", stderr);
+ exit(1);
+ }
+ }
+ if (escape) {
+ escape = false;
+ }
+ break;
+
+ case '\\':
+ escape = !escape;
+ break;
+
+ case '\'':
+ if (escape) {
+ escape = false;
+ } else {
+ quote = !quote;
+ }
+ break;
+
+ case '\0':
+ goto nullchar;
+
+ default:
+ if (escape) {
+ escape = false;
+ }
+ break;
+ }
+
+ /* print char then skip it (to make sure we don’t double match) */
+ putchar(line[pos]);
+ line = line + pos + 1;
+ pos = 0;
+ }
+ }
+ }
+
+ return 0;
+}