+'use bytes' for the proper binary files encoding.
[udpgate.git] / src / bundle.pl
1 #! /usr/bin/perl
2
3 # $Id$
4 # Perl generator for the bundled files with UDPGate.
5 # Copyright (C) 2004 Jan Kratochvil <project-udpgate@jankratochvil.net>
6
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; exactly version 2 of June 1991 is required
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20
21 use vars qw($VERSION);
22 $VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
23 use strict;
24 use warnings;
25
26 use File::Basename;
27 use bytes;
28
29
30 print <<"EOH";
31 /* AUTOGENERATED FILE! DO NOT EDIT!
32  * Bundled files with UDPGate.
33  */
34
35
36 #include "config.h"
37
38 #include <glib/ghash.h>
39
40 #include "bundle.h"     /* self */
41
42
43 GHashTable *bundle_hash_new(void)
44 {
45 static GHashTable *hash;
46 /* Prefixed 32-bit network byte order file length. */
47 EOH
48 my @files;
49 for my $pathname (@ARGV) {
50         local *F;
51         open F,$pathname or die "Cannot open $pathname: $!";
52         local $/=undef();
53         my $F=<F>;
54         close F or warn "Cannot close $pathname: $!";
55         my $filename=basename $pathname;
56         (my $filename_sym=$filename)=~tr/a-zA-Z/_/c;
57         $filename_sym=~s/^_*//; # Prevent conflict with system internal symbols.
58         push @files,{
59                         "filename"    =>$filename,
60                         "filename_sym"=>$filename_sym,
61                         };
62         $F=pack("N*",length($F)).$F;    # Prefix 32-bit network byte order file length.
63         my $Fout=unpack "H*",$F;
64         $Fout=~s/../0x$&,/g;
65         $Fout=~s/(?:.....){1,16}/\t\t$&\n/g;
66         $Fout=~s/,\n$//;
67         print <<"EOH";
68 static const guint8 ${filename_sym}_data[]={
69 $Fout
70                 };
71 EOH
72         }
73 print <<"EOH";
74
75         if (!hash) {
76                 hash=g_hash_table_new(g_str_hash,g_str_equal);
77 EOH
78         for (@files) {
79                 print "\t\tg_hash_table_insert(hash,\"".$_->{"filename"}."\",(gpointer)".$_->{"filename_sym"}."_data);\n";
80                 }
81 print <<"EOH";
82                 }
83         return hash;
84 }
85
86 /* EOF */
87 EOH