source: trunk/libs/newlib/src/newlib/libc/iconv/ces/mkdeps.pl @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 28.6 KB
Line 
1#!/usr/bin/perl -w
2#
3#  Copyright (c) 2003-2004, Artem B. Bityuckiy, SoftMine Corporation.
4#
5#  Redistribution and use in source and binary forms, with or without
6#  modification, are permitted provided that the following conditions
7#  are met:
8#  1. Redistributions of source code must retain the above copyright
9#     notice, this list of conditions and the following disclaimer.
10#  2. Redistributions in binary form must reproduce the above copyright
11#     notice, this list of conditions and the following disclaimer in the
12#     documentation and/or other materials provided with the distribution.
13#
14#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15#  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17#  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19#  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20#  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21#  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22#  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23#  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24#  SUCH DAMAGE.
25#
26use integer;
27use Getopt::Std;
28use strict;
29
30sub err($);
31sub process_section_encodings($);
32sub process_section_cesdeps($);
33sub next_entry($$$);
34
35sub generate_cesbi_h($$);
36sub generate_encnames_h(@);
37sub generate_aliasesbi_c($);
38sub generate_encoding_aliases_c($);
39sub generate_cesdeps_h($);
40sub generate_ccsbi_h($);
41sub generate_cesbi_c($);
42sub generate_ccsnames_h($);
43
44# ==============================================================================
45#
46# GLOBAL VARIABLES
47#
48# ==============================================================================
49
50my $comment_automatic =
51"/*
52 * This file was automatically generated mkdeps.pl script. Don't edit.
53 */";
54
55my $macro_from_enc     = '_ICONV_FROM_ENCODING_';
56my $macro_to_enc       = '_ICONV_TO_ENCODING_';
57my $macro_from_ucs_ces = 'ICONV_FROM_UCS_CES_';
58my $macro_to_ucs_ces   = 'ICONV_TO_UCS_CES_';
59my $macro_from_ucs_ccs = 'ICONV_FROM_UCS_CCS_';
60my $macro_to_ucs_ccs   = 'ICONV_TO_UCS_CCS_';
61my $macro_enc_name     = 'ICONV_ENCODING_';
62my $macro_ccs_name     = 'ICONV_CCS_';
63
64my $var_from_ucs_handlers = '_iconv_from_ucs_ces_handlers_';
65my $var_to_ucs_handlers   = '_iconv_to_ucs_ces_handlers_';
66my $var_ccs       = '_iconv_ccs_';
67my $var_aliases   = '_iconv_aliases';
68my $var_ces_names = 'iconv_ces_names_';
69
70# ==============================================================================
71#
72# PARSE COMMAND-LINE OPTIONS.
73#
74# ==============================================================================
75
76my %options;
77
78# SUPPORTED OPTIONS.
79my $help_opt    = 'h';
80my $infile_opt  = 'i';
81my $verbose_opt = 'v';
82
83# Default input configuration file name
84my $default_infile = '../lib/encoding.deps';
85# Real input configuration file name
86my $infile;
87# Verbose flag (be verbose if not zero)
88my $verbose;
89
90{
91getopts ("${help_opt}${verbose_opt}${infile_opt}:", \%options)
92or err "getopts() failed: $!.";
93
94if ($options{$help_opt})
95{
96  # Output help message and exit.
97  print "Usage: $0 [-$infile_opt depfile] [-$help_opt]\n";
98  print "\t-$infile_opt - input file with configuration ($default_infile ";
99  print "file will be used by default)\n";
100  print "\t-$help_opt - this help message\n";
101  exit 0;
102}
103
104# Input file name.
105$infile = $options{$infile_opt} ? $options{$infile_opt} : $default_infile;
106$verbose = $options{$verbose_opt} ? 1 : 0;
107
108print "Debug: -$verbose_opt option found.\n" if $verbose;
109
110# ==============================================================================
111#
112# Find and fetch sections from input file
113#
114# ==============================================================================
115
116# Opening input file
117print "Debug: open \"$infile\" input file.\n" if $verbose;
118open (INFILE, '<', $infile) or err "Can't open \"$infile\" file for reading.\n"
119                                 . "System error message: $!.\n";
120
121# Configuration file markers
122my $marker_section = 'SECTION';
123my $marker_section_end = 'SECTION END';
124
125# File sections. Hash values are references to arrays with section contents
126my %sections;
127
128# Extract sections from file
129for (my $ln = 1; my $l = <INFILE>; $ln += 1)
130{
131  # Skip comments and empty lines
132  next if $l =~ m/^#.*$/ or $l =~ m/^\s*$/;
133
134  # Remove last CR symbol
135  $l =~ s/^(.*)\n$/$1/, $l =~ s/^(.*)\r$/$1/;
136
137  # Generate error if line isn't section begin marker
138  err "(input file line $ln) Unexpected marker: \"$l\". ${marker_section} "
139    . "is expected."
140  if $l !~ m/^$marker_section(\s+(\S*)\s*)?$/;
141 
142  # Generate error if there is no section name
143  err "(input file line $ln) Section name isn't found"
144  if !$1 or !$2;
145 
146  # Generate error if this is section end marker
147  err "(input file line $ln) Unexpected \"${marker_section_end}\" marker "
148    . "in input file."
149  if $2 eq $marker_section_end;
150
151  my $sect_name = $2;
152
153  # Extract section content
154  for (; $l = <INFILE>; $ln += 1)
155  {
156    # Skip comments and empty lines
157    next if $l =~ m/^#.*$/ or $l =~ m/^$/;
158    # Remove last CR symbol
159    $l =~ s/^(.*)\n$/$1/, $l =~ s/^(.*)\r$/$1/;
160   
161    last if $l =~ m/^$marker_section_end$/;
162
163    push @{$sections{$sect_name}}, $l;
164  }
165
166  # Generate error if section wasn't ended
167  err "(input file line $ln) \"No $marker_section_end\" marker found"
168  if $l !~ m/^$marker_section_end$/;
169}
170
171close INFILE or err "Error while closing input file.";
172
173# =============================================================================
174#
175# Now sections are fetched. Each section is processed by separate function.
176# There are only three supported sections now: ENCODINGS, CES_DEPENDENCIES
177# and ENCODING_CCS_DEPENDENCIES.
178#
179# =============================================================================
180
181my $section_encodings = 'ENCODINGS';
182my $section_cesdeps   = 'CES_DEPENDENCIES';
183
184my $section;
185
186err "$section_encodings not found."
187if !defined $sections{$section_encodings};
188err "$section_cesdeps not found."
189if !defined $sections{$section_cesdeps};
190
191# Process sections
192print "Debug: process $section_encodings section.\n" if $verbose;
193process_section_encodings ($sections{$section_encodings});
194delete $sections{$section_encodings};
195
196print "Debug: process $section_cesdeps section.\n" if $verbose;
197process_section_cesdeps ($sections{$section_cesdeps});
198delete $sections{$section_cesdeps};
199
200print STDERR "Warning: section \"$_\" was ignored!\n"
201foreach (keys %sections);
202
203exit 1;
204}
205
206# =============================================================================
207#
208# Print error message and exit.
209#
210# Parameter 1: error message.
211#
212# =============================================================================
213sub err($)
214{
215  print STDERR "Error while running script.\n$_[0]\n";
216  exit 0;
217}
218
219
220# =============================================================================
221#
222# Process ENCODINGS section.
223#
224# Parameter 1 (input):  array reference with section content;
225#
226# =============================================================================
227sub process_section_encodings($)
228{
229  my $sect = $_[0];
230  my $lineidx = 0;
231  my @entry;
232  my $marker_encoding = 'ENCODING';
233  my $marker_ces      = 'CES';
234  my $marker_ccs      = 'CCS';
235  my $marker_aliases  = 'ALIASES';
236
237  # Keys: CES names. Values: array reference with encodings list.
238  my %cesenc;
239  # Keys: encodings. Values: CES converter names.
240  my %encces;
241  # Keys: CCS tables names. Values: array reference with encodings.
242  my %ccsenc;
243  # Keys: encodings. Values: aliases list.
244  my %encalias;
245
246  while (next_entry ($sect, \@entry, \$lineidx))
247  {
248    my $encoding;
249    my $ces;
250    my $ccs;
251    my $aliases;
252   
253    foreach my $l (@entry)
254    {
255      if ($l =~ m/^($marker_encoding):\s*(\S*)\s*$/)
256      {
257        err "(process_section_encodings()) More than one $marker_encoding "
258          . "records found ($l)"
259        if defined $encoding;
260       
261        $encoding = $2; 
262      }
263      elsif ($l =~ m/^($marker_ces):\s*(\S*)\s*$/)
264      {
265        err "(process_section_encodings()) More than one $marker_ces "
266          . "records found ($l)"
267        if defined $ces;
268
269        $ces = $2;
270      }
271      elsif ($l =~ m/^($marker_aliases):\s*(.*)\s*$/)
272      {
273        err "(process_section_encodings()) More than one "
274          . "$marker_aliases records found ($l)"
275        if defined $aliases;
276
277        $aliases = $2;
278      }
279      elsif ($l =~ m/^($marker_ccs):\s*(.*)\s*$/)
280      {
281        err "(process_section_encodings()) More than one "
282          . "$marker_ccs records found ($l)"
283        if defined $ccs;
284
285        $ccs = $2;
286      }
287      else
288      {
289        err "(process_section_encodings()) Can't parse \"$l\"";
290      }
291    }
292 
293    err "(process_section_encodings()) $encoding is defined twice"
294    if (defined $encces{$encoding});
295    err "(process_section_encodings()) ENCODING: field isn't found"
296    if not defined $encoding;
297
298    if (defined $ces)
299    {
300      push @{$cesenc{$ces}}, $encoding;
301      $encces{$encoding} = $ces;
302    }
303   
304    if (defined $ccs)
305    {
306      my @ccs = split / /, $ccs;
307      push @{$ccsenc{$_}}, $encoding foreach (@ccs);
308    }
309    $encalias{$encoding} = $aliases;
310  }
311
312  # Generate cesbi.h header file
313  generate_cesbi_h (\%cesenc, \%encces);
314
315  # Generate encnames.h header file
316  generate_encnames_h (keys %encces);
317
318  # Generate aliasesbi.c file
319  generate_aliasesbi_c (\%encalias);
320 
321  # Generate encoding.aliases file
322  generate_encoding_aliases (\%encalias);
323
324  # Generate ccsbi.h header file
325  generate_ccsbi_h (\%ccsenc);
326
327  # Generate cesbi.c file
328  generate_cesbi_c (\%cesenc);
329
330  # Generate ccsbi.c file
331  my @ccs = keys %ccsenc;
332  generate_ccsbi_c (\@ccs);
333 
334  # Generate ccsnames.h header file
335  generate_ccsnames_h (\%ccsenc);
336
337}
338
339# ==============================================================================
340#
341# Process CES_DEPENDENCIES section.
342#
343# Parameter 1: array reference with section content.
344#
345# ==============================================================================
346sub process_section_cesdeps($)
347{
348  my $sect = $_[0];
349  my $lineidx = 0;
350  my @entry;
351  my $marker_ces      = 'CES';
352  my $marker_used_ces = 'USED_CES';
353  my %cesdeps;
354
355  while (next_entry ($sect, \@entry, \$lineidx))
356  {
357    my $ces;
358    my $used_ces;
359
360    foreach my $l (@entry)
361    {
362      if ($l =~ m/^($marker_ces):\s*(\S*)\s*$/)
363      {
364        err "(process_section_cesdeps()) More than one $marker_ces "
365          . "records found ($l)"
366        if $ces;
367       
368        $ces = $2; 
369      }
370      elsif ($l =~ m/^($marker_used_ces):\s*(.*)\s*$/)
371      {
372        err "(process_section_cesdeps()) More than one $marker_used_ces "
373          . "records found ($l)"
374        if $used_ces;
375
376        $used_ces = $2;
377      }
378      else
379      {
380        err "(process_section_cesdeps()) Can't parse \"$l\"";
381      }
382    }
383 
384    err "(process_section_esdeps()) $ces dependecties are defined twice"
385    if (defined $cesdeps{$ces});
386
387    # Split string
388    my @used_ces = split / /, $used_ces;
389
390    $cesdeps{$ces} = \@used_ces;
391  }
392
393  # Generate cesdeps.h header file
394  generate_cesdeps_h (\%cesdeps);
395}
396
397# ==============================================================================
398#
399# Extract next entry.
400#
401# Parameter 1 (input): array reference with entries;
402# Parameter 2 (output): array reference with entry content;
403# Parameter 3 (input/output): scalar reference with line index to process.
404#
405# Returns 1 is entry was found, 0 if thee is no more entries;
406#
407# ==============================================================================
408sub next_entry($$$)
409{
410  my $entries = $_[0];
411  my $entry   = $_[1];
412  my $idx     = $_[2];
413  my $marker_entry = 'ENTRY';
414  my $marker_entry_end = 'ENTRY END';
415  my $entry_flag = 0;
416
417  return 0 if not defined ${$entries}[${$idx}];
418
419  undef @{$entry};
420
421  for (; my $l = ${$entries}[${$idx}++];)
422  {
423    # Skip comments and empty lines
424    next if $l =~ m/^#.*$/ or $l =~ m/^\s*$/;
425   
426    if ($l =~ m/^$marker_entry$/)
427    {
428      err "(next_entry()) $marker_entry marker appears twice"
429      if ($entry_flag == 1);
430      $entry_flag = 1;
431      $l = ${$entries}[${$idx}++]
432    }
433    else
434    {
435      # Generate error if line isn't entry begin marker
436      err "(next_entry()) Unexpected marker: \"$l\". ${marker_entry} "
437        . "is expected."
438      if ($entry_flag == 0)
439    }
440       
441    last if $l =~ m/^$marker_entry_end$/;
442
443    push @{$entry}, $l;
444  }
445
446  return 1;
447}
448
449# ==============================================================================
450#
451# Generate cesbi.h file.
452#
453# Parameter 1 (input): hash reference with keys = CES Converters names and
454# values = array references with list of supported encodings.
455# Parameter 2 (input): hash reference with keys = encodings names and
456# values = CES converter names.
457#
458# ==============================================================================
459sub generate_cesbi_h($$)
460{
461  my %cesenc = %{$_[0]};
462  my %encces = %{$_[1]};
463  my @ces = sort keys %cesenc;
464 
465  print "Debug: create \"cesbi.h\" file.\n" if $verbose;
466  open (CESBI_H, '>', "cesbi.h")
467  or err "Can't create \"cesbi.h\" file for writing.\nSystem error message: $!.\n";
468
469  print CESBI_H "$comment_automatic\n\n";
470  print CESBI_H "#ifndef __CESBI_H__\n";
471  print CESBI_H "#define __CESBI_H__\n\n";
472  print CESBI_H "#include <newlib.h>\n";
473  print CESBI_H "#include <_ansi.h>\n";
474  print CESBI_H "#include \"../lib/encnames.h\"\n";
475  print CESBI_H "#include \"../lib/ucsconv.h\"\n\n";
476  print CESBI_H "/*\n";
477  print CESBI_H " * Enable CES converter if correspondent encoding is requested.\n";
478  print CESBI_H " * Defining ${macro_to_ucs_ces}XXX macro or ${macro_from_ucs_ces}XXX\n";
479  print CESBI_H " * macro is needed to enable \"XXX encoding -> UCS\" or \"UCS -> XXX encoding\"\n";
480  print CESBI_H " * part of UCS-based CES converter.\n";
481  print CESBI_H " */\n";
482   
483  foreach my $ces (@ces)
484  {
485    my @encs = sort @{$cesenc{$ces}};
486    foreach my $encoding (@encs)
487    {
488      print CESBI_H $encoding eq $encs[0] ? "#if " : " || ";
489      print CESBI_H "defined ($macro_from_enc\U$encoding)";
490      print CESBI_H " \\" if $encoding ne $encs[$#encs];
491      print CESBI_H "\n";
492    }
493    print CESBI_H "#  define $macro_to_ucs_ces\U$ces\n";
494    print CESBI_H "#endif\n";
495   
496    foreach my $encoding (@encs)
497    {
498      print CESBI_H $encoding eq $encs[0] ? "#if " : " || ";
499      print CESBI_H "defined ($macro_to_enc\U$encoding)";
500      print CESBI_H " \\" if $encoding ne $encs[$#encs];
501      print CESBI_H "\n";
502    }
503    print CESBI_H "#  define $macro_from_ucs_ces\U$ces\n";
504    print CESBI_H "#endif\n\n";
505  }
506 
507  print CESBI_H "/*\n";
508  print CESBI_H " * Some encodings require another encodings to be enabled.\n";
509  print CESBI_H " * These dependencies are handled in cesdeps.h header file.\n";
510  print CESBI_H " */\n";
511  print CESBI_H "#include \"cesdeps.h\"\n\n";
512
513  print CESBI_H "/*\n";
514  print CESBI_H " * NLS uses iconv's capabilities and require one of encodings\n";
515  print CESBI_H " * to be enabled for internal wchar_t representation.\n";
516  print CESBI_H " */\n";
517  print CESBI_H "#include \"../lib/iconvnls.h\"\n\n";
518
519  print CESBI_H "/*\n";
520  print CESBI_H " * Forward declarations of CES converter handlers.\n";
521  print CESBI_H " * These handlers are actually defined in correspondent CES converter files.\n";
522  print CESBI_H " */\n";
523
524  foreach my $ces (@ces)
525  {
526    print CESBI_H "#ifdef $macro_to_ucs_ces\U$ces\n";
527    print CESBI_H "extern const iconv_to_ucs_ces_handlers_t\n";
528    print CESBI_H "$var_to_ucs_handlers$ces;\n";
529    print CESBI_H "#endif\n";
530
531    print CESBI_H "#ifdef $macro_from_ucs_ces\U$ces\n";
532    print CESBI_H "extern const iconv_from_ucs_ces_handlers_t\n";
533    print CESBI_H "$var_from_ucs_handlers$ces;\n";
534    print CESBI_H "#endif\n\n";
535  }
536
537  print CESBI_H "#endif /* !__CESBI_H__ */\n\n";
538  close CESBI_H or err "Error while closing cesbi.h file.";
539}
540
541# ==============================================================================
542#
543# Generate encnames.h header file.
544#
545# Parameters: array of supported encodings.
546#
547# ==============================================================================
548sub generate_encnames_h(@)
549{
550  print "Debug: create \"../lib/encnames.h\" file.\n" if $verbose;
551  open (ENCNAMES_H, '>', "../lib/encnames.h")
552  or err "Can't create \"../lib/encnames.h\" file for writing.\nSystem error message: $!.\n";
553
554  print ENCNAMES_H "$comment_automatic\n\n";
555  print ENCNAMES_H "#ifndef __ENCNAMES_H__\n";
556  print ENCNAMES_H "#define __ENCNAMES_H__\n\n";
557
558  print ENCNAMES_H "/*\n";
559  print ENCNAMES_H " * Encodings name macros.\n";
560  print ENCNAMES_H " */\n";
561 
562  foreach my $enc (sort @_)
563  {
564    print ENCNAMES_H "#define $macro_enc_name\U$enc\E \"$enc\"\n";
565  }
566
567  print ENCNAMES_H "\n#endif /* !__ENCNAMES_H__ */\n\n";
568  close ENCNAMES_H or err "Error while closing ../lib/encnames.h file.";
569}
570
571# ==============================================================================
572#
573# Generate aliasesbi.c C source file.
574#
575# Parameters: hash reference with keys = encodings and values = aliases string.
576#
577# ==============================================================================
578sub generate_aliasesbi_c($)
579{
580  print "Debug: create \"../lib/aliasesbi.c\" file.\n" if $verbose;
581  open (ALIASESBI_C, '>', "../lib/aliasesbi.c")
582  or err "Can't create \"../lib/aliasesbi.c\" file for writing.\nSystem error message: $!.\n";
583
584  print ALIASESBI_C "$comment_automatic\n\n";
585  print ALIASESBI_C "#include <_ansi.h>\n";
586  print ALIASESBI_C "#include \"encnames.h\"\n\n";
587  print ALIASESBI_C "const char *\n";
588  print ALIASESBI_C "$var_aliases =\n";
589  print ALIASESBI_C "{\n";
590
591  foreach my $enc (sort keys %{$_[0]})
592  {
593    print ALIASESBI_C "#if defined ($macro_from_enc\U$enc) \\\n";
594    print ALIASESBI_C " || defined ($macro_to_enc\U$enc)\n";
595    print ALIASESBI_C "  $macro_enc_name\U$enc\E";
596    print ALIASESBI_C " \" ${$_[0]}{$enc}\\n\"" if defined ${$_[0]}{$enc};
597    print ALIASESBI_C "\n";
598    print ALIASESBI_C "#endif\n";
599  }
600  print ALIASESBI_C "  \"\"\n";
601  print ALIASESBI_C "};\n\n";
602 
603  close ALIASESBI_C or err "Error while closing ../lib/aliasesbi.c file.";
604}
605
606# ==============================================================================
607#
608# Generate encoding.aliases file.
609#
610# Parameter 1: hash reference with keys = encodings and values = aliases string.
611#
612# ==============================================================================
613sub generate_encoding_aliases($)
614{
615  print "Debug: create \"../encoding.aliases\" file.\n" if $verbose;
616  open (ALIASES, '>', "../encoding.aliases")
617  or err "Can't create \"../encoding.aliases\" file for writing.\nSystem error message: $!.\n";
618
619  print ALIASES "#\n# This file was automatically generated. Don't edit.\n#\n\n";
620
621  foreach my $enc (sort keys %{$_[0]})
622  {
623    print ALIASES "$enc";
624    print ALIASES " ${$_[0]}{$enc}" if defined ${$_[0]}{$enc};
625    print ALIASES "\n";
626  }
627 
628  print ALIASES "\n";
629 
630  close ALIASES or err "Error while closing ./encoding.aliases file.";
631}
632
633# ==============================================================================
634#
635# Generate cesdeps.h header file.
636#
637# Parameter 1: hash reference with keys = CES converters and values = references
638# to arrays with list of CES converters which are needed by that CES converter
639# (defined by key).
640#
641# ==============================================================================
642sub generate_cesdeps_h($)
643{
644  my %cesdeps = %{$_[0]};
645 
646  print "Debug: create \"cesdeps.h\" file.\n" if $verbose;
647  open (CESDEPS_H, '>', "cesdeps.h")
648  or err "Can't create \"cesdeps.h\" file for writing.\nSystem error message: $!.\n";
649
650  print CESDEPS_H "$comment_automatic\n\n";
651  print CESDEPS_H "#ifndef __CESDEPS_H__\n";
652  print CESDEPS_H "#define __CESDEPS_H__\n\n";
653
654  print CESDEPS_H "/*\n";
655  print CESDEPS_H " * Some CES converters use another CES converters and the following\n";
656  print CESDEPS_H " * is such dependencies description.\n";
657  print CESDEPS_H " */\n";
658 
659  foreach my $ces (sort keys %cesdeps)
660  {
661    my @deps = sort @{$cesdeps{$ces}};
662
663    print CESDEPS_H "#ifdef $macro_to_ucs_ces\U$ces\n";
664   
665    foreach my $dep (@deps)
666    {
667      print CESDEPS_H "#  ifndef $macro_to_ucs_ces\U$dep\n";
668      print CESDEPS_H "#    define $macro_to_ucs_ces\U$dep\n";
669      print CESDEPS_H "#  endif\n";
670    }
671    print CESDEPS_H "#endif\n";
672   
673    print CESDEPS_H "#ifdef $macro_from_ucs_ces\U$ces\n";
674    foreach my $dep (@deps)
675    {
676      print CESDEPS_H "#  ifndef $macro_from_ucs_ces\U$dep\n";
677      print CESDEPS_H "#    define $macro_from_ucs_ces\U$dep\n";
678      print CESDEPS_H "#  endif\n";
679    }
680    print CESDEPS_H "#endif\n";
681  }
682
683  print CESDEPS_H "\n#endif /* !__CESDEPS_H__ */\n\n";
684  close CESDEPS_H or err "Error while closing cesdeps.h file.";
685}
686
687# ==============================================================================
688#
689# Generate ccsbi.h file.
690#
691# Parameter 1 (input): hash reference with keys = CCS tables names and
692# values = array references with list of encodings which need this CCS table.
693#
694# ==============================================================================
695sub generate_ccsbi_h($)
696{
697  my %ccsenc = %{$_[0]};
698  my @ccs = sort keys %ccsenc;
699 
700  print "Debug: create \"../ccs/ccsbi.h\" file.\n" if $verbose;
701  open (CCSBI_H, '>', "../ccs/ccsbi.h")
702  or err "Can't create \"../ccs/ccsbi.h\" file for writing.\nSystem error message: $!.\n";
703
704  print CCSBI_H "$comment_automatic\n\n";
705  print CCSBI_H "#ifndef __CCSBI_H__\n";
706  print CCSBI_H "#define __CCSBI_H__\n\n";
707  print CCSBI_H "#include <newlib.h>\n";
708  print CCSBI_H "#include <_ansi.h>\n";
709  print CCSBI_H "#include \"ccs.h\"\n\n";
710  print CCSBI_H "/*\n";
711  print CCSBI_H " * Enable CCS tables if encoding needs them.\n";
712  print CCSBI_H " * Defining ${macro_to_ucs_ccs}XXX macro or ${macro_from_ucs_ccs}XXX\n";
713  print CCSBI_H " * macro is needed to enable \"XXX encoding -> UCS\" or \"UCS -> XXX encoding\"\n";
714  print CCSBI_H " * part of CCS table.\n";
715  print CCSBI_H " * CCS tables aren't linked if Newlib was configuted to use external CCS tables.\n";
716  print CCSBI_H " */\n";
717 
718  print CCSBI_H "#ifndef _ICONV_ENABLE_EXTERNAL_CCS\n\n";
719
720  foreach my $ccs (@ccs)
721  {
722    my @encs = sort @{$ccsenc{$ccs}};
723    foreach my $encoding (@encs)
724    {
725      print CCSBI_H $encoding eq $encs[0] ? "#if " : " || ";
726      print CCSBI_H "defined ($macro_from_enc\U$encoding)";
727      print CCSBI_H " \\" if $encoding ne $encs[$#encs];
728      print CCSBI_H "\n";
729    }
730    print CCSBI_H "#  define $macro_to_ucs_ccs\U$ccs\n";
731    print CCSBI_H "#endif\n";
732   
733    foreach my $encoding (@encs)
734    {
735      print CCSBI_H $encoding eq $encs[0] ? "#if " : " || ";
736      print CCSBI_H "defined ($macro_to_enc\U$encoding)";
737      print CCSBI_H " \\" if $encoding ne $encs[$#encs];
738      print CCSBI_H "\n";
739    }
740    print CCSBI_H "#  define $macro_from_ucs_ccs\U$ccs\n";
741    print CCSBI_H "#endif\n\n";
742  }
743
744  print CCSBI_H "/*\n";
745  print CCSBI_H " * CCS table description structures forward declarations.\n";
746  print CCSBI_H " */\n";
747
748  foreach my $ccs (@ccs)
749  {
750    print CCSBI_H "#if defined ($macro_to_ucs_ccs\U$ccs) \\\n";
751    print CCSBI_H " || defined ($macro_from_ucs_ccs\U$ccs)\n";
752    print CCSBI_H "extern const iconv_ccs_t\n";
753    print CCSBI_H "$var_ccs$ccs;\n";
754    print CCSBI_H "#endif\n";
755  }
756
757  print CCSBI_H "\n#endif /* !_ICONV_ENABLE_EXTERNAL_CCS */\n\n";
758  print CCSBI_H "\n#endif /* __CCSBI_H__ */\n\n";
759  close CCSBI_H or err "Error while closing ../ccs/ccsbi.h file.";
760}
761
762# ==============================================================================
763#
764# Generate cesbi.c file.
765#
766# Parameter 1 (input): hash reference with keys = CES Converters names and
767# values = array references with list of supported encodings.
768#
769# ==============================================================================
770sub generate_cesbi_c($)
771{
772  my %cesenc = %{$_[0]};
773  my @ces = sort keys %cesenc;
774
775  print "Debug: create \"cesbi.c\" file.\n" if $verbose;
776  open (CESBI_C, '>', "cesbi.c")
777  or err "Can't create \"cesbi.c\" file for writing.\nSystem error message: $!.\n";
778
779  print CESBI_C "$comment_automatic\n\n";
780  print CESBI_C "#include <_ansi.h>\n";
781  print CESBI_C "#include <newlib.h>\n";
782  print CESBI_C "#include \"../lib/ucsconv.h\"\n";
783  print CESBI_C "#include \"cesbi.h\"\n\n";
784  print CESBI_C "/*\n";
785  print CESBI_C " * Each CES converter provides the list of supported encodings.\n";
786  print CESBI_C " */\n";
787
788  foreach my $ces (@ces)
789  {
790    print CESBI_C "#if defined ($macro_to_ucs_ces\U$ces) \\\n";
791    print CESBI_C " || defined ($macro_from_ucs_ces\U$ces)\n";
792    print CESBI_C "static const char *\n";
793    print CESBI_C "$var_ces_names${ces}\[] =\n";
794    print CESBI_C "{\n";
795    my @encodings = sort @{$cesenc{$ces}};
796    foreach my $encoding (@encodings)
797    {
798      print CESBI_C "# if defined ($macro_from_enc\U$encoding) \\\n";
799      print CESBI_C "  || defined ($macro_to_enc\U$encoding)\n";
800      print CESBI_C "  $macro_enc_name\U$encoding,\n";
801      print CESBI_C "#endif\n";
802    }
803    print CESBI_C "  NULL\n";
804    print CESBI_C "};\n";
805    print CESBI_C "#endif\n\n";
806  }
807
808  print CESBI_C "/*\n";
809  print CESBI_C " * The following structure contains the list of \"to UCS\" linked-in CES converters.\n";
810  print CESBI_C " */\n";
811  print CESBI_C "const iconv_to_ucs_ces_t\n";
812  print CESBI_C "_iconv_to_ucs_ces[] =\n";
813  print CESBI_C "{\n";
814 
815  foreach my $ces (@ces)
816  {
817    print CESBI_C "#ifdef $macro_to_ucs_ces\U$ces\n";
818    print CESBI_C "  {(const char **)$var_ces_names$ces,\n";
819    print CESBI_C "   &$var_to_ucs_handlers$ces},\n";
820    print CESBI_C "#endif\n";
821  }
822  print CESBI_C "  {(const char **)NULL,\n";
823  print CESBI_C "  (iconv_to_ucs_ces_handlers_t *)NULL}\n";
824  print CESBI_C "};\n\n";
825
826  print CESBI_C "/*\n";
827  print CESBI_C " * The following structure contains the list of \"from UCS\" linked-in CES converters.\n";
828  print CESBI_C " */\n";
829  print CESBI_C "const iconv_from_ucs_ces_t\n";
830  print CESBI_C "_iconv_from_ucs_ces[] =\n";
831  print CESBI_C "{\n";
832 
833  foreach my $ces (@ces)
834  {
835    print CESBI_C "#ifdef $macro_from_ucs_ces\U$ces\n";
836    print CESBI_C "  {(const char **)$var_ces_names$ces,\n";
837    print CESBI_C "   &$var_from_ucs_handlers$ces},\n";
838    print CESBI_C "#endif\n";
839  }
840  print CESBI_C "  {(const char **)NULL,\n";
841  print CESBI_C "  (iconv_from_ucs_ces_handlers_t *)NULL}\n";
842  print CESBI_C "};\n";
843
844  close CESBI_C or err "Error while closing cesbi.c file.";
845}
846
847# ==============================================================================
848#
849# Generate ccsbi.c file.
850#
851# Parameter 1 (input): array reference with CCS tables names
852#
853# ==============================================================================
854sub generate_ccsbi_c($)
855{
856  my @ccs = @{$_[0]};
857 
858  print "Debug: create \"../ccs/ccsbi.c\" file.\n" if $verbose;
859  open (CESBI_C, '>', "../ccs/ccsbi.c")
860  or err "Can't create \"../ccs/ccsbi.c\" file for writing.\nSystem error message: $!.\n";
861
862  print CESBI_C "$comment_automatic\n\n";
863  print CESBI_C "#include <_ansi.h>\n";
864  print CESBI_C "#include \"ccsbi.h\"\n\n";
865  print CESBI_C "/*\n";
866  print CESBI_C " * The following array contains the list of built-in CCS tables.\n";
867  print CESBI_C " */\n";
868
869  print CESBI_C "const iconv_ccs_t *\n";
870  print CESBI_C "_iconv_ccs[] =\n";
871  print CESBI_C "{\n";
872
873  foreach my $ccs (@ccs)
874  {
875    print CESBI_C "#if defined ($macro_to_ucs_ccs\U$ccs) \\\n";
876    print CESBI_C " || defined ($macro_from_ucs_ccs\U$ccs)\n";
877    print CESBI_C "  &$var_ccs$ccs,\n";
878    print CESBI_C "#endif\n";
879  }
880  print CESBI_C "  NULL\n";
881  print CESBI_C "};\n";
882
883  close CESBI_C or err "Error while closing ../ccs/ccsbi.c file.";
884}
885
886# ==============================================================================
887#
888# Generate ccsnames.h file.
889#
890# Parameter 1 (input): hash reference with keys = CCS tables names and
891# values = array references with list of encodings which need this CCS table.
892#
893# ==============================================================================
894sub generate_ccsnames_h($)
895{
896  my %ccsenc = %{$_[0]};
897  my @ccs = sort keys %ccsenc;
898 
899  print "Debug: create \"../ccs/ccsnames.h\" file.\n" if $verbose;
900  open (CCSNAMES_H, '>', "../ccs/ccsnames.h")
901  or err "Can't create \"../ccs/ccsnames.h\" file for writing.\nSystem error message: $!.\n";
902
903  print CCSNAMES_H "$comment_automatic\n\n";
904  print CCSNAMES_H "#ifndef __CCSNAMES_H__\n";
905  print CCSNAMES_H "#define __CCSNAMES_H__\n\n";
906  print CCSNAMES_H "#include \"../lib/encnames.h\"\n\n";
907  print CCSNAMES_H "/*\n";
908  print CCSNAMES_H " * CCS tables names macros.\n";
909  print CCSNAMES_H " */\n";
910
911  foreach my $ccs (@ccs)
912  {
913    my @encs = @{$ccsenc{$ccs}};
914    my $flag;
915    foreach my $encoding (@encs)
916    {
917      print CCSNAMES_H "#define $macro_ccs_name\U$ccs ";
918      if ($encoding eq $ccs)
919      {
920        $flag = 1;
921        print CCSNAMES_H "$macro_enc_name\U$encoding\n";
922        last;
923      }
924    }
925    print CCSNAMES_H "\"$ccs\"\n" if !$flag;
926  }
927
928  print CCSNAMES_H "\n#endif /* !__CCSNAMES_H__ */\n\n";
929  close CCSNAMES_H or err "Error while closing ../ccs/ccsnames.h file.";
930}
Note: See TracBrowser for help on using the repository browser.