1*cdf0e10cSrcweir#!/usr/bin/gawk -f
2*cdf0e10cSrcweir# Usage: gawk -f linkermapfile-check.awk *.map *.xml
3*cdf0e10cSrcweir# Order of *.map *.xml is important, otherwise all symbols are reported to be
4*cdf0e10cSrcweir# missing.
5*cdf0e10cSrcweir# Checks if all symbols of all locale data are present in the symbol scoping
6*cdf0e10cSrcweir# linker mapfiles.  Any output indicates a missing symbol, ../localedata.cxx is
7*cdf0e10cSrcweir# grep'ed to indicate the library to which mapfile the symbol should be added.
8*cdf0e10cSrcweir# Author: Eike Rathke <er@openoffice.org>
9*cdf0e10cSrcweir
10*cdf0e10cSrcweirBEGIN {
11*cdf0e10cSrcweir    bAnyMissing = 0
12*cdf0e10cSrcweir    file = ""
13*cdf0e10cSrcweir    nMap = 0
14*cdf0e10cSrcweir    nMaps = 0
15*cdf0e10cSrcweir    nPublics = 0
16*cdf0e10cSrcweir    sPublic[nPublics++] = "getAllCalendars_"
17*cdf0e10cSrcweir    sPublic[nPublics++] = "getAllCurrencies_"
18*cdf0e10cSrcweir    sPublic[nPublics++] = "getAllFormats0_"
19*cdf0e10cSrcweir    bOptional[nPublics] = 1     # getAllFormats1 most times not present
20*cdf0e10cSrcweir    sPublic[nPublics++] = "getAllFormats1_"
21*cdf0e10cSrcweir    sPublic[nPublics++] = "getBreakIteratorRules_"
22*cdf0e10cSrcweir    sPublic[nPublics++] = "getCollationOptions_"
23*cdf0e10cSrcweir    sPublic[nPublics++] = "getCollatorImplementation_"
24*cdf0e10cSrcweir    sPublic[nPublics++] = "getContinuousNumberingLevels_"
25*cdf0e10cSrcweir    sPublic[nPublics++] = "getForbiddenCharacters_"
26*cdf0e10cSrcweir    sPublic[nPublics++] = "getLCInfo_"
27*cdf0e10cSrcweir    sPublic[nPublics++] = "getLocaleItem_"
28*cdf0e10cSrcweir    sPublic[nPublics++] = "getOutlineNumberingLevels_"
29*cdf0e10cSrcweir    sPublic[nPublics++] = "getReservedWords_"
30*cdf0e10cSrcweir    sPublic[nPublics++] = "getSearchOptions_"
31*cdf0e10cSrcweir    sPublic[nPublics++] = "getTransliterations_"
32*cdf0e10cSrcweir    sPublic[nPublics++] = "getIndexAlgorithm_"
33*cdf0e10cSrcweir    sPublic[nPublics++] = "getUnicodeScripts_"
34*cdf0e10cSrcweir    sPublic[nPublics++] = "getFollowPageWords_"
35*cdf0e10cSrcweir}
36*cdf0e10cSrcweir
37*cdf0e10cSrcweirfile != FILENAME {
38*cdf0e10cSrcweir    file = FILENAME
39*cdf0e10cSrcweir    if ( file ~ /\.map$/ )
40*cdf0e10cSrcweir    {
41*cdf0e10cSrcweir        sMapFile[nMaps] = file
42*cdf0e10cSrcweir        nMap = nMaps
43*cdf0e10cSrcweir        ++nMaps
44*cdf0e10cSrcweir    }
45*cdf0e10cSrcweir    else if ( file ~ /\.xml$/ )
46*cdf0e10cSrcweir    {
47*cdf0e10cSrcweir        bOut = 0
48*cdf0e10cSrcweir        n = split( file, arr, /[:\\\/.]/ )
49*cdf0e10cSrcweir        locale = arr[n-1]
50*cdf0e10cSrcweir        for ( i=0; i<nPublics; ++i )
51*cdf0e10cSrcweir        {
52*cdf0e10cSrcweir            symbol = sPublic[i] locale ";"
53*cdf0e10cSrcweir            bFound = 0
54*cdf0e10cSrcweir            for ( j=0; j<nMaps && !bFound; ++j )
55*cdf0e10cSrcweir            {
56*cdf0e10cSrcweir                if ( sSymbol[j,symbol] )
57*cdf0e10cSrcweir                    bFound = 1
58*cdf0e10cSrcweir            }
59*cdf0e10cSrcweir            if ( !bFound && bOptional[i] )
60*cdf0e10cSrcweir            {
61*cdf0e10cSrcweir                print symbol " not present but optional"
62*cdf0e10cSrcweir                bFound = 1
63*cdf0e10cSrcweir            }
64*cdf0e10cSrcweir            if ( !bFound )
65*cdf0e10cSrcweir            {
66*cdf0e10cSrcweir                if ( !bOut )
67*cdf0e10cSrcweir                {
68*cdf0e10cSrcweir                    search = "\"" locale "\""
69*cdf0e10cSrcweir                    while ( !bOut && (getline <"../localedata.cxx") > 0 )
70*cdf0e10cSrcweir                    {
71*cdf0e10cSrcweir                        if ( $0 ~ search )
72*cdf0e10cSrcweir                        {
73*cdf0e10cSrcweir                            bOut = 1
74*cdf0e10cSrcweir                            print "../localedata.cxx says this should go into: " $0
75*cdf0e10cSrcweir                        }
76*cdf0e10cSrcweir                    }
77*cdf0e10cSrcweir                    close( "../localedata.cxx" )
78*cdf0e10cSrcweir                    if ( !bOut )
79*cdf0e10cSrcweir                        print "../localedata.cxx doesn't indicate to which lib this belongs to:"
80*cdf0e10cSrcweir                    bOut = 1
81*cdf0e10cSrcweir                }
82*cdf0e10cSrcweir                print symbol
83*cdf0e10cSrcweir            }
84*cdf0e10cSrcweir        }
85*cdf0e10cSrcweir        if ( bOut)
86*cdf0e10cSrcweir        {
87*cdf0e10cSrcweir            printf("\n")
88*cdf0e10cSrcweir            bAnyMissing = 1
89*cdf0e10cSrcweir        }
90*cdf0e10cSrcweir        nextfile
91*cdf0e10cSrcweir    }
92*cdf0e10cSrcweir    else
93*cdf0e10cSrcweir        nextfile
94*cdf0e10cSrcweir}
95*cdf0e10cSrcweir
96*cdf0e10cSrcweir# only reached if .map file encountered, read in symbols
97*cdf0e10cSrcweir{
98*cdf0e10cSrcweir    if ( $1 ~ /;$/ )
99*cdf0e10cSrcweir        sSymbol[nMap,$1] = 1
100*cdf0e10cSrcweir}
101*cdf0e10cSrcweir
102*cdf0e10cSrcweirEND {
103*cdf0e10cSrcweir    if ( !bAnyMissing )
104*cdf0e10cSrcweir        print "All good." >>"/dev/stderr"
105*cdf0e10cSrcweir}
106