/*************************************************************************** * mkconfigs.c * (C) 2002 Randy Dunlap # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # Rules for scripts/mkconfigs.c input.config output.c # to generate configs.c from linux/.config: # - drop lines that begin with '#' # - drop blank lines # - lines that use double-quotes must \\-escape-quote them ################## skeleton configs.c file: #################### #include #include static char *configs[] __initdata = , ; ################### end configs.c file ###################### * Changelog for ver. 0.2, 2002-02-15, rddunlap@osdl.org: - strip leading "CONFIG_" from config option strings; - use "static" and "__attribute__((unused))"; - don't use EXPORT_SYMBOL(); - separate each config line with \newline instead of space; * Changelog for ver. 0.3, 2002-02-18, rddunlap@osdl.org: - keep all "not set" comment lines from .config so that 'make *config' will be happy, but don't keep other comments; - keep leading "CONFIG_" on each line; ****************************************************************/ #include #include #include #include #define VERSION "0.2" #define LINE_SIZE 1000 int include_all_lines = 1; // whether to include "=n" lines in the output void usage (const char *progname) { fprintf (stderr, "%s ver. %s\n", progname, VERSION); fprintf (stderr, "usage: %s input.config.name path/configs.c\n", progname); exit (1); } void make_intro (FILE *sourcefile) { fprintf (sourcefile, "#include \n"); ///// fprintf (sourcefile, "#include \n"); fprintf (sourcefile, "\n"); ///// fprintf (sourcefile, "char *configs[] __initdata = {\n"); fprintf (sourcefile, "static char __attribute__ ((unused)) *configs[] __initdata = {\n"); fprintf (sourcefile, " \"CONFIG_BEGIN=n\\n\" ,\n"); } void make_ending (FILE *sourcefile) { fprintf (sourcefile, " \"CONFIG_END=n\\n\"\n"); fprintf (sourcefile, "};\n"); ///// fprintf (sourcefile, "EXPORT_SYMBOL (configs);\n"); } void make_lines (FILE *configfile, FILE *sourcefile) { char cfgline[LINE_SIZE]; char *ch; while (fgets (cfgline, LINE_SIZE, configfile)) { /* kill the trailing newline in cfgline */ cfgline[strlen (cfgline) - 1] = '\0'; /* don't keep #-only line or an empty/blank line */ if ((cfgline[0] == '#' && cfgline[1] == '\0') || cfgline[0] == '\0') continue; if (!include_all_lines && cfgline[0] == '#') // strip out all comment lines continue; /* really only want to keep lines that begin with * "CONFIG_" or "# CONFIG_" */ if (strncmp (cfgline, "CONFIG_", 7) && strncmp (cfgline, "# CONFIG_", 9)) continue; /* * use strchr() to check for "-quote in cfgline; * if not found, output the line, quoted; * if found, output a char at a time, with \\-quote * preceding double-quote chars */ if (!strchr (cfgline, '"')) { fprintf (sourcefile, " \"%s\\n\" ,\n", cfgline); continue; } /* go to char-at-a-time mode for this config and * precede any double-quote with a backslash */ fprintf (sourcefile, " \""); /* lead-in */ for (ch = cfgline; *ch; ch++) { if (*ch == '"') fputc ('\\', sourcefile); fputc (*ch, sourcefile); } fprintf (sourcefile, "\\n\" ,\n"); } } void make_configs (FILE *configfile, FILE *sourcefile) { make_intro (sourcefile); make_lines (configfile, sourcefile); make_ending (sourcefile); } int main (int argc, char *argv[]) { char *progname = argv[0]; char *configname, *sourcename; FILE *configfile, *sourcefile; if (argc != 3) usage (progname); configname = argv[1]; sourcename = argv[2]; configfile = fopen (configname, "r"); if (!configfile) { fprintf (stderr, "%s: cannot open '%s'\n", progname, configname); exit (2); } sourcefile = fopen (sourcename, "w"); if (!sourcefile) { fprintf (stderr, "%s: cannot open '%s'\n", progname, sourcename); exit (2); } make_configs (configfile, sourcefile); if (fclose (sourcefile)) { fprintf (stderr, "%s: error %d closing '%s'\n", progname, errno, sourcename); exit (3); } if (fclose (configfile)) { fprintf (stderr, "%s: error %d closing '%s'\n", progname, errno, configname); exit (3); } exit (0); } /* end mkconfigs.c */