| /* $Id$ |
| * |
| * Generate module.c from module.in and list of modules. |
| * |
| * Copyright (C) 2004 Peter Johnson |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS'' |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #define OUTPUT "module.c" |
| #define MAXLINE 1024 |
| #define MAXMODULES 128 |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| FILE *in, *out; |
| char *str; |
| int i; |
| int len; |
| char *strp; |
| char *modules[MAXMODULES]; |
| int num_modules = 0; |
| |
| if (argc < 2) { |
| fprintf(stderr, "Usage: %s <file> [module_name ...]\n", argv[0]); |
| return EXIT_FAILURE; |
| } |
| |
| str = malloc(MAXLINE); |
| |
| #ifdef FILTERMODE |
| while (fgets(str, MAXLINE, stdin)) { |
| if (strlen(str) < 6) |
| continue; |
| modules[num_modules] = malloc(strlen(str+5)+1); /* excessive */ |
| strp = str+5; /* skip past the "yasm_" */ |
| i = 0; |
| /* copy the module type */ |
| while (*strp != '_') |
| modules[num_modules][i++] = *strp++; |
| modules[num_modules][i++] = *strp++; /* copy the following _ */ |
| /* find the next _ */ |
| while (*strp++ != '_') |
| {} |
| /* copy it up until the next _ */ |
| do { |
| modules[num_modules][i++] = *strp++; |
| } while (*strp != '_'); |
| /* terminate string */ |
| modules[num_modules][i] = '\0'; |
| num_modules++; |
| } |
| #else |
| num_modules = argc-2; |
| for (i=2; i<argc; i++) { |
| modules[i-2] = malloc(strlen(argv[i])+1); |
| strcpy(modules[i-2], argv[i]); |
| } |
| #endif |
| |
| out = fopen(OUTPUT, "wt"); |
| |
| if (!out) { |
| fprintf(stderr, "Could not open `%s'.\n", OUTPUT); |
| return EXIT_FAILURE; |
| } |
| |
| fprintf(out, "/* This file auto-generated by genmodule.c" |
| " - don't edit it */\n\n"); |
| |
| in = fopen(argv[1], "rt"); |
| if (!in) { |
| fprintf(stderr, "Could not open `%s'.\n", argv[1]); |
| fclose(out); |
| remove(OUTPUT); |
| return EXIT_FAILURE; |
| } |
| |
| len = 0; |
| while (fgets(str, MAXLINE, in)) { |
| if (strncmp(str, "MODULES_", 8) == 0) { |
| len = 0; |
| strp = str+8; |
| while (*strp != '\0' && *strp != '_') { |
| len++; |
| strp++; |
| } |
| *strp = '\0'; |
| |
| for (i=0; i<num_modules; i++) { |
| if (strncmp(modules[i], str+8, len) == 0) { |
| fprintf(out, " {\"%s\", &yasm_%s_LTX_%s},\n", |
| modules[i]+len+1, modules[i]+len+1, str+8); |
| } |
| } |
| } else if (strncmp(str, "EXTERN_LIST", 11) == 0) { |
| for (i=0; i<num_modules; i++) { |
| strcpy(str, modules[i]); |
| strp = str; |
| while (*strp != '\0' && *strp != '_') { |
| len++; |
| strp++; |
| } |
| *strp++ = '\0'; |
| |
| fprintf(out, "extern yasm_%s_module yasm_%s_LTX_%s;\n", |
| str, strp, str); |
| } |
| } else |
| fputs(str, out); |
| } |
| |
| fclose(in); |
| fclose(out); |
| |
| for (i=0; i<num_modules; i++) |
| free(modules[i]); |
| free(str); |
| |
| return EXIT_SUCCESS; |
| } |