diff options
author | Vladislav Vaintroub <wlad@montyprogram.com> | 2011-01-29 18:51:12 +0100 |
---|---|---|
committer | Vladislav Vaintroub <wlad@montyprogram.com> | 2011-01-29 18:51:12 +0100 |
commit | b19e99865ccf3e946ebe59bf09add8e0452904ac (patch) | |
tree | 23cb9e8176ef9d0e276b47d197e11d195b2ecafb /scripts/comp_sql.c | |
parent | 3edf4dcd5a36be8d5acc94e0c5e29e77e47cd15b (diff) | |
download | mariadb-git-b19e99865ccf3e946ebe59bf09add8e0452904ac.tar.gz |
MWL#55 : cherrypick MySQL 5.5 CMake/build improvements in order
to be able to build MSI based installer
Diffstat (limited to 'scripts/comp_sql.c')
-rw-r--r-- | scripts/comp_sql.c | 111 |
1 files changed, 75 insertions, 36 deletions
diff --git a/scripts/comp_sql.c b/scripts/comp_sql.c index 88e88e632b6..f65517ccf19 100644 --- a/scripts/comp_sql.c +++ b/scripts/comp_sql.c @@ -25,6 +25,10 @@ #include <stdarg.h> #include <stdlib.h> #include <stdio.h> +#include <sys/stat.h> + +/* Compiler-dependent constant for maximum string constant */ +#define MAX_STRING_CONSTANT_LENGTH 65535 FILE *in, *out; @@ -58,64 +62,99 @@ static void die(const char *fmt, ...) int main(int argc, char *argv[]) { char buff[512]; + struct stat st; char* struct_name= argv[1]; char* infile_name= argv[2]; char* outfile_name= argv[3]; + if (argc != 4) die("Usage: comp_sql <struct_name> <sql_filename> <c_filename>"); /* Open input and output file */ if (!(in= fopen(infile_name, "r"))) die("Failed to open SQL file '%s'", infile_name); + + if (!(out= fopen(outfile_name, "w"))) die("Failed to open output file '%s'", outfile_name); + fprintf(out, "const char %s[]={\n",struct_name); + + /* + Some compilers have limitations how long a string constant can be. + We'll output very long strings as hexadecimal arrays, and short ones + as strings (prettier) + */ + stat(infile_name, &st); + if (st.st_size > MAX_STRING_CONSTANT_LENGTH) + { + int cnt=0; + int c; + int first_char= 1; + for(cnt=0;;cnt++) + { + c= fgetc(in); + if (c== -1) + break; + + if(cnt != 0) + fputc(',', out); - fprintf(out, "const char* %s={\n\"", struct_name); + /* Put line break after each 16 hex characters */ + if(cnt && (cnt%16 == 0)) + fputc('\n', out); - while (fgets(buff, sizeof(buff), in)) + fprintf(out,"0x%02x",c); + } + fprintf(out,",0x00",c); + } + else { - char *curr= buff; - while (*curr) + fprintf(out,"\""); + while (fgets(buff, sizeof(buff), in)) { - if (*curr == '\n') - { - /* - Reached end of line, add escaped newline, escaped - backslash and a newline to outfile - */ - fprintf(out, "\\n \"\n\""); - curr++; - } - else if (*curr == '\r') - { - curr++; /* Skip */ - } - else + char *curr= buff; + while (*curr) { - if (*curr == '"') + if (*curr == '\n') { - /* Needs escape */ - fputc('\\', out); + /* + Reached end of line, add escaped newline, escaped + backslash and a newline to outfile + */ + fprintf(out, "\\n \"\n\""); + curr++; + } + else if (*curr == '\r') + { + curr++; /* Skip */ + } + else + { + if (*curr == '"') + { + /* Needs escape */ + fputc('\\', out); + } + + fputc(*curr, out); + curr++; } - - fputc(*curr, out); - curr++; + } + if (*(curr-1) != '\n') + { + /* + Some compilers have a max string length, + insert a newline at every 512th char in long + strings + */ + fprintf(out, "\"\n\""); } } - if (*(curr-1) != '\n') - { - /* - Some compilers have a max string length, - insert a newline at every 512th char in long - strings - */ - fprintf(out, "\"\n\""); - } + fprintf(out, "\\\n\""); } - - fprintf(out, "\\\n\"};\n"); - + + fprintf(out, "};\n"); fclose(in); fclose(out); |