1#!/usr/bin/env perl
2
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7# This tool is used to prepare a list of valid language subtags from the
8# IANA registry (http://www.iana.org/assignments/language-subtag-registry).
9
10# Run as
11#
12#   perl genLanguageTagList.pl language-subtag-registry > gfxLanguageTagList.cpp
13#
14# where language-subtag-registry is a copy of the IANA registry file.
15
16use strict;
17
18my $timestamp = gmtime();
19print <<__END;
20/* This Source Code Form is subject to the terms of the Mozilla Public
21 * License, v. 2.0. If a copy of the MPL was not distributed with this
22 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
23
24/*
25 * Derived from the IANA language subtag registry by genLanguageTagList.pl.
26 *
27 * Created on $timestamp.
28 *
29 * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
30 */
31
32__END
33
34my $isLanguage = 0;
35
36while (<>) {
37  # strip leading/trailing whitespace, if any
38  chomp;
39  s/^\s+//;
40  s/\s+$//;
41
42  # assume File-Date precedes the actual list;
43  # record the date, and begin assignment to an array of valid tags
44  if (m/^File-Date:\s*(.+)$/) {
45    print "// Based on IANA registry dated $1\n\n";
46    print "static const uint32_t sLanguageTagList[] = {";
47    next;
48  }
49
50  if (m/^%%/) {
51    $isLanguage = 0;
52    next;
53  }
54
55  # we only care about records of type 'language'
56  if (m/^Type:\s*(.+)$/) {
57    $isLanguage = ($1 eq 'language');
58    next;
59  }
60
61  # append the tag to our string, with ";" as a delimiter
62  if ($isLanguage && m/^Subtag:\s*([a-z]{2,3})\s*$/) {
63    my $tagstr = $1;
64    print "\n  TRUETYPE_TAG(",
65      join(",", map { $_ eq " " ? " 0 " : "'" . $_ . "'" } split(//, substr($tagstr . "  ", 0, 4))),
66      "), // ", $tagstr;
67    next;
68  }
69
70  if ($isLanguage && m/^Description:\s*(.+)$/) {
71    print " = $1";
72    $isLanguage = 0; # only print first Description field
73    next;
74  }
75}
76
77# at end of file, terminate our assignment to the array of tags
78print <<__END;
79
80  0x0 // end of language code list
81};
82
83/*
84 * * * * * This file contains MACHINE-GENERATED DATA, do not edit! * * * * *
85 */
86__END
87