| /* |
| * Copyright 1993, 1995 Christopher Seiwald. |
| * |
| * This file is part of Jam - see jam.c for Copyright information. |
| */ |
| |
| /* This file is ALSO: |
| * Copyright 2001-2004 David Abrahams. |
| * Distributed under the Boost Software License, Version 1.0. |
| * (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| |
| /* |
| * mkjambase.c - turn Jambase into a big C structure |
| * |
| * Usage: mkjambase jambase.c Jambase ... |
| * |
| * Results look like this: |
| * |
| * char *jambase[] = { |
| * "...\n", |
| * ... |
| * 0 }; |
| * |
| * Handles \'s and "'s specially; knows to delete blank and comment lines. |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| |
| |
| int main( int argc, char * * argv, char * * envp ) |
| { |
| char buf[ 1024 ]; |
| FILE * fin; |
| FILE * fout; |
| char * p; |
| int doDotC = 0; |
| |
| if ( argc < 3 ) |
| { |
| fprintf( stderr, "usage: %s jambase.c Jambase ...\n", argv[ 0 ] ); |
| return -1; |
| } |
| |
| if ( !( fout = fopen( argv[1], "w" ) ) ) |
| { |
| perror( argv[ 1 ] ); |
| return -1; |
| } |
| |
| /* If the file ends in .c generate a C source file. */ |
| if ( ( p = strrchr( argv[1], '.' ) ) && !strcmp( p, ".c" ) ) |
| doDotC++; |
| |
| /* Now process the files. */ |
| |
| argc -= 2; |
| argv += 2; |
| |
| if ( doDotC ) |
| { |
| fprintf( fout, "/* Generated by mkjambase from Jambase */\n" ); |
| fprintf( fout, "char *jambase[] = {\n" ); |
| } |
| |
| for ( ; argc--; ++argv ) |
| { |
| if ( !( fin = fopen( *argv, "r" ) ) ) |
| { |
| perror( *argv ); |
| return -1; |
| } |
| |
| if ( doDotC ) |
| fprintf( fout, "/* %s */\n", *argv ); |
| else |
| fprintf( fout, "### %s ###\n", *argv ); |
| |
| while ( fgets( buf, sizeof( buf ), fin ) ) |
| { |
| if ( doDotC ) |
| { |
| char * p = buf; |
| |
| /* Strip leading whitespace. */ |
| while ( ( *p == ' ' ) || ( *p == '\t' ) || ( *p == '\n' ) ) |
| ++p; |
| |
| /* Drop comments and empty lines. */ |
| if ( ( *p == '#' ) || !*p ) |
| continue; |
| |
| /* Copy. */ |
| putc( '"', fout ); |
| for ( ; *p && ( *p != '\n' ); ++p ) |
| switch ( *p ) |
| { |
| case '\\': putc( '\\', fout ); putc( '\\', fout ); break; |
| case '"' : putc( '\\', fout ); putc( '"' , fout ); break; |
| case '\r': break; |
| default: putc( *p, fout ); break; |
| } |
| |
| fprintf( fout, "\\n\",\n" ); |
| } |
| else |
| { |
| fprintf( fout, "%s", buf ); |
| } |
| } |
| |
| fclose( fin ); |
| } |
| |
| if ( doDotC ) |
| fprintf( fout, "0 };\n" ); |
| |
| fclose( fout ); |
| |
| return 0; |
| } |