/* makeheaders.c Copyright (C) 2005-2007 Codemist Ltd */ /* * This code may be used and modified, and redistributed in binary * or source form, subject to the "CCL Public License", which should * accompany it. This license is a variant on the BSD license, and thus * permits use of code derived from this in either open and commercial * projects: but it does require that updates to this code be made * available back to the originators of the package. * Before merging other code in with this or linking this code * with other packages or libraries please check that the license terms * of the other material are compatible with those of this. */ /* Signature: 07b413e8 26-Jun-2007 */ /* * Transcribes some header files, stripping comments etc */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <stdio.h> #include <string.h> #include <stdlib.h> /* * \ if not in comment next char not special * (I might not worry about the sequence "... \/* ...") * ' if not in comment go into char mode * " if not in comments go into string mode * / if not in string or char or comment check next char... * / then * go into comment mode * * in comment, check next char... * * then / end comment * */ /* * In some cases I may end up passing a file-name of the form * /cygdrive/d/path.../leaf * here. For things to behave I need to map that onto * d:/...path/leaf */ static FILE *myfopen(char *name, char *mode) { char newname[256]; if (strncmp(name, "/cygdrive/", 10) != 0) return fopen(name, mode); newname[0] = name[10]; newname[1] = ':'; strcpy(&newname[2], &name[11]); return fopen(newname, mode); } int main(int argc, char *argv[]) { int i; printf("char *config_header[] = {\n"); for (i=1; i<argc; i++) { FILE *f = myfopen(argv[i], "r"); int ch, incomment = 0, instring = 0, linestart = 1; if (f == NULL) { fprintf(stderr, "unable to read \"%s\"\n", argv[i]); exit(1); } for (;;) { ch = getc(f); /* first char of the next line */ if (ch == '\n' || ch == '\r') continue; if (ch == EOF) break; while (ch != '\n' && ch != '\r' && ch != EOF) { if (incomment == 0) { if (ch == '/') incomment = 1; } else if (incomment == 1) { if (ch == '*') incomment = 2; else if (ch == '/') { putchar('/'); incomment = 1; } else { putchar('/'); incomment = 0; } } else if (incomment == 2 && ch == '*') incomment = 3; else if (incomment == 3) { if (ch == '/') { incomment = 0; ch = getc(f); continue; } else if (ch == '*') incomment = 3; else incomment = 2; } if (incomment == 0) { if (linestart) { printf(" \""); linestart = 0; } if (ch == '\\' || ch == '\"') putchar('\\'); if (ch != '\r') putchar(ch); } ch = getc(f); } if (!linestart) printf("\",\n"); linestart = 1; if (ch == EOF) break; } fclose(f); if (i == 1) { printf(" NULL\n};\n\nchar *csl_headers[] = {\n"); } } printf(" NULL\n};\n\n/* end of machineid.d */\n\n"); return 0; } /* end of makeheaders.c */