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