gperf-3.2.1/0000775000000000000000000000000014776761171006352 5gperf-3.2.1/doc/0000775000000000000000000000000014776761171007117 5gperf-3.2.1/doc/gperf_6.html0000664000000000000000000005271714776761154011272 Perfect Hash Function Generator - 5 Invoking gperf Go to the first, previous, next, last section, table of contents.


5 Invoking gperf

There are many options to gperf. They were added to make the program more convenient for use with real applications. “On-line” help is readily available via the ‘--help’ option. Here is the complete list of options.

5.1 Specifying the Location of the Output File

‘--output-file=file
Allows you to specify the name of the file to which the output is written to.

The results are written to standard output if no output file is specified or if it is ‘-’.

5.2 Options that affect Interpretation of the Input File

These options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-e keyword-delimiter-list
‘--delimiters=keyword-delimiter-list
Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. One useful trick is to use -e'TAB', where TAB is the literal tab character.
‘-t’
‘--struct-type’
Allows you to include a struct type declaration for generated code. Any text before a pair of consecutive ‘%%’ is considered part of the type declaration. Keywords and additional fields may follow this, one group of fields per line. A set of examples for generating perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2, Modula 3 and JavaScript reserved words are distributed with this release.
‘--ignore-case’
Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. This option is therefore not suitable if a properly internationalized or locale aware case mapping should be used. (For example, in a Turkish locale, the upper case equivalent of the lowercase ASCII letter ‘i’ is the non-ASCII character ‘capital i with dot above’.) For this case, it is better to apply an uppercase or lowercase conversion on the string before passing it to the gperf generated function.

5.3 Options to specify the Language for the Output Code

These options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-L generated-language-name
‘--language=generated-language-name
Instructs gperf to generate code in the language specified by the option's argument. Languages handled are currently:
‘KR-C’
Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’.
‘C’
Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you #define const to empty for compilers which don't know about this keyword.
‘ANSI-C’
ANSI C. This language is understood by ANSI C compilers and C++ compilers.
‘C++’
C++. This language is understood by C++ compilers.
The default is ANSI-C.
‘-a’
This option is supported for compatibility with previous releases of gperf. It does not do anything.
‘-g’
This option is supported for compatibility with previous releases of gperf. It does not do anything.

5.4 Options for fine tuning Details in the Output Code

Most of these options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-K slot-name
‘--slot-name=slot-name
This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied struct.
‘-F initializers
‘--initializer-suffix=initializers
This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following slot-name in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following slot-name.
‘-H hash-function-name
‘--hash-function-name=hash-function-name
Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file.
‘-N lookup-function-name
‘--lookup-function-name=lookup-function-name
Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application.
‘-Z class-name
‘--class-name=class-name
This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is Perfect_Hash.
‘-7’
‘--seven-bit’
This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions isalnum and isgraph do not guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.) This was the default in versions of gperf earlier than 2.7; now the default is to support 8-bit and multibyte characters.
‘-l’
‘--compare-lengths’
Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (see section 4.3 Use of NUL bytes). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via strcmp. However, using ‘-l’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table.
‘-c’
‘--compare-strncmp’
Generates C code that uses the strncmp function to perform string comparisons. The default action is to use strcmp.
‘-C’
‘--readonly-tables’
Makes the contents of all generated lookup tables constant, i.e., “readonly”. Many compilers can generate more efficient code for this by putting the tables in readonly memory.
‘-E’
‘--enum’
Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark <jjc@ai.mit.edu>.
‘-I’
‘--includes’
Include the necessary system include file, <string.h>, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code.
‘-G’
‘--global-table’
Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior).
‘-P’
‘--pic’
Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + o, where o is the offset. The string pool name can be changed through the option ‘--string-pool-name’.
‘-Q string-pool-name
‘--string-pool-name=string-pool-name
Allows you to specify the name of the generated string pool created by option ‘-P’. The default name is ‘stringpool’. This option permits the use of two hash tables in the same file, with ‘-P’ and even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘--null-strings’
Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as option ‘-P’), at the expense of one more test-and-branch instruction at run time.
‘--constants-prefix=prefix
Allows you to specify a prefix for the constants TOTAL_KEYWORDS, MIN_WORD_LENGTH, MAX_WORD_LENGTH, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘-W hash-table-array-name
‘--word-array-name=hash-table-array-name
Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘--length-table-name=length-table-array-name
Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘-S total-switch-statements
‘--switch=total-switch-statements
Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each switch, etc. This is useful since many C compilers cannot correctly generate code for large switch statements. This option was inspired in part by Keith Bostic's original C program.
‘-T’
‘--omit-struct-type’
Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere.
‘-p’
This option is supported for compatibility with previous releases of gperf. It does not do anything.

5.5 Options for changing the Algorithms employed by gperf

‘-k selected-byte-positions
‘--key-positions=selected-byte-positions
Allows selection of the byte positions used in the keywords' hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, e.g., ‘-k 9,4,13,14’; ranges may be used, e.g., ‘-k 2-7’; and positions may occur in any order. Furthermore, the wildcard '*' causes the generated hash function to consider all byte positions in each keyword, whereas '$' instructs the hash function to use the “final byte” of a keyword (this is the only way to use a byte position greater than 255, incidentally). For instance, the option ‘-k 1,2,4,6-10,'$'’ generates a hash function that considers positions 1,2,4,6,7,8,9,10, plus the last byte in each keyword (which may be at a different position for each keyword, obviously). Keywords with length less than the indicated byte positions work properly, since selected byte positions exceeding the keyword length are simply not referenced in the hash function. This option is not normally needed since version 2.8 of gperf; the default byte positions are computed depending on the keyword set, through a search that minimizes the number of byte positions.
‘-D’
‘--duplicates’
Handle keywords whose selected byte sets hash to duplicate values. Duplicate hash values can occur if a set of keywords has the same names, but possesses different attributes, or if the selected byte positions are not well chosen. With the -D option gperf treats all these keywords as part of an equivalence class and generates a perfect hash function with multiple comparisons for duplicate keywords. It is up to you to completely disambiguate the keywords by modifying the generated C code. However, gperf helps you out by organizing the output. Using this option usually means that the generated hash function is no longer perfect. On the other hand, it permits gperf to work on keyword sets that it otherwise could not handle.
‘-m iterations
‘--multiple-iterations=iterations
Perform multiple choices of the ‘-i’ and ‘-j’ values, and choose the best results. This increases the running time by a factor of iterations but does a good job minimizing the generated table size.
‘-i initial-value
‘--initial-asso=initial-value
Provides an initial value for the associate values array. Default is 0. Increasing the initial value helps inflate the final table size, possibly leading to more time efficient keyword lookups. Note that this option is not particularly useful when ‘-S’ (or, equivalently, ‘%switch’) is used. Also, ‘-i’ is overridden when the ‘-r’ option is used.
‘-j jump-value
‘--jump=jump-value
Affects the “jump value”, i.e., how far to advance the associated byte value upon collisions. Jump-value is rounded up to an odd number, the default is 5. If the jump-value is 0 gperf jumps by random amounts.
‘-n’
‘--no-strlen’
Instructs the generator not to include the length of a keyword when computing its hash value. This may save a few assembly instructions in the generated lookup table.
‘-r’
‘--random’
Utilizes randomness to initialize the associated values table. This frequently generates solutions faster than using deterministic initialization (which starts all associated values at 0). Furthermore, using the randomization option generally increases the size of the table.
‘-s size-multiple
‘--size-multiple=size-multiple
Affects the size of the generated hash table. The numeric argument for this option indicates “how many times larger or smaller” the maximum associated value range should be, in relationship to the number of keywords. It can be written as an integer, a floating-point number or a fraction. For example, a value of 3 means “allow the maximum associated value to be about 3 times larger than the number of input keywords”. Conversely, a value of 1/3 means “allow the maximum associated value to be about 3 times smaller than the number of input keywords”. Values smaller than 1 are useful for limiting the overall size of the generated hash table, though the option ‘-m’ is better at this purpose. If `generate switch' option ‘-S’ (or, equivalently, ‘%switch’) is not enabled, the maximum associated value influences the static array table size, and a larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. The default value is 1, thus the default maximum associated value is about the same size as the number of keywords. (For efficiency, the maximum associated value is always rounded up to a power of 2.) The actual table size may vary somewhat, since this technique is essentially a heuristic.

5.6 Informative Output

‘-h’
‘--help’
Prints a short summary on the meaning of each program option. Aborts further program execution.
‘-v’
‘--version’
Prints out the current version number.
‘-d’
‘--debug’
Enables the debugging option. This produces verbose diagnostics to “standard error” when gperf is executing. It is useful both for maintaining the program and for determining whether a given set of options is actually speeding up the search for a solution. Some useful information is dumped at the end of the program when the ‘-d’ option is enabled.


Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf.dvi0000664000000000000000000042044014776761171010652 ; TeX output 2025.04.13:181233G|papersize=8.5in,11inQNj cmbx12QUser'sqGuidetoT߆Tj cmtt12TgperfQ3.2  p6K`y 3 cmr10ThefGNUP!erfectHashFeunctionGenerator ' Editionf3.2,28OctobMer2024.эcNff cmbx12cDouglasffC.SchmidtBrunoffHaible*33pGCop!yrightcf?!", 3 cmsy10 @1989-2024fFereeSoft!warefFoundation,Inc.33GP!ermission޲isޱgrantedtoޱmakeanddistributeޱverbatimcopiesofޱthismanualޱprovidedthe 33Gcop!yrightfnoticeandthispMermissionnoticearepreserv!edonallcopies.GP!ermission.is-grantedto-copyanddistribute-moMdi edversionsof-thismanual-undertheGconditions8forv!erbatimcopying,providedalsothatthesectionentitled8\GNU8)GeneralGPublic7License"isincluded7exactlyasintheoriginal,Mandpro!videdthattheen!tireresultingGderiv!edfworkisdistributedunderthetermsofapMermissionnoticeidenticaltothisone.GP!ermissionrisgrantedtoqcopyanddistributetranslationsofthisqmanualintoanotherlan-Gguage,under}MtheabMo!ve}Mconditionsfor}Nmodi edv!ersions,exceptthat}NthesectionentitledG\GNU=General=Public=License"ma!ybMeincludedinatranslationappro!ved=bytheauthorGinsteadfofintheoriginalEnglish.6e133͍GZNG cmbx12ZGNUzGENERALPUBLICLICENSEHjVeersionf3,29June2007龍.Cop!yrightcf @2007fFereeSoft!warefFoundation,Inc.7tothewholeofthew!ork,=andallitsparts,=nregardless of ho!wtheyarepac!kdDaged.-ThisLicensegiv!esnopMermissiontolicense=nthew!orkinanyotherwaye,butitdoMesnotinvdDalidatesuchpMermissionifyouhave=nseparatelyfreceiv!edit.-d.=nIfnthenw!orkhasin!teractivenuserinterfaces,eachmustndisplayAppropriatenLegal=nNotices;ho!wever,FifRtheProgramhasin!teractiveRinterfacesthatdonotdisplay=nAppropriatefLegalNotices,y!ourworkneednotmakethemdoso.J֍'AScompilationofaco!veredworkwithotherseparateandindepMendentworks,which'areLnotb!ytheirnatureextensionsofthecoveredwork,u|andwhicharenotcombined'withUitUsuc!hastoformalargerprogram,finoronav!olumeofastorageordistribution'medium,N isPcalledan\aggregate"ifOthecompilationanditsresultingcop!yrightPare'notusedtolimittheaccessorlegalrigh!tsofthecompilation'susersbMey!ondwhatthe'individual2w!orkspMermit.InclusionofacoveredworkinanaggregatedoMesnotcause'thisfLicensetoapplytotheotherpartsoftheaggregate.?-6.'Con!veyingfNon-SourceFeorms.'Yeouvma!yconveyvacoveredworkinvobjectcoMdeformunderthetermsofsections4and'5,pro!videdthatyoualsoconveythemachine-readableCorrespMondingSourceunder'theftermsofthisLicense,inoneofthesew!ays:8cGGNUfGENERALPUBLICLICENSEQV533͍-a.=nCon!veyutheobjectcoMdein,orem!bodiedin,aph!ysicalproduct(includingaph!ys- 33=nical@#distribution@"medium),faccompaniedb!ytheCorrespMondingSource xedona=ndurablefph!ysicalmediumcustomarilyusedforsoftwareinterchange.-b.=nCon!veywthewobjectcoMdein,orem!bodiedwin,aphysicalwproMduct(includingaph!ysi-=ncaldistributionmedium),accompaniedb!yawritteno er,vdDalidforatleastthree=ny!ears!andvdDalidfor!aslongasyouo ersparepartsor!customersuppMortforthat=nproMductmodel,qtogiv!eanyonewhopMossessestheobjectcodeeither(1)acop!yof=nthe)CorrespMonding(Sourceforallthesoft!warein)theproMductthatisco!veredby)this=nLicense,6onadurableph!ysicalmediumcustomarilyusedforsoft!wareinterchange,=nfor9_apricenomorethany!our9^reasonablecostofphysicallypMerformingthiscon-=nv!eyingofsource,or(2)accesstocopytheCorrespMondingSourcefromanetwork=nserv!erfatnocharge..KMc.=nCon!veyindividualcopiesoftheobjectcoMdewithacop!yofthewritteno erto=npro!videjthejCorrespMondingSource.*ThisalternativeisallowedjonlyoMccasionally=nand+noncommerciallye,andonlyify!oureceivedtheobject*coMdewithsuchano er,=ninfaccordwithsubsection6b.-d.=nCon!veyRtheRobjectcoMdeb!yo eringaccessfromadesignatedplace(gratisorfor=nac!harge),ando erequivdDalentaccesstotheCorrespMondingSourceinthesame=nw!aypthroughthesameoplaceatnofurtherc!harge.6Yeouneednotrequirerecipien!ts=ntocop!ytheCorrespMondingSourcealongwiththeobjectcoMde.Iftheplaceto=ncop!y%the$objectcoMdeisanet!work%server,theCorrespMonding%Sourcema!ybMeon=naVdi eren!tserver(opMeratedbyyouorVathirdparty)thatsuppMortsequivdDalent=ncop!yingfacilities,+providedyoumaintaincleardirectionsnexttotheobjectcoMde=nsa!ying8where8to ndtheCorrespMondingSource.Regardlessofwhatserv!erhosts=ntheCorrespMondingSource,ty!ouremainobligatedtoensurethatitisa!vdDailablefor=nasflongasneededtosatisfytheserequiremen!ts..KMe.=nCon!veytheobjectcoMdeusingpMeer-to-peertransmission,xpro!videdyouinformother=npMeerswheretheobjectcodeandCorrespondingSourceofthew!orkarebMeingo ered=ntofthegeneralpublicatnoc!hargeundersubsection6d.΍'A$separable$0pMortion$/oftheobjectcoMde,CwhosesourcecoMdeisexcludedfromtheCor-'respMondingSourceasaSystemLibrarye,neednotbeincludedincon!veyingtheobject'coMdefw!ork.'A\UserProMduct"iseither(1)a\consumerproMduct",Ռwhic!hmeansanytangiblepMer-'sonalpropMert!ywhichisnormallyusedforpMersonal, familye,orhouseholdpurpMoses,or'(2)an!ythingdesignedorsoldforincorpMorationin!toadw!elling. Indeterminingwhether'axproMductwisaconsumerproMduct,doubtfulcasesshallbMeresolv!edinfa!vorofxcoverage.'FeoraparticularproMductreceiv!edbyaparticularuser,X\normallyused"referstoa't!ypical'orcommon&useofthatclassofproMduct,Vregardlessofthestatusofthepar-'ticular7useror7ofthew!ay7inwhich7theparticularuseractuallyuses,[orexpMectsoris'expMectedLtoMuse,theproduct.RABproductLisaconsumerproMductregardlessofwhether'theproMducthassubstan!tialcommercial, industrialornon-consumeruses, unlesssuc!h'usesfrepresen!ttheonlysigni cantmoMdeofuseoftheproduct.'\InstallationwInformation"wforaUserProMductmeansan!ymethoMds,procedures,autho-'rization`k!eys,-orother_informationrequiredtoinstallandexecutemoMdi edv!ersionsofa'co!vered|workinthatUserProMductfromamodi edv!ersionofitsCorrespondingSource.IMGGNUfGENERALPUBLICLICENSEQV633͍'Theinformationm!ustsucetoensurethatthecon!tinuedfunctioningofthemoMdi ed 33'objectcoMdeisinnocaseprev!entedorin!terferedwithsolelybMecausemodi cationhas'bMeenfmade. 'Ify!ouconveyanobjectcoMdew!orkunderthissectionin,Norwith,orspMeci callyfor'use@in,6aAUserProMduct,andtheAcon!veying@oMccursaspartofatransactioninwhic!h'theJrigh!tofJpMossessionanduseoftheUserProMductistransferredtotherecipien!tin'pMerpetuit!y6;orfora xedterm(regardlessofhowthetransactionischaracterized),'the&CorrespMondingSource'con!veyed&underthissectionm!ustbe'accompaniedb!ythe'Installation1Information.H=Butthisrequiremen!tdoMesnotapplyif0neitheryounorany'third}Wpart!yretainsthe}VabilitytoinstallmoMdi edobjectcodeon}VtheUserProduct(for'example,fthew!orkhasbMeeninstalledinROM).'TheCrequiremen!ttoprovideInstallationInformationBdoMesnotincludearequirement'tozcon!tinueytoprovidesuppMortservice,~warrantye,orupMdatesyforaworkthatyhasbMeen'moMdi edorinstalledb!ytherecipien!t,QorfortheUserProMductinwhic!hithasbMeen'moMdi edorinstalled.nAccesstoanet!workmaybMedeniedwhenthemoMdi cationitself'materiallyandadv!erselya ectstheopMerationofthenetworkorviolatestherulesand'protoMcolsfforcomm!unicationacrossthenetwork.'CorrespMondingNSourcecon!veyed,`DandNInstallationNInformationpro!vided,inaccordwith'this sectionm!ust bMeinaformatthatispubliclydoMcumen!ted(andwithanimplemen!ta-'tionEsa!vdDailabletothepublicinsourcecoMdeform),XandmustrequirenospMecialpassword'orfk!eyforunpacking,readingorcopying.-7.'AdditionalfTeerms. '\AdditionalPpMermissions"Paretermsthatsupplemen!tthetermsofthisLicenseb!ymak-'ingexceptionsfromoneormoreofitsconditions.BAdditionalpMermissionsthatare'applicable%totheen!tire$ProgramshallbMetreatedasthoughtheyw!ereincludedinthis'License,-/to:theexten!tthattheyarevdDalidunderapplicablelaw.!YIfadditionalpMermis-'sionsNapplyonlyNtopartoftheProgram,_thatpartma!ybMeusedseparatelyunderthose'pMermissions,but!theen!tireProgram remainsgovernedbythis Licensewithoutregard'toftheadditionalpMermissions.'WhengOy!ougPconveyagPcopyofgPacoveredgPwork,׉youmaygOatyourgOoptionremovegOany'additional pMermissions fromthatcop!ye,Rorfroman!ypartofit.j(AdditionalpMermissions'ma!ybMewrittentorequiretheiro!wnremovdDalincertaincaseswheny!oumoMdifythe'w!ork.)YeoufmaygplaceadditionalpMermissionsonmaterial,gaddedb!yyougtoaco!vered'w!ork,fforwhichyouhaveorcangiveappropriatecopyrightpMermission.'Not!withstandingfanyotherprovisionofthisLicense,sbformaterialyouaddtoacovered'w!ork,youmay(ifauthorizedbythecopyrightholdersofthatmaterial)supplement'theftermsofthisLicensewithterms:-a.=nDisclaimingw!arrantyorlimitingliabilitydi erentlyfromthetermsofsections15=nandf16ofthisLicense;or-b.=nRequiringpreservdDationofspMeci edreasonablelegalnoticesorauthorattributions=nin thatmaterialor intheAppropriateLegalNoticesdispla!yedby workscontaining=nit;for.KMc.=nProhibitingЈmisrepresen!tationЉoftheoriginofthatmaterial,NorrequiringthatmoMd-=ni edv!ersionsofsuchmaterialbMemarkedinreasonablewaysasdi erentfromthe=noriginalfv!ersion;or\ GGNUfGENERALPUBLICLICENSEQV733͍-d.=nLimitingtheuseforpublicit!ypurpMosesofnamesoflicensorsorauthorsofthe 33=nmaterial;for?.KMe.=nDecliningDtogran!trightsDundertrademarklawforuseofDsometradenames,X:trade-=nmarks,forservicemarks;or?/Тf.=nRequiring#indemni cation#oflicensorsandauthorsofthatmaterialb!yanyone#who=ncon!veys/#thematerial(ormoMdi edv!ersions/"ofit)withcontractualassumptions=nofliabilit!ytotherecipient,foranyliabilitythatthesecontractualassumptions=ndirectlyfimpMoseonthoselicensorsandauthors.J֍'AllӋotherӊnon-pMermissiv!eadditionaltermsareconsidered\furtherrestrictions"within'theAmeaningofsectionA10.IftheProgramasy!oureceivedAit,horan!ypartofit,con-'tainsHaHnoticestatingthatitisgo!vernedbyHthisLicensealongwithatermthatisa'furtherErestriction,/y!oumayDremovethatDterm.}IfaElicensedoMcumentEcontainsaEfurther'restrictionSbutRpMermitsrelicensingorcon!veyingSunderthisLicense,y!oumayaddRtoa'co!veredFworkEmaterialgovernedEbytheEtermsofthatlicensedoMcumen!t,}providedthat'theffurtherrestrictiondoMesnotsurviv!esuchrelicensingorconveying.'IfCy!ouaddtermstoaDcoveredworkinaccordwiththissection,youmustplace,inthe'relevdDan!tsource les,!astatementoftheadditionaltermsthatapplytothose les,!ora'noticefindicatingwhereto ndtheapplicableterms.'Additionalabterms, pMermissiv!eornon-permissiv!e,!mayabbestatedinaatheformofasep-'aratelywrittenlicense,orstatedasexceptions;theabMo!verequirementsapplyeither'w!aye.?-8.'Teermination.'Yeouma!ynotpropagateormoMdifyacoveredworkexceptasexpresslyprovidedun-'derrthisrLicense.BAn!yattemptotherwisetopropagateormoMdifyitisv!oid,andwill'automaticallyterminatey!ourrightsunderthisLicense(includingan!ypatentlicenses'gran!tedfunderthethirdparagraphofsection11).'Ho!wever,ifAyou@ceaseallviolationofthisLicense,theny!ourlicensefromaparticular'cop!yrightJholderisJreinstated(a)pro!visionallye,sunlessanduntilJthecopyrightholder'explicitly_and nallyterminatesy!ourlicense,0and(b)pMermanentlye,0ifthecopyright'holder"failstonotifyy!ouoftheviolation"bysomereasonablemeanspriorto60days'afterfthecessation.?'Moreo!ver,8your licensefromaparticularcop!yright holderisreinstatedpMermanen!tlyif'theV`cop!yrightholderVanoti esyouoftheviolationVabysomereasonablemeans,fbthisisthe' rstWtimey!ouWhaveWreceivednoticeofviolationWofthisLicense(foranyWwork)fromthat'cop!yrightholder,andy!oucuretheviolationpriorto30daysafteryourreceiptofthe'notice.'TeerminationNuofy!ourrightsunderthissectionNtdoMesnotterminatethelicensesofparties'whoqha!vereceivedcopiesorrightsfromyoupunderthisLicense.Ifyourrightshave'bMeenterminatedandnotpermanen!tlyreinstated,youdonotqualifytoreceivenew'licensesfforthesamematerialundersection10.?-9.'AcceptancefNotRequiredforHa!vingCopies.'YeouarenotrequiredtoacceptthisLicenseinordertoreceiv!eorrunacop!yofthe'Program.Ancillary-propagation-ofaco!veredwork-oMccurringsolelyasaconsequenceof'usingpMeer-to-peertransmissiontoreceiv!eacopylikewisedoMesnotrequireacceptance.mGGNUfGENERALPUBLICLICENSEQV833͍'Ho!wever, -nothingotherthanthisLicensegran!tsyoupMermissiontopropagateormoMdify 33'an!ycoveredwork.Theseactionsinfringecop!yrightifyoudonotacceptthisLicense.'Therefore,|b!yŪmoMdifyingūorpropagatingaco!veredwork,|youūindicateyourūacceptance'offthisLicensetodoso. 10.'AutomaticfLicensingofDo!wnstreamRecipients.'Eac!hktimejyouconveyjacoveredwork,ktherecipientjautomaticallyreceivesjalicense 33'fromttheuoriginallicensors,torun,moMdifyandpropagatethatw!ork,subjecttothis'License.)YeoujGarenotrespMonsiblejHforenforcingcomplianceb!ythirdpartieswiththis'License. 'An5\en!tity5transaction"isatransactiontransferringcon!trolofanorganization,or'substan!tially allassetsofone,orsubMdividinganorganization,ormergingorganizations.'Ify\propagationofay]co!veredy\workresultsfromanentitytransaction,_eachpartytothat'transactionJwhoJreceiv!esacopyJoftheworkJalsoreceivesJwhateverlicensestoJthework'thedpart!y'spredecessorininteresthadorcouldgiveunderthepreviousparagraph,1plus'a.righ!tto-pMossessionoftheCorrespondingSource-ofthew!orkfromthepredecessorin'in!terest,fifthepredecessorhasitorcangetitwithreasonablee orts.'YeouEma!yEnotimpMoseanyEfurtherrestrictionsontheexerciseoftherigh!tsgrantedEor'armedJunderthisLicense.SFeorexample,]y!oumaynotimpMosealicensefee,]royaltye,or'otherMc!hargeMforexerciseofrigh!tsgrantedMunderthisLicense,_andy!oumayMnotinitiate'litigationq(includingracross-claimorcoun!terclaiminala!wsuit)allegingthatan!ypatent'claimHisHinfringedb!ymaking,[nusing,selling,[oo eringHforsale,orimpMortingHtheProgram'orfan!ypMortionofit. 11.'P!atents.'A\con!tributor"-isacopyrightholderwhoauthorizesuseunderthisLicenseofthe'Program$or$aw!orkonwhich$theProgramisbased.Y_Thew!orkthuslicensed$iscalled'thefcon!tributor's\contributorversion".'Acon!tributor's(\essential'patentclaims"areall'patentclaimsownedor'controlledby'the>con!tributor,whetheralreadyacquiredor?hereafteracquired,thatw!ouldbMeinfringed'b!yMsomeMmanner,_pMermittedbyMthisLicense,_ofmaking,using,orMsellingitscon!tributor'v!ersion,but}>do}?notincludeclaimsthatw!ouldbMeinfringedonlyasaconsequenceof'further moMdi cationof thecon!tributorversion. FeorpurpMosesofthisde nition,,\con-'trol"@includes?therigh!ttogran!tpatent@sublicensesinamannerconsisten!twiththe'requiremen!tsfofthisLicense.'Eac!hEJcontributorEKgrantsyouEKanon-exclusive,worldwide,royalty-freeEKpatentEJlicense'under@the@con!tributor'sessentialpatentclaims,Tto@make,use,sell,o er@for@sale,impMort'andfotherwiserun,moMdifyandpropagatethecon!tentsfofitscon!tributorversion.'Inmthefollo!wingthreeparagraphs,y:a\patentmlicense"isanyexpressagreementorcom-'mitmen!t,>however$denominated,not$toenforceapaten!t(suchas$anexpresspMermission'toʀpracticeaʁpaten!torcovenantnottoʁsueforpatentinfringement).J,Teo\grant"such'a*Ypaten!tlicense*Xtoapartymeansto*Xmakesuchanagreementor*Xcommitmentnotto'enforcefapaten!tagainstthepartye.'Ifey!ouconveyacoveredework,}knowinglyrelyingonapatentlicense,~andtheCorre-'spMonding{Sourceof|thew!orkisnotavdDailable|foranyonetocopye,wfreeof|chargeandunder'thetermsofthisLicense,throughapubliclya!vdDailablenetworkserverorotherreadily'accessible_means,theny!ou_must_either(1)causetheCorrespMondingSourcetobMeso ~9GGNUfGENERALPUBLICLICENSEQV933͍'a!vdDailable,or(2)arrangetodepriveyourselfofthebMene tofthepaten!tlicenseforthis 33'particularRw!ork,; or(3)Sarrange,inamannerconsisten!twiththeSrequirementsofthis'License,bto=)extendthepaten!tlicensetodownstreamrecipients.&\Knowinglyrelying"'meansy!ouhaveactualknowledgethat,jbutforthepaten!tlicense,jyourconveyingthe'co!veredzworkyinacountrye,~oryyourrecipient'suseyoftheco!veredworkinyacountrye,'w!ould8infringeoneormoreidenti ablepatentsinthatcountrythatyouhavereason'tofbMeliev!earevdDalid.΍'If,pursuan!ttoorinconnectionwithasingletransactionorarrangemen!t,youconveye,'or-ypropagateb!yproMcuringconveyanceof,O>a-xcoveredwork,O>andgrantapatentlicense'tosomeofthepartiesreceivingtheco!veredworkauthorizingthemtouse,Ħpropagate,'moMdify:or:con!veyaspMeci c:copyofthecovered:work,P0thenthe:patentlicense:yougrant'isfautomaticallyextendedtoallrecipien!tsofthecoveredworkandworksbasedonit.͍'AMpaten!tM6licenseis\discriminatory"ifitdoMesnotincludewithinthescopeofitsco!ver-'age,XprohibitsUtheexerciseTof,orisconditionedTonthenon-exerciseofoneormoreofthe'righ!tsmthatarespMeci callygrantedunderthisLicense.RYeoumaynotconveyacovered'w!orkzZifyouareapartytoanarrangementwithz[athirdpartythatisinthebusinessof'distributingsoft!ware,underwhichyoumakepaymenttothethirdpartybasedonthe'exten!t|.ofyour|/activityofconveyingthework,andunderwhichthe|/thirdpartygrants,'toan!yofthepartieswhowouldreceivethecoveredworkfromyou,>(adiscriminatory'paten!tlicense(a)inconnectionwithcopiesofthecoveredworkconveyedbyyou(or'copiesmadefromthosecopies),or(b)primarilyforandinconnectionwithspMeci c'proMducts 7or 8compilationsthatcon!tainthecovered 8work,%unlessyou 7enteredinto 7that'arrangemen!t,forthatpatentlicensewasgranted,priorto28March2007.'NothinginthisLicenseshallbMeconstruedasexcludingorlimitingan!yimpliedlicenseor'other-,defensestoinfringemen!tthatmayotherwise--bMeavdDailabletoyouunderapplicable'paten!tflaw.12.'NofSurrenderofOthers'Fereedom.͍'IfQconditionsarePimpMosedony!ou(whetherb!ycourtorder,"agreementPorotherwise)that'con!tradict theconditionsofthisLicense,'theydonotexcuseyoufromtheconditions'of_lthis_kLicense.Ify!oucannotconvey_kacovered_kworkso_kastosatisfysim!ultaneously'y!ourLobligationsunderthisLicenseandLanyotherpMertinentobligations, thenasa'consequencey!oumaynotconveyitatall.Feorexample,Tifyouagreetotermsthat'obligate&y!ou'tocollectaro!yalty&forfurthercon!veying&fromthosetowhomy!ouconvey'theCProgram,ztheBonlyw!ayCyoucouldsatisfyBbMoththosetermsandthisLicensew!ould'bMeftorefrainen!tirelyfromconveyingtheProgram.13.'UsefwiththeGNUA eroGeneralPublicLicense.͍'Not!withstandingTanyUotherprovisionofUthisLicense,youUhavepMermissiontoUlinkor'com!bineanycoveredworkwithaworklicensedunderversion3oftheGNUcA ero'GeneraliPubliciLicensein!toasinglecom!binedwork,vanditoconveytheiresultingwork.'TheeFtermsofthisLicensewillcon!tinueeFtoapplytothepartwhic!histhecoveredwork,'but@thespMecialrequiremen!tsoftheGNUA eroGeneralPublicLicense,6section13,'concerningfin!teractionthroughanetworkwillapplytothecombinationassuch.14.'RevisedfVeersionsofthisLicense. GGNUfGENERALPUBLICLICENSE׼1033͍'The:#Feree:$Soft!wareFeoundationmay:$publishrevisedand/ornewv!ersionsoftheGNU 33'GeneralPublicLicensefromtimetotime.Suc!hnewv!ersionswillbMesimilarinspirit'tofthepresen!tversion,butmaydi erindetailtoaddressnewproblemsorconcerns.] 'Eac!hZversionZisgivenZadistinguishingv!ersionnumbMer.IfZtheProgramspMeci esthat'a~certainn!umbMered~versionoftheGNU{GeneralPublicLicense\oranylaterversion"'appliesQtoPit,Ly!ouhaveQtheoptionPoffollowingthetermsPandconditionseitherofthat'n!umbMeredversionorofanylaterversionpublishedbytheFereeSoftwareFeoundation.'IftrtheProgramdoMesnotspecifyav!ersionnumbMeroftheGNUteGeneralPublicLicense,'y!oufmaychoMoseanyversioneverpublishedbytheFereeSoftwareFeoundation.'IfÌtheProgramspMeci esthatapro!xyËcandecidewhichfutureversionsoftheGNU'General2PublicLicensecanbMeused,ethatpro!xy'spublicstatementofacceptanceofa'v!ersionfpMermanentlyauthorizesyoutochoMosethatversionfortheProgram.] 'LaterVlicenseVv!ersionsmaygiveVyouadditionalVordi erentpMermissions.However,no'additionalhobligationsgareimpMosedonan!yauthororcop!yrightholderhasaresultofy!our'c!hoMosingftofollowalaterversion.15.'DisclaimerfofWearran!ty.'THEREISNOWȈARRANTYF!ORTHEPROGRAM,6TOTHEEXTENTPER-'MITTEDBYAPPLICABLELAȈW.5EX!CEPTWHENOTHERWISESTeATEDIN'WRITING THECOPYRIGHTHOLDERSAND/OROTHERPeARTIES PR!OVIDE'THEPR!OGRAM\ASIS"WITHOUTWȈARRANTYOFANYKIND,EITHEREX-'PRESSED5OR5IMPLIED,5INCLUDING,BUTNOT5LIMITEDTO,5THEIMPLIED'WȈARRANTIESOFMER!CHANTeABILITYANDFITNESSFORAPeARTICULAR'PURPOSE.ϔTHEHENTIREGRISKASTOTHEQUALITYANDPERF!ORMANCE'OFTHEPR!OGRAMISWITHYOU.SHOULDTHEPR!OGRAMPROVEDEFEC-'TIVE,jYOU:ASSUME9THECOSTOFALLNECESSAReYSERȈVICING,kREPAIROR'CORRECTION.16.'LimitationfofLiabilit!ye.] 'IN'vNOEVENT'wUNLESSREQUIREDBYAPPLICABLELAȈWORA!GREEDTOIN'WRITINGkWILLkANYCOPYRIGHTHOLDER,kORANYOTHERPeARTYkWHO'MODIFIESAND/ORCONVEYSTHEPR!OGRAMASPERMITTEDABOVE,BE'LIABLETOYOUF!ORDAMAGES,INCLUDINGANYGENERAL,SPECIAL,IN-'CIDENTeALORCONSEQUENTIALD!AMAGESARISINGOUTOFTHEUSEOR'INABILITYTOUSETHEPR!OGRAM(INCLUDINGBUTNOTLIMITEDTO'LOSSOFD!AeTAORDAeTABEINGRENDEREDINACCURAeTEORLOSSESSUS-'TeAINEDBYYOUORTHIRDPeARTIESORAFȈAILUREOFTHEPR!OGRAM'TO OPERAeTEWITHANYOTHERPR!OGRAMS), EVENIFSUCHHOLDEROR'OTHERgPeARTYHASgBEENAD!VISEDOFTHEPOSSIBILITYOFSUCHD!AM-'A!GES.17.'In!terpretationfofSections15and16.'IfJthedisclaimerofw!arrantyJandlimitationJofliabilit!yprovidedabMovecannotbMegiven'loMcalVlegale ectWaccordingtotheirterms,3reviewingcourtsshallapplyloMcalla!wthat'mostqcloselyappro!ximatesanqabsolutewaiverofallcivilliabilityqinconnectionwith'the5OProgram,Y unless5Paw!arranty5Oorassumptionofliabilit!yaccompaniesacop!yofthe'Programfinreturnforafee. hGGNUfGENERALPUBLICLICENSE׼1133͍GcENDf@OFTERMSANDCONDITIONS GHowf@toApplyTheseTfermstoYourNewPrograms33!GIfy!oudevelopanewprogram,andy!ouwantittobMeofthegreatestpMossibleuseto 33Gthepublic,@thebMestw!aytoachievethisistomakeitfreesoftwarewhicheveryonecanGredistributefandc!hangeundertheseterms.33!GTeodoso,attac!hthefollowingnoticestotheprogram.XItissafesttoattac!hthemtotheGstartjofeac!hsource letomostke ectivelystatetheexclusionofwarranty;andeach leGshouldfha!veatleastthe\copyright"lineandapMointertowherethefullnoticeisfound. .F.33 'SpMecialthanksisextendedtoMic!haelTiemannandDougLea, forpro!vidingauseful'compiler,fandforgivingmeaforumtoexhibitm!ycreation.'Inaddition,AdamdeBoMorandNelsOlsonpro!videdmanytipsandinsightsthatgreatly'helpMedfimpro!vethequalityandfunctionalityofgperf. 'Bruno>Haible>enhancedandoptimizedthesearc!halgorithm.SHealsorewrotetheinput'routinesfandtheoutputroutinesforbMetterreliabilit!ye,andaddedatestsuite. 1333͍GZ1 QInutro=duction33!GgperfisapMerfecthashfunctiongeneratorwritteninC++.5Ittransformsan:p0J 3 cmsl10nelemen!t 33Guser-spMeci edKxk!eywordsetWintoapMerfecthashfunctionF.FuniquelymapskeywordsGin4LW|on!tothe4Krange0..k,WwherekO>=n-1.IfkP=n-1thenFisa9': 3 cmti10minimalUpMerfecthashGfunction.=gperfgeneratesa0..kp!elemen!tstaticloMokuptableandapairofCfunctions.GThese>functions?determinewhetheragiv!encharacter?stringsoMccursinW,=tusingatmostGonefprobMein!tothelookuptable.33!GgperfLcurren!tlygeneratesthereservedkeywordMrecognizerforlexicalanalyzersinseveralGproMductionwandvresearc!hcompilersandlanguageproMcessingtools,;includingvGNUtC,GNUGC++,GNUBJa!vdDa,GNUP!ascal,GNUMoMdula~3,andGNUCinden!t.:CompleteC++}sourcecodeGfor~+gperfisa!vdDailable~,fromhttps://ftp.gnu.org/pub/gnu/gperf/.e,A}papMerdescribingGgperf'sdesignandimplemen!tationingreaterdetailisa!vdDailableintheSecondUSENIXC++GConferencefproMceedingsorfromhttp://www.cs.wustl.edu/~schmidt/resume.html.1433͍GZ2 QStaticzsearcuhstructuresandGNU]gperf33!GATstaticsearc!hstructureisanAbstractDataT!ypMewithcertainfundamen!talopMerations, 33Ge.g.,initialize,insert,andkrpetrieve.Conceptuallye,allinsertionsoMccurlbeforean!yretrievdDals.GIn4practice,gperf5generatesastatic$arra!ycontainingsearch5setkeywordsand5anyassoMciatedGattributesfaspMeci edf`b!ytheuser.Thus,^thereisessentiallyf`noexecution-timecostfortheGinsertions.It@Lisausefuldata@Mstructureforrepresen!tingstaticseparchsets.Static@Lsearc!hsetsGoMccurfrequen!tlyinsoftwaresystemapplications.STypicalstaticsearchsetsincludecompilerGreserv!edwords,k=assemblerinstructionopMcodes,k=andbuilt-inshellin!terpretercommands.GSearc!hsetmembMers,Ocalledkeywords,Oareinsertedintothestructureonlyonce,OusuallyGduringfprograminitialization,andarenotgenerallymoMdi edatrun-time.33!GNumerousXdstaticsearc!hstructureimplementationsXeexist,ge.g.,arrays,linkedXdlists,binaryGsearc!hItrees,digitalsearchtries,andhashtables. Di erentapproacheso ertrade-o sGbMet!ween4spaceutilization3andsearc!htimeeciencye.FFor4example,\annelemen!tsortedGarra!yisspaceecient,thoughtheaverage-casetimecomplexityforretrievdDalopMerationsGusingbinarysearc!hispropMortionaltologn.Con!verselye,hashtableimplementationsoftenGloMcate a tableen!tryinconstan!ttime,,=buttypically impMoseadditionalmemoryo!verhead andGexhibitfpMoorw!orstcaseperformance.!GMinimal+pperfecthash+functionspro!videanoptimalsolutionforaparticularclassofstaticGsearc!hfsets.AminimalpMerfecthashfunctionisde nedbytwopropMerties: 'It"allo!ws"keywordrecognition"inastaticsearc!hsetusingatmostoneprobMein!tothe'hashftable.Thisrepresen!tsthe\pMerfect"propert!ye. 'TheSactualmemoryalloMcatedtostorethek!eywordsSispreciselylargeenoughforthe'k!eywordfset,andnolarpger.Thisisthe\minimal"propMert!ye.33!GFeor\mostapplications[itisfareasiertogeneratepperfectFhashfunctions\thanminimalGpperfect{hashqfunctions.@nMoreo!ver,non-minimalqpMerfecthashfunctionsfrequentlyexecuteGfasterDthanminimalonesinpractice. ThisphenomenaoMccurssincesearc!hingasparseGk!eywordItableJincreasestheprobabilit!yofloMcatinga\n!ull"entrye,therebyJreducingstringGcomparisons.gperf's>Qdefault>RbMeha!viorgeneratesnepar-minimal_pMerfecthashfunctionsforGk!eywordDsets.(vHowever,{gperfprovidesCmanyoptionsthatpMermituserCcontrolovertheGdegreefofminimalit!yandpMerfection.!GStaticK=searc!hsetsK>oftenexhibitrelativestabilityK>overtime.cFeorexample,tsAda's63re-Gserv!edAwordsBhaveremainedBconstantforBnearlyadecade.oItisthereforefrequen!tlyworth-Gwhile4to5expMendconcertede ortbuildinganoptimalsearc!hstructureoncpe,ifitsubsequen!tlyGreceiv!esheavyusemultipletimes.gperfremovesthedrudgeryassoMciatedwithconstructingGtime-zandzspace-ecien!tsearchzstructuresbyzhand.ZIthaszprovenazusefulandpracticalGtoMol`Qforseriousprogrammingprojects.ƀOutputfromgperfiscurren!tlyusedinseveralpro-Gductionandresearc!hcompilers,0{includingGNUC,GNUC++,0|GNUJa!vdDa,0{GNUPascal,0|andGGNU~eMoMdula~3.fThelattert!wo~compilers~arenoty!etpartoftheocialGNU~edistribu-Gtion.)Eac!hcompilerutilizesgperftoautomaticallygeneratestaticsearc!hstructuresthatGecien!tlyfidentifytheirrespMectivereservedkeywords.퍟1533͍GZ3 QHigh-LevuelzDescriptionofGNU]gperf!GThepMerfecthashfunctiongeneratorgperfreadsasetof\k!eywords"fromaninput le 33G(orfromthestandardinputb!ydefault).&VItattemptstoderiveapMerfecthashingfunctionGthatkrecognizesamem!bMerkofthestatickeywordsetwithatmostkasingleprobMeintotheGloMokup5)table.Ifgperfsucceedsingeneratingsuc!h5(afunctionitproducesapairofC5 sourceGcoMderoutinesthatperformhashingandtablelookuprecognition.AllgeneratedCrcodeGisdirectedtothestandardoutput.Command-lineoptionsdescribMedbelo!wallowyoutoGmoMdifyftheinputandoutputformattogperf.ƍ!GBydefault,-gperfattemptstoproMducetime-ecien!tcode,-withlessemphasisonecien!tGspace'utilization. Ho!wever,severaloptionsexistthatpMermittrading-o executiontimeforGstorage=space>andvicev!ersa.XcInparticular,sexpandingthegeneratedtablesizeproMducesaGsparsesearc!hstructure,9Hgenerallyyieldingfastersearches.eConverselye,9HyoucandirectgperfGtoxutilizexaCwswitchstatemen!tschemexthatminimizesdataspacestoragesize.yFeurthermore,GusingaCϒswitchma!yactuallyspMeedupthek!eywordretrievdDaltimesomewhat.ZFActualGresultsfdepMendony!ourCcompiler,ofcourse.Ǎ!GInogeneral,,gperfassignsvdDaluestotheb!ytesitisusingforhashinguntilsomesetGofvdDaluesgiv!eseachkeywordauniquevdDalue. AhelpfulheuristicisthatthelargertheGhashivdDaluerange,theeasieritisforgperfito ndandgenerateapMerfecthashfunction.GExpMerimen!tationfisthekeytogettingthemostfromgperf./ݍGc3.1Inputf@Fformattog߆Tff cmtt12ggperf33!GYeoucancon!troltheinput leformatb!yvdDaryingcertaincommand-lineargumen!ts,inGparticularthe`-t'option.Theinput'sappMearanceissimilartoGNUjutilitiesflexandGbisonf(orUNIXutilitieslexandyacc).Here'sanoutlineofthegeneralformat:.declarations.%%.keywords.%%.functionsEʒ!GUnlikeflexEsorErbison,m5thedeclarationssectionandthefunctionssectionareoptional.GTheffollo!wingsectionsdescribMetheinputformatforeachsection.!GItXispMossibletoomittheYdeclarationsectionen!tirelye,ifthe`-t'optionisnotgiv!en.InGthisfcasetheinput lebMeginsdirectlywiththe rstk!eywordfline,e.g.:ƍ.january.february.march.april....M`GmN # cmbx12m3.1.1d(Declarations3!GThe#k!eyword#input leoptionallycon!tainsasectionforincludingarbitraryC#ideclara-Gtionsandde nitions,gperfdeclarationsthatactlik!ecommand-lineoptions,asw!ellasforGpro!vidingfauser-suppliedstruct.GChapterf3:High-Lev!elDescriptionofGNUgperf>1633͍Gm3.1.1.1d(User-suppliedMp߆T # cmtt12pstruct3!GIfthe`-t'option(or,%equivdDalen!tlye,$the`%struct-type'declaration)is,enabled,y!oumust 33Gpro!videbaCbstructastheblastcompMonentinthedeclarationsectionbfromtheinput le.GThe$ rst$ eldinthisstructm!ustbMeoft!ypMecharf*orconstchar*$ifthe`-P'optionisnotGgiv!en,oroftypMeintiftheoption`-P'(or,equivdDalen!tlye,the`%pic'declaration)isenabled.GThisB! rst eldm!ustbMecalledB"`name',ialthoughitispossibleB"tomodifyitsnamewiththeG`-K'foption(or,equivdDalen!tlye,the`%defineslot-name'declaration)describMedbelo!w.u!GHerefisasimpleexample,usingmon!thsoftheyearandtheirattributesasinput:.structmonth{char*name;intnumber;intdays;intleap_days;}; 33.%%.january,>1,31,31.february, T2,28,29.march,R3,31,31.april,R4,30,30.may,(=5,31,31.june,"}6,30,30.july,"}7,31,31.august,8,31,31.september,9,30,30.october, T10,31,31.november,11,30,30.december,12,31,31!GSeparatingRtheQstructdeclarationfromthelistofk!eywordsRandother eldsareapairof 33Gconsecutiv!e_pMercent`signs,^`%%',]appearingleft_justi edinthe rstcolumn,^asintheUNIXGutilit!yflex.u!GIf{thestructhas{alreadybMeendeclaredinaninclude le,itcanbMemen!tionedinanGabbreviatedfform,lik!ethis:u.structmonth;.%%.january,>1,31,31....@nGm3.1.1.2d(GpierfMDeclarations!GThejdeclarationsectioncankcon!taingperfdeclarations.Theyin uencethew!ayjgperfGw!orks,4likecommandlineoptionsdo.|Infact,4ev!erysuchdeclarationisequivdDalenttoaGcommandflineoption.Therearethreeformsofdeclarations:u-1.'Declarationsfwithoutargumen!t,like`%compare-lengths'.-2.'Declarationsfwithanargumen!t,like`%switch==1733͍G`%delimiters=delimiter-list' 33K:Allo!wssyoustoprovideastringscontainingdelimitersusedtosseparatekeywordsK:from'their'attributes.aThedefaultis",".aThisoptionisessen!tialify!ouwantK:tofusek!eywordsfthatha!vefembMeddedcommasornewlines.G`%struct-type'K:Allo!wsyoutoincludeastructtypMedeclarationforgeneratedcode;Rseeabo!veK:forfanexample.G`%ignore-case'K:ConsiderKuppMerandKlo!werKcaseASCIIKBc!haractersasequivdDalent. ͷThestringK:comparisondwillusedacaseinsigni can!tcharacterdcomparison.NotethatloMcaleK:depMenden!tfcasemappingsareignored.G`%language=language-name'K:Instructs5gperf6togeneratecoMdeinthelanguagespMeci edb!ytheoption'sar-K:gumen!t.Languagesfhandledarecurrently:K:`KR-C'Old-st!yle(K&R(sC.This(languageisunderstoModb!y(old-styleC(rcom--pilersandANSICcompilers, ?butANSICcompilersma!y agw!arn--ingsf(orev!enerrors)bMecauseoflacking`const'.K:`C'-CommonÀC.ThislanguageisunderstoModÀb!yANSIGCFcompilers,and-alsoob!yoold-styleCocompilers,zprovidedothatyouo#definefconstto-empt!yfforcompilerswhichdon'tknowabMoutthiskeyword.K:`ANSI-C'=ANSIC.ThislanguageisunderstoModb!yANSIC(C89,^ISOC90)-compilers,fISOC99compilers,andC++compilers.K:`C++'"|C++.ThisflanguageisunderstoModfb!yC++compilers.K:ThefdefaultisANSI-C.G`%definefslot-namename'K:ThisXdeclarationYisonlyusefulwhenoption`-t'(or, equivdDalen!tlye, theK:`%struct-type'declaration)hasbMeengiv!en.Bydefault,theprogramassumesK:thestructurecompMonen!tidenti erforthekeywordis`name'. QThisoptionK:allo!wsVmanVlarbitrarychoiceofidenti erVlforthiscompMonent,nalthoughVlitstillK:m!ustfoMccurasthe rst eldinyoursuppliedstruct.G`%definefinitializer-suffixinitializers'K:ThisXdeclarationYisonlyusefulwhenoption`-t'(or, equivdDalen!tlye, theK:`%struct-type'Mdeclaration)MhasbMeengiv!en.{ItpermitstoMspecifyinitializersK:forJthestructuremem!bMersfollowingslot-nameinemptyhashtableentries.K:The$list%ofinitializersshouldstartwithacomma. Bydefault,iTtheemittedK:coMdefwillzero-initializestructuremem!bersfollo!wingslot-name.G`%definefhash-function-namename'K:Allo!wsIyoutospMecifythenameHforthegeneratedhashfunction.~DefaultnameK:isf`hash'.ThisoptionpMermitstheuseoft!wofhashtablesinthesame le.G`%defineflookup-function-namename'K:Allo!ws LyoutospMecifythenamefor Mthegeneratedlookupfunction. DefaultK:nameV;is`in_word_set'.%ThisoptionpMermitsm!ultipleV1833͍G`%definefclass-namename' 33K:Thiseoptionfisonlyusefulwhenoption`-LfC++'(or, 3equivdDalen!tlye, 3theK:`%language=C++'declaration)hasbMeengiv!en. mJItallowsyoutospMecifytheK:namefofgeneratedC++class.DefaultnameisPerfect_Hash.΍G`%7bit'KThisu'optionspMeci esu(thatallstringsthatwillbMepassedasargumen!tstotheK:generated.hashfunctionandthegenerated.loMokupfunctionwillsolelyconsistK:of7-bitASCIMIc!haracters(bytesintherange0..127).(NotethattheANSICK:functionsisalnumandisgraphdonotguaran!teethatab!yteisinthisrange.K:Onlyfanexplicittestlik!e`c>= A &&c<= Z 'guaranteesthis.)͍G`%compare-lengths'K:Comparek!eywordlengthsbMeforetryingastringcomparison.HDThisoptionisK:mandatoryforbinarycomparisons(seeSection3.3[BinaryStrings],;page22).K:It,alsomigh!tcut+downonthenumbMerofstring+comparisonsmadeduringtheK:loMokup,sincek!eywordswithdi eren!tlengthsarenevercomparedviastrcmp.K:Ho!wever,tusingh`%compare-lengths'migh!thgreatlyincreasethesizeofthegen-K:eratedCcoMdeifthelookuptablerangeislarge(whic!himpliesthattheswitc!hK:option`-S'or`%switch'isnotenabled),Tsincethelengthtablecon!tainsasmanyK:elemen!tsfasthereareentriesintheloMokuptable.G`%compare-strncmp'K:GeneratesCcoMdethatusesthestrncmpfunctiontoperformstringcomparisons.K:Thefdefaultactionistousestrcmp.G`%readonly-tables'K:Mak!es thecontents ofallgeneratedloMokuptablesconstan!t, ti.e.,\readonly".K:Man!ycompilerscangeneratemoreecien!tcoMdeforthisb!yputtingthetablesK:infreadonlymemorye.͍G`%enum'KDe neconstan!tvdDaluesusinganenumloMcaltothelookupfunctionratherthanK:withx#de nes.TThisalsomeansthatdi eren!tloMokupxfunctionscanresideinK:thefsame le.ThankstoJamesClark.G`%includes'K:Include$thenecessarysysteminclude le,,at$thebMeginningoftheK:coMde.zBy>default,9ythisisnotdone;Ktheuserm!ustincludethis=header lehimselfK:tofallo!wcompilationofthecoMde.͍G`%global-table'K:Generatedthedstatictableofk!eywordsasdastaticglobalvdDariable,ratherthanK:hidingfitinsideoftheloMokupfunction(whic!histhedefaultbeha!vior).G`%pic'Optimizethegeneratedtableforinclusioninsharedlibraries.ThisreducesK:the;.startuptimeofprogramsusing;/asharedlibrarycon!tainingthegeneratedK:coMde.Ifdthee`%struct-type'declaration(or,2equivdDalen!tlye,theoptione`-t')isalsoK:giv!en,thei rstj eldoftheuser-de nedstructm!ustbMeoft!ypej`int',not`charK:*',ҜbMecauseitwillcon!taino setsintothestringpMoolinsteadofactualstrings.K:Teo con!vert suchano set toastring,you canusetheexpression`stringpoolK:+fo',Fwhereoistheo set.ThestringpMoolnamecanbec!hangedthroughtheK:`%definefstring-pool-name'declaration.GChapterf3:High-Lev!elDescriptionofGNUgperf>1933͍G`%definefstring-pool-namename' 33K:Allo!wsyoutospMecifythenameofthegeneratedstringpoolcreatedb!ytheK:declaration`%pic'(or,%equivdDalen!tlye,theoption`-P'). ThedefaultnameisK:`stringpool'.EThisdeclarationpMermitstheuseoft!wohashtablesinthesameK: le,withg``%pic'g_andev!enwhenthe`%global-table'declaration(or,equivdDa-K:len!tlye,ftheoption`-G')isgiven.L΍G`%null-strings'K:UseNULL`stringsinsteadofempt!ystringsforemptykeywordtableentries.K:Thisreducesthestartuptimeofprogramsusingasharedlibrarycon!tainingK:thejJgeneratedcoMde(butnotasm!uchjJasthedeclaration`%pic'),vOattheexpenseK:offonemoretest-and-branc!hinstructionatruntime.L͍G`%definefconstants-prefixprefix'K:Allo!ws[ayoutospMecify[`apre xfortheconstantsTOTAL_KEYWORDS,MIN_WORD_K:LENGTH,MAX_WORD_LENGTH,and8so8on. UThisoptionpMermitstheuseoft!woK:hash!tables!inthesame le,ev!enwhentheoption`-E'(or,equivdDalen!tlye,K:the`%enum'declaration)isnotgiv!enortheoption`-G'(or,ۯequivdDalen!tlye,ۮtheK:`%global-table'fdeclaration)isgiv!en.G`%definefword-array-namename'K:Allo!wsyoutospMecifythenameforthegeneratedarra!ycontainingthehashK:table. oDefault9Anameis9B`wordlist'. nThisoption9ApMermitstheuse9Boft!woK:hashtablesinthesame le,ev!enwhentheoption`-G'(or,equivdDalen!tlye,theK:`%global-table'fdeclaration)isgiv!en.G`%defineflength-table-namename'K:Allo!ws&YyoutospMecify&Xthenameforthegeneratedarray&XcontainingthelengthK:table. #oDefaultnameis`lengthtable'. #pThisoptionpMermitstheuseoft!woK:lengthtablesinthesame le, ev!enwhentheoption`-G'(or, equivdDalen!tlye, theK:`%global-table'fdeclaration)isgiv!en.G`%switch=count'K:CausesJtheJgeneratedCJ^coMdetouseaswitchstatemen!tscheme,sratherJthanK:anarra!yloMokuptable.ThiscanleadtoareductioninbothtimeandspaceK:requiremen!ts8forsomeinput8 les. 'Theargumentto8thisoptiondeterminesK:ho!wmanyswitchstatementsaregenerated.AvdDalueof1generates1switchK:con!taining‹alltheŒelements,avdDalueofŒ2generates2tableswith1/2theelemen!tsK:ineac!hswitch,Ѻetc.@ThisisusefulsincemanyCcompilerscannotcorrectlyK:generateJxcoMdeJwforlargeswitchstatemen!ts.8Thisoptionw!asinspiredinpartb!yK:KeithfBostic'soriginalCprogram.L͍G`%omit-struct-type'K:Prev!entsS,theS-transferofthet!ypMedeclarationtotheoutput le.UsethisoptionK:iffthet!ypMeisalreadyde nedelsewhere.Gm3.1.1.3d(CMCoideInclusion3!GUsingaasyn!taxsimilarbtoGNU?utilitiesflexandbison,:bitispMossibletodirectlyincludeGCsourcetextandcommen!tsverbatimintothegeneratedoutput le.Thisisaccomplished|GChapterf3:High-Lev!elDescriptionofGNUgperf>2033͍Gb!yyFenclosingtheyGregioninsideleft-justi edsurrounding`%{',`%}'pairs.V}Hereisaninput 33Gfragmen!tfbasedonthepreviousexamplethatillustratesthisfeature:.%{.#include./*Thissectionofcodeisinserteddirectlyintotheoutput.*/.intreturn_month_days(structmonth*months,intis_leap_year);.%}.structmonth{char*name;intnumber;intdays;intleap_days;};.%%.january,>1,31,31.february, T2,28,29.march,R3,31,31....⿍Gm3.1.2d(FģormatMforKeywordEntries3!GThe"Jsecondinput le"Iformatsectioncon!tainslinesofkeywords"IandanyassoMciatedat-Gtributesy!oumightsupplye.jAUlinebMeginningwith`#'inthe rstcolumnisconsideredaGcommen!t.+Everythingfollowingthe`#'isignored,1uptoandincludingthefollowingnew-Gline.ֶANlineNbMeginningNwith`%'inthe rstcolumnisanoptiondeclarationandm!ustnotGoMccurfwithinthek!eywordsfsection.!GTheh rsth eldofeac!hnon-commenthlineisalw!ayshthekeywordhitself."ItcanbMegiv!enGin5t!woways:Iasasimplename,Xi.e.,Xwithoutsurroundingstringquotationmarks,orasaGstring enclosedindouble-quotes,inCsyn!tax,pMossiblywithbackslashescapMeslike\"orG\234or\xa8.Ineithercase,fitm!uststartrightatthebMeginningoftheline,fwithoutleadingGwhitespace.)InP*thisP)con!text,za\ eld"isconsideredtoextendupto,zbutnotinclude,ztheG rstblank,bcomma,ornewline.ʡHereisasimpleexampletak!enfromapartiallistofCGreserv!edfwords:.#TheseareafewCreservedwords,seethec.gperffile.#foracompletelistofANSICreservedwords..unsigned.sizeof.switch.signed.if.default.for.while.return!GNoteo9thatunlik!eflexo8orbisonthe rst`%%'markermaybMeo8elidedifthedeclarationGsectionfisempt!ye.!GAdditionalp eldspma!yoptionallyfollowptheleadingk!eyword.˽FieldspshouldbMeseparatedGb!yecommas,randterminateeattheendofline.MWhatthese eldsmeanisen!tirelyuptoy!ou;Gtheyareusedtoinitializetheelemen!tsoftheuser-de nedstructpro!videdbyyouintheGdeclarationsection.sIfthe`-t'option(or,equivdDalen!tlye,the`%struct-type'declaration)GisP+notZenabledP*these eldsaresimplyignored.,AllpreviousexamplesexceptthelastoneGcon!tainfkeywordattributes. ЍGChapterf3:High-Lev!elDescriptionofGNUgperf>2133͍Gm3.1.3d(IncludingMAdditionalCFģunctions3!GTheoptionalthirdsectionalsocorrespMondscloselywithcon!ventionsfoundinflexand 33Gbison.Alltextinthissection,մstartingatthe nal`%%'andextendingtotheendoftheinputG le,isincludedv!erbatimintothegeneratedoutput le.Naturallye,itisyourrespMonsibilityGtofensurethatthecoMdecon!tainedinthissectionisvdDalidC.uGm3.1.4d(WhereMtoplacedirectivesforGNUpindentm.!GIfFiy!ouwanttoinvokeFhGNUFQindentonagperfinput le,Yy!ouwillseethatGNUFQindentGdoMesn't:understand9the`%%',`%{'and`%}'directiv!esthatcon!trolgperf'sin!terpretationofGtheinput le.Thereforey!ouhavetoinsertsomedirectivesforGNU[indent.Morepreciselye,Gassumingfthemostgeneralinput lestructure .declarationspart1.%{.verbatimcode.%}.declarationspart2.%%.keywords.%%.functionsz@Gy!oufwouldinsert`*INDENT-OFF*'and`*INDENT-ON*'commentsasfollows:./**INDENT-OFF**/.declarationspart1.%{./**INDENT-ON**/.verbatimcode./**INDENT-OFF**/.%}.declarationspart2.%%.keywords.%%./**INDENT-ON**/.functionsGc3.2Outputf@FformatforGeneratedCCos3dewithggperf33!GSev!eralO-optionscontrolhowthegeneratedCOcoMdeappearsonthestandardoutput.Tw!oGCtfunctionsaregenerated. 2$Theyarecalledhashandin_word_set,t.althoughy!oumayGmoMdifygtheirfnameswithacommand-lineoption.Bothfunctionsrequiret!wogarguments,aGstring,charf*Vstr,andUalengthparameter,intlen.sTheirdefaultfunctionprotot!ypMesareGasffollo!ws:z[Feunction]G@2233͍.stored^inaloMcalstaticarra!ye.TheassociatedvdDaluestableisconstructedin!ternallyby 33.gperf3andlater3outputasastaticloMcalC3arra!ycalled`hash_table'.zTherelevdDant.selected9pMositions(i.e.hindicesin!tostr))9arespeci edviathe`-k'9optionwhenrunning.gperf,fasdetailedintheOptions~sectionbMelo!w(seeChapter4[Options],page24)./z[Feunction]G@in_word_sety(@constLchar*Bstr@,size_tBlen).Ifstrisinthek!eywordset,,preturnsapMointertothatkeyword.Moreexactlye,,qifthe.option`-t'(or, equivdDalen!tlye,the`%struct-type'declaration)w!asgiven, itreturnsa.pMoin!terftothematchingkeyword'sstructure.OtherwiseitreturnsNULL./!GIfӠtheoption`-c'(or,equivdDalen!tlye,theӠ`%compare-strncmp'declaration)isnotused,GstrCm!ustzbMeaNULzterminatedstringofexactlylengthlen.ZIf`-c'(or,equivdDalentlye,theG`%compare-strncmp'declaration)isused,9>strm!ustsimplybMeanarra!yoflenb!ytesanddoMesGnotfneedtobMeNULterminated.1(!GThefcoMdegeneratedfortheset!woffunctionsisa ectedb!ythefollowingoptions:!G`-t'G`--struct-type'K:Mak!efuseoftheuser-de nedstruct.1'G`-Sftotal-switch-statements'G`--switch=total-switch-statements'K:Generate{1ormoreC{@switchstatemen!tratherthanusealarge,Q(andpMotentiallyK:sparse)staticarra!ye.Althoughtheexacttimeandspacesa!vingsofthisapproac!hK:vdDaryIaccordingtoJy!ourC?compiler'sdegreeofoptimization,thismethoMdoftenK:resultsfinsmallerandfastercoMde."!GIfWthe`-t'Wand`-S'options(or,fequivdDalen!tlye,fthe`%struct-type'and`%switch'declara-Gtions)areomitted,thedefaultactionistogenerateacharf*arra!ycontainingthekeywords,Gtogetherewithadditionalempt!ystringsusedforfpaddingthearraye.ByexpMerimentingwithGthevdDariousinputandoutputoptions,andtimingtheresultingCcoMde,y!oucandetermineGthefbMestoptionc!hoicesfordi erentkeywordsetcharacteristics.|Gc3.3Usef@ofNULbytes33!GBydefault,athe coMdegeneratedb!ygperfopMeratesonzeroterminatedstrings,atheusualGrepresen!tationofstringsinC.Thismeansthatthek!eywordsintheinput lem!ustnotGcon!tainQNULPbytes,{andthestr)argumentpassedtohashorin_word_setmustbMeNULGterminatedfandha!vefexactlylengthlen.!GIfUoption`-c'U(or,equivdDalen!tlye,theU`%compare-strncmp'declaration)isused,thentheGstr$argumen!t[doMesnotneed[tobeNUL[sterminated.Thecode[generatedb!ygperfwillonlyGaccess[Xthe[Y rstlen,j[notlen+1,b!ytesstarting[Yatstr.However,j[thekeywordsinthe[Yinput leGstillfm!ustnotcontainNULbytes.1'!GIfUoption`-l'U(or,equivdDalen!tlye,theU`%compare-lengths'declaration)isused,thentheGhashtablepMerformsbinarycomparison.Thek!eywordsintheinput lema!ycontainNULGb!ytes,b_written in stringsyntaxas \000or\x00,b_andthecoMdegeneratedb!ygperfwillGtreatXNULlik!eanyotherbyte.Also,TTinthiscasethe`-c'option(or,equivdDalen!tlye,theG`%compare-strncmp'fdeclaration)isignored.7GChapterf3:High-Lev!elDescriptionofGNUgperf>2333͍Gc3.4Controllingf@Identi ers33!GTheNiden!ti ersofMthefunctions,Ktables,andNconstantsde nedbyMthecoMdegenerated 33Gb!ygperfcanbMecontrolledthroughgperfdeclarationsortheequivdDalen!tcommand-lineGoptions.ThisfisusefulforthreepurpMoses:e 'EstheticsfofthegeneratedcoMde.'FeorfthispurpMose,justusethea!vdDailabledeclarationsoroptionsatwill.e 'Con!trollingftheexpMortedidenti ersofalibrarye.'Assumey!ouincludecoMdegeneratedb!ygperfinalibrarye,andtoa!voidcollisionswith 33'otherlibraries,%ay!ou wantto ensurethatallexpMortediden!ti ersofthislibrarystartwith'afcertainpre x.e'Bydefault,theonlyexpMortediden!ti eristhelookupfunction.Yeoucanthereforeuse'thefoption`-N'(or,equivdDalen!tlye,the`%definelookup-function-name'declaration).'Whenszy!ouusetheoption`-LfC++'(or,}equivdDalentlye,thesz`%language=C++'declaration),'theNonlyexpMortedMen!tityNisaclass.ٔYeoucon!trolitsnamethroughtheoption`-Z'(or,'equivdDalen!tlye,fthe`%defineclass-name'declaration).e 'Allo!wingfmultiplegperfgeneratedcoMdesinasinglecompilationunit.'Assumey!ouinvokegperfmultipletimes,0withdi erentinput les,0andwantthegener-'atedTcoMdetoTbeincludedfromtheTsamesource le. Inthiscase,ey!ouhaveTtocustomize'notFonlytheexpMortediden!ti ers,butalsothenamesoffunctionswith`static'scope,'t!ypMes,fandconstants.'By default,/y!ou!willhaveto!dealwiththeloMokupfunction,/thehashfunction,/and'the|constan!ts.Yeoushould|thereforeusetheoption`-N'(or,equivdDalen!tlye,the`%define'lookup-function-name'adeclaration),Etheoption`-H'a~(or,equivdDalen!tlye,the`%define'hash-function-name'Qdeclaration),andtheRoption`--constants-prefix'(or,equiv-'alen!tlye,fthe`%defineconstants-prefix'declaration).'If y!ouusetheoption`-G'(or,aequivdDalentlye,the`%global-table' declaration),you will'alsoha!vetodealwiththewordarraye,zthelengthtableifpresen!t,yandthestringpMool'ifpresen!t.vThismeans:Yeoushouldusetheoption`-W'(or,QequivdDalen!tlye,Pthe`%define'word-array-name'declaration). #Ify!ouusetheoption`-l'(or,equivdDalentlye,the'`%compare-lengths'*declaration),Ky!oushould*usetheoption`--length-table-name''(or,iequivdDalen!tlye,the<`%defineflength-table-name'toosmallfor (beingsigni can!t{,>andGthereforeftheoutputisnota\w!orkbasedongperf"(inthesenseoftheGPLversion3).!GOntheotherhand,theoutputproMducedb!ygperfcon!tainsessentiallyalloftheinputG le.xTherefore95theoutput96isa\derivdDativ!ework"95oftheinput(inthesenseofU.S.cop!yrightGla!w);yand}itscopyright}statusdepMendsonthecop!yright}oftheinput.bFeormostsoft!wareGlicenses,JtheTresultTisthattheoutputisunderthesamelicense,Kwiththesamecop!yrightGholder,fastheinputthatw!aspassedtogperf.G92433͍GZ4 QInuvokingz]gperf!!GThere`are`manyXoptionstogperf. -Theyw!ereaddedtomak!etheprogrammorecon- 33Gv!enient4for5usewithrealapplications.H\On-line"helpisreadilya!vdDailableviathe`--help'Goption.Herefisthecompletelistofoptions.֦Gc4.1Sps3ecifyingf@theLocationoftheOutputFile%kG`--output-file=file'K:Allo!wsfyoutospMecifythenameofthe letowhichtheoutputiswrittento. ٍ!GThefresultsarewrittentostandardoutputifnooutput leisspMeci edorifitis`-'.Gc4.2Optionsf@thata ectInterpretationoftheInputFile33!GTheseoptionsarealsoa!vdDailableasdeclarationsintheinput le(seeSection3.1.1.2G[GpMerffDeclarations],page16). ٍG`-efkeyword-delimiter-list'G`--delimiters=keyword-delimiter-list'K:Allo!wssyoustoprovideastringscontainingdelimitersusedtosseparatekeywordsK:from'their'attributes.aThedefaultis",".aThisoptionisessen!tialify!ouwantK:to^usek!eywords^that]haveembMeddedcommasornewlines.OneusefultrickisK:tofuse-e'TeAB',whereTABistheliteraltabc!haracter.G`-t'G`--struct-type'K:Allo!wsyoutoincludeastructt!ypMedeclarationforgeneratedcoMde.*An!ytextK:bMeforeC6aC7pairofconsecutiv!e`%%'isconsideredpartofthet!ypMedeclaration.K:Keyw!ordsandadditional eldsmayfollowthis,Sonegroupof eldspMerline.K:AsetofexamplesforgeneratingpMerfecthashtablesandfunctionsforAda,C,K:C++,P!ascal,MoMdulaϨ2,Modulaϧ3ϨandJa!vdDaScriptreservedϧwordsaredistributedK:withfthisrelease.G`--ignore-case'K:ConsiderKuppMerandKlo!werKcaseASCIIKBc!haractersasequivdDalent. ͷThestringK:comparisondwillusedacaseinsigni can!tcharacterdcomparison.NotethatloMcaleK:depMenden!tbcasemappingsareignored.= A &&c<= Z '0guaran!teesthis.)oThisw!astheK:default9in9v!ersionsofgperfearlierthan2.7;]no!wthedefaultistosuppMort8-bitK:andfm!ultibytecharacters.G`-l'G`--compare-lengths'K:Comparek!eywordlengthsbMeforetryingastringcomparison.HDThisoptionisK:mandatoryforbinarycomparisons(seeSection3.3[BinaryStrings],;page22).K:It,alsomigh!tcut+downonthenumbMerofstring+comparisonsmadeduringtheK:loMokup,sincek!eywordswithdi eren!tlengthsarenevercomparedviastrcmp.K:Ho!wever,!9using`-l'mightgreatlyincreasethesizeofthegeneratedCcoMdeifK:theloMokuptablerangeislarge(whic!himpliesthattheswitc!hoption`-S'orK:`%switch'=is.qYGChapterf4:In!vokinggperf%72733͍G`-I' 33G`--includes'K:Include$thenecessarysysteminclude le,,at$thebMeginningoftheK:coMde.zBy>default,9ythisisnotdone;Ktheuserm!ustincludethis=header lehimselfK:tofallo!wcompilationofthecoMde.oG`-G'G`--global-table'K:Generatedthedstatictableofk!eywordsasdastaticglobalvdDariable,ratherthanK:hidingfitinsideoftheloMokupfunction(whic!histhedefaultbeha!vior).nG`-P'G`--pic'KOptimizethegeneratedtableforinclusioninsharedlibraries.ThisreducesK:the;.startuptimeofprogramsusing;/asharedlibrarycon!tainingthegeneratedK:coMde.Ifdtheeoption`-t'(or,2equivdDalen!tlye,the`%struct-type'edeclaration)isalsoK:giv!en,thei rstj eldoftheuser-de nedstructm!ustbMeoft!ypej`int',not`charK:*',ҜbMecauseitwillcon!taino setsintothestringpMoolinsteadofactualstrings.K:Teo con!vert suchano set toastring,you canusetheexpression`stringpoolK:+fo',Fwhereoistheo set.ThestringpMoolnamecanbec!hangedthroughtheK:optionf`--string-pool-name'.G`-Qfstring-pool-name'G`--string-pool-name=string-pool-name'K:Allo!wsyoutospMecifythenameofthegeneratedstringpMoolcreatedb!yoptionK:`-P'.The9defaultnameis`stringpool'.ThisoptionpMermitstheuseoft!wo9hashK:tablesڮinthesame le,lwith`-P'andگev!enwhentheoption`-G'(or,equivdDalen!tlye,K:thef`%global-table'declaration)isgiv!en.G`--null-strings'K:UseNULL`stringsinsteadofempt!ystringsforemptykeywordtableentries.K:Thisreducesthestartuptimeofprogramsusingasharedlibrarycon!tainingK:thegeneratedcoMde(butnotasm!uchasoption`-P'),+attheexpMenseofoneK:moreftest-and-branc!hinstructionatruntime.G`--constants-prefix=prefix'K:Allo!ws[ayoutospMecify[`apre xfortheconstantsTOTAL_KEYWORDS,MIN_WORD_K:LENGTH,MAX_WORD_LENGTH,and8so8on. UThisoptionpMermitstheuseoft!woK:hash!tables!inthesame le,ev!enwhentheoption`-E'(or,equivdDalen!tlye,K:the`%enum'declaration)isnotgiv!enortheoption`-G'(or,ۯequivdDalen!tlye,ۮtheK:`%global-table'fdeclaration)isgiv!en.nG`-Wfhash-table-array-name'G`--word-array-name=hash-table-array-name'K:Allo!wsyoutospMecifythenameforthegeneratedarra!ycontainingthehashK:table. oDefault9Anameis9B`wordlist'. nThisoption9ApMermitstheuse9Boft!woK:hashtablesinthesame le,ev!enwhentheoption`-G'(or,equivdDalen!tlye,theK:`%global-table'fdeclaration)isgiv!en.G`--length-table-name=length-table-array-name'K:Allo!ws&YyoutospMecify&Xthenameforthegeneratedarray&XcontainingthelengthK:table. #oDefaultnameis`lengthtable'. #pThisoptionpMermitstheuseoft!wo}_GChapterf4:In!vokinggperf%72833͍K:lengthtablesinthesame le, ev!enwhentheoption`-G'(or, equivdDalen!tlye, the 33K:`%global-table'fdeclaration)isgiv!en.oG`-Sftotal-switch-statements'G`--switch=total-switch-statements'K:CausesJtheJgeneratedCJ^coMdetouseaswitchstatemen!tscheme,sratherJthanK:anarra!yloMokuptable.ThiscanleadtoareductioninbothtimeandspaceK:requiremen!ts8forsomeinput8 les. 'Theargumentto8thisoptiondeterminesK:ho!wmanyswitchstatementsaregenerated.AvdDalueof1generates1switchK:con!taining‹alltheŒelements,avdDalueofŒ2generates2tableswith1/2theelemen!tsK:ineac!hswitch,Ѻetc.@ThisisusefulsincemanyCcompilerscannotcorrectlyK:generateJxcoMdeJwforlargeswitchstatemen!ts.8Thisoptionw!asinspiredinpartb!yK:KeithfBostic'soriginalCprogram.pG`-T'G`--omit-struct-type'K:Prev!entsS,theS-transferofthet!ypMedeclarationtotheoutput le.UsethisoptionK:iffthet!ypMeisalreadyde nedelsewhere.G`-p'(setofk!eywords=hasthesamenames,.sbutpossessesK:di eren!t^attributes,[orif]theselectedbyte]pMositionsarenotw!ellchosen.1WithK:theH@-DHoptiongperftreatsallthesek!eywordsH@aspartofanequivdDalenceclassJGChapterf4:In!vokinggperf%72933͍K:andgeneratesapMerfecthashfunctionwithm!ultiplecomparisonsforduplicate 33K:k!eywords.zHIt{isup{toy!outocompletelydisam!biguatethekeywords{bymoMdifyingK:theHgeneratedH CHcoMde.qHo!wever,ZgperfhelpsH yououtH byorganizingH theoutput.?K:UsingԖthisoptionusuallymeansthatthegeneratedhashfunctionisnolongerK:pMerfect.UOntheotherhand,itpermitsgperftow!orkonkeywordsetsthatitK:otherwisefcouldnothandle.J֍G`-mfiterations'G`--multiple-iterations=iterations'K:P!erformSmultiplechoicesRofthe`-i'and`-j'vdDalues,$andc!hoMosethebMestresults.K:This/jincreasestherunningtimeb!yafactor/kofiterationsbutdoMesagoodjobK:minimizingfthegeneratedtablesize.G`-ifinitial-value'G`--initial-asso=initial-value'K:Pro!videsc@aninitialvdDalueGfortheassoMciatevaluesarra!ye.{Defaultis0.IncreasingK:theinitialvdDaluehelpsin atethe naltablesize,pMossiblyleadingtomoretimeK:ecien!t@ keywordloMokups.NotethatthisoptionisnotparticularlyusefulwhenK:`-S'jW(or,vYequivdDalen!tlye,vZ`%switch')isjVused.Also,`-i'isjVo!verriddenjWwhenthe`-r'K:optionfisused.G`-jfjump-value'G`--jump=jump-value'K:A ectsFthe\jumpvdDalue",i.e.,ho!wfartoadvancetheassoMciatedb!ytevalueK:upMoncollisions.4Jump-vdDalueHisroundeduptoanoddn!umber,thedefaultis5.K:Iffthejump-vdDalueCmis0gperfjumpsb!yrandomamounts.JՍG`-n'G`--no-strlen'K:InstructsCItisusefulbMothformain!tainingtheprogramK:andfordeterminingwhetheragiv!ensetofoptionsisactuallyspMeedinguptheK:searc!hEforFasolution.L|SomeusefulinformationisdumpMedattheendoftheK:programfwhenthe`-d'optionisenabled.3133͍GZ5 QKnouwnzBugsandLimitationswith]gperf33!GTheffollo!wingaresomelimitationswiththecurrentreleaseofgperf:33 'The8gperf7utilit!yistunedtoexecutequic!klye,,andworksquickly7forsmalltomedium 33'size$2data$3sets(around1000k!eywords).WBItis$2extremelyusefulformain!tainingpMerfect'hashfunctionsforcompilerk!eywordsets.fSincev!ersion3.0, Hgperfalsoworkseciently'onfm!uchlargerkeywordsets(over15,000keywords). 'Thesizeofthegeneratestatick!eywordarraycangetextrpemelylargeiftheinputk!ey-'w!ord8 leislargeorifthekeywordsarequitesimilar.SThistendstoslowdownthe'compilation^of]thegeneratedCFcoMde,andgrpeatly_in atesthe^objectcoMdesize.Ifthis'situationA)oMccurs,Uiconsiderusingthe`-S'optiontoreducedatasize,pMoten!tiallyincreas-'ingthek!eywordrecognitiontimeb!yanegligibleamount.[SincemanyC b> 3 cmmi10:ۍ::::::::::::::::::::::::::::::::::::::::15 330G3.1.1M%[Declarations0:ۍ::::::::::::::::::::::::::::::::::::::::::::::4x15?G3.1.1.1dUser-suppliedfstruct=:ۍ::::::::::::::::::::::::::::::::16?G3.1.1.2dGpMerffDeclarations#m:ۍ:::::::::::::::::::::::::::::::::::16?G3.1.1.3dCfCoMdeInclusionӍ:ۍ::::::::::::::::::::::::::::::::::::)190G3.1.2M%[FeormatfforKeyw!ordEntriesz:ۍ::::::::::::::::::::::::::::::%200G3.1.3M%[IncludingfAdditionalCFeunctions*:ۍ:::::::::::::::::::::::::210G3.1.4M%[Whereftoplacedirectiv!esforGNUindent.䍑:ۍ:::::::::::::::^,21!G3.25OutputfFeormatforGeneratedCCoMdewithgperf&l:ۍ:::::::::::::21!G3.35UsefofNULb!ytes:ۍ:::::::::::::::::::::::::::::::::::::::::::::tN22!G3.45Con!trollingfIdenti ersވ:ۍ:::::::::::::::::::::::::::::::::::::::::`23!G3.55ThefCop!yrightoftheOutput':ۍ::::::::::::::::::::::::::::::::::2333Gc4'7Invokingffggperfa32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: Vc24!G4.15SpMecifyingftheLocationoftheOutputFileh:ۍ:::::::::::::::::::::24!G4.25Optionsfthata ectIn!terpretationoftheInputFile:ۍ:::::::::::::24!G4.35OptionsftospMecifytheLanguagefortheOutputCode:ۍ::::::::::24!G4.45Optionsffor netuningDetailsintheOutputCoMdeٍ:ۍ::::::::::::!25!G4.55Optionsfforc!hangingtheAlgorithmsemployedbygperfq:ۍ:::::::28!G4.65Informativ!efOutput_:ۍ:::::::::::::::::::::::::::::::::::::::::::L3033Gc5'7KnownffBugsandLimitationswithggperfk32k:Q 32:32:32:32: c31!G6'7ThingsffStillLefttoDo|32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: zc32G7'7BibliographyY32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: O!c33GConceptffIndex#C32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: c340;ï%p߆T # cmtt12mN # cmbx12kgff cmmi12g߆Tff cmtt12cNff cmbx12]߆TG cmtt12ZNG cmbx12T߆Tj cmtt12QNj cmbx12F b> 3 cmmi10=. % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % https://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % https://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % https://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is https://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % LaTeX's \typeout. This ensures that the messages it is used for % are identical in format to the corresponding ones from latex/pdflatex. \def\typeout{\immediate\write17}% \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexsp=\sp \let\ptexstar=\* \let\ptexsup=\sup \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Give the space character the catcode for a space. \def\spaceisspace{\catcode`\ =10\relax} % Likewise for ^^M, the end of line character. \def\endlineisspace{\catcode13=10\relax} \chardef\dashChar = `\- \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Output routine % % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. % \domark is called twice inside \chapmacro, to add one % mark before the section break, and one after. % In the second call \prevchapterdefs is the same as \currentchapterdefs, % and \prevsectiondefs is the same as \currentsectiondefs. % Then if the page is not broken at the mark, some of the previous % section appears on the page, and we can get the name of this section % from \firstmark for @everyheadingmarks top. % @everyheadingmarks bottom uses \botmark. % % See page 260 of The TeXbook. \def\domark{% \toks0=\expandafter{\currentchapterdefs}% \toks2=\expandafter{\currentsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\currentcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: marks for @everyheadingmarks top \noexpand\or \the\toks4 \the\toks6 % 1: for @everyheadingmarks bottom \noexpand\else \the\toks8 % 2: color marks }% } % \gettopheadingmarks, \getbottomheadingmarks, % \getcolormarks - extract needed part of mark. % % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url etc.) between @contents and the very first @chapter. \def\gettopheadingmarks{% \ifcase0\the\savedtopmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\the\savedtopmark\fi} % Avoid "undefined control sequence" errors. \def\currentchapterdefs{} \def\currentsectiondefs{} \def\currentsection{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\currentcolordefs{} % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\txipagewidth \newdimen\txipageheight % Main output routine. % \chardef\PAGE = 255 \newtoks\defaultoutput \defaultoutput = {\savetopmark\onepageout{\pagecontents\PAGE}} \output=\expandafter{\the\defaultoutput} \newbox\headlinebox \newbox\footlinebox % When outputting the double column layout for indices, an output routine % is run several times, hiding the original value of \topmark. Hence, save % \topmark at the beginning. % \newtoks\savedtopmark \newif\iftopmarksaved \topmarksavedtrue \def\savetopmark{% \iftopmarksaved\else \global\savedtopmark=\expandafter{\topmark}% \global\topmarksavedtrue \fi } % \onepageout takes a vbox as an argument. % \shipout a vbox for a single page, adding an optional header, footer % and footnote. This also causes index entries for this page to be written % to the auxiliary files. % \def\onepageout#1{% \hoffset=\normaloffset % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % \checkchapterpage % % Make the heading and footing. \makeheadline and \makefootline % use the contents of \headline and \footline. \def\commonheadfootline{\let\hsize=\txipagewidth \texinfochars} \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \global\setbox\headlinebox = \vbox{\commonheadfootline \makeheadline}% \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commonheadfootline \makefootline}% % {% % Set context for writing to auxiliary files like index files. % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \atdummies % don't expand commands in the output. \turnoffactive \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % }% }% \global\topmarksavedfalse \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen % Main part of page, including any footnotes \def\pagebody#1{\vbox to\txipageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Check if we are on the first page of a chapter. Used for printing headings. \newif\ifchapterpage \def\checkchapterpage{% % Get the chapter that was current at the end of the last page \ifcase1\the\savedtopmark\fi \let\prevchaptername\thischaptername % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \let\curchaptername\thischaptername % \ifx\curchaptername\prevchaptername \chapterpagefalse \else \chapterpagetrue \fi } % Argument parsing % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % For example, \def\foo{\parsearg\fooxxx}. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. Pass the result on to % \argremovespace. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argremovespace#1$ $\ArgTerm} % \argremovec might leave us with trailing space, though; e.g., % @end itemize @c foo % Note that the argument cannot contain the TeX $, as its catcode is % changed to \other when Texinfo source is read. \def\argremovespace#1 $#2\ArgTerm{\finishparsearg#1$\ArgTerm} % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it % just before passing the control to \next. % (But first, we have to remove the remaining $ or two.) \def\finishparsearg#1$#2\ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef - define a command taking an argument on the line % % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \long\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo calls \checkenv and executes the definition of \Efoo. \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @- allows explicit insertion of hyphenation points \def\-{\discretionary{\normaldash}{}{}}% % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. \addgroupbox \prevdepth = \dimen1 \checkinserts } \def\addgroupbox{ % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \txipageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\txipageheight \page \fi \fi \box\groupbox } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % This is similar to the 'needspace' module in LaTeX. % The first penalty allows a break if the end of the page is % not too far away. Following penalties and skips are discarded. % Otherwise, require at least \dimen0 of vertical space. % % (We used to use a \vtop to reserve space, but this had spacing issues % when followed by a section heading, as it was not a "discardable item". % This also has the benefit of providing glue before the page break if % there isn't enough space.) \vskip0pt plus \dimen0 \penalty-100 \vskip0pt plus -\dimen0 \vskip \dimen0 \penalty9999 \vskip -\dimen0 \penalty0\relax % this hides the above glue from \safewhatsit and \dobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment \def\c{\begingroup \catcode`\^^M=\active% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \cxxx} {\catcode`\^^M=\active \gdef\cxxx#1^^M{\endgroup}} % \let\comment\c % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent {\restorefirstparagraphindent \indent}% \gdef\noindent{\restorefirstparagraphindent \noindent}% \global\everypar = {\kern -\parindent \restorefirstparagraphindent}% } % \gdef\restorefirstparagraphindent{% \global\let\indent = \ptexindent \global\let\noindent = \ptexnoindent \global\everypar = {}% } % leave vertical mode without cancelling any first paragraph indent \gdef\imageindent{% \toks0=\everypar \everypar={}% \ptexnoindent \global\everypar=\toks0 } % @refill is a no-op. \let\refill=\relax % @setfilename INFO-FILENAME - ignored \let\setfilename=\comment % @bye. \outer\def\bye{\chappager\pagelabels\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newbox\boxB \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % % For LuaTeX % \newif\iftxiuseunicodedestname \txiuseunicodedestnamefalse % For pdfTeX etc. \ifx\luatexversion\thisisundefined \else % Use Unicode destination names \txiuseunicodedestnametrue % Escape PDF strings with converting UTF-16 from UTF-8 \begingroup \catcode`\%=12 \directlua{ function UTF16oct(str) tex.sprint(string.char(0x5c) .. '376' .. string.char(0x5c) .. '377') for c in string.utfvalues(str) do if c < 0x10000 then tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c / 256), math.floor(c % 256))) else c = c - 0x10000 local c_hi = c / 1024 + 0xd800 local c_lo = c % 1024 + 0xdc00 tex.sprint( string.format(string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o' .. string.char(0x5c) .. string.char(0x25) .. '03o', math.floor(c_hi / 256), math.floor(c_hi % 256), math.floor(c_lo / 256), math.floor(c_lo % 256))) end end end } \endgroup \def\pdfescapestrutfsixteen#1{\directlua{UTF16oct('\luaescapestring{#1}')}} % Escape PDF strings without converting \begingroup \directlua{ function PDFescstr(str) for c in string.bytes(str) do if c <= 0x20 or c >= 0x80 or c == 0x28 or c == 0x29 or c == 0x5c then tex.sprint(-2, string.format(string.char(0x5c) .. string.char(0x25) .. '03o', c)) else tex.sprint(-2, string.char(c)) end end end } % The -2 in the arguments here gives all the input to TeX catcode 12 % (other) or 10 (space), preventing undefined control sequence errors. See % https://lists.gnu.org/archive/html/bug-texinfo/2019-08/msg00031.html % \endgroup \def\pdfescapestring#1{\directlua{PDFescstr('\luaescapestring{#1}')}} \ifnum\luatexversion>84 % For LuaTeX >= 0.85 \def\pdfdest{\pdfextension dest} \let\pdfoutput\outputmode \def\pdfliteral{\pdfextension literal} \def\pdfcatalog{\pdfextension catalog} \def\pdftexversion{\numexpr\pdffeedback version\relax} \let\pdfximage\saveimageresource \let\pdfrefximage\useimageresource \let\pdflastximage\lastsavedimageresourceindex \def\pdfendlink{\pdfextension endlink\relax} \def\pdfoutline{\pdfextension outline} \def\pdfstartlink{\pdfextension startlink} \def\pdffontattr{\pdfextension fontattr} \def\pdfobj{\pdfextension obj} \def\pdflastobj{\numexpr\pdffeedback lastobj\relax} \let\pdfpagewidth\pagewidth \let\pdfpageheight\pageheight \edef\pdfhorigin{\pdfvariable horigin} \edef\pdfvorigin{\pdfvariable vorigin} \fi \fi % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi \newif\ifpdforxetex \pdforxetexfalse \ifpdf \pdforxetextrue \fi \ifx\XeTeXrevision\thisisundefined\else \pdforxetextrue \fi % Output page labels information. % See PDF reference v.1.7 p.594, section 8.3.1. % Page label ranges must be increasing. \ifpdf \def\pagelabels{% \def\title{0 << /P (T-) /S /D >>}% % % support @contents at very end of document \ifnum\contentsendcount=\pagecount \ifnum\arabiccount<\romancount \pdfcatalog{/PageLabels << /Nums [\title \the\arabiccount << /S /D >> \the\romancount << /S /r >> ] >> }\relax \fi % no contents in document \else\ifnum\contentsendcount=0 \pdfcatalog{/PageLabels << /Nums [\title \the\arabiccount << /S /D >> ] >> }\relax \else \pdfcatalog{/PageLabels << /Nums [\title \the\romancount << /S /r >> \the\contentsendcount << /S /D >> ] >> }\relax \fi\fi } \else \let\pagelabels\relax \fi \newcount\pagecount \pagecount=0 \newcount\romancount \romancount=0 \newcount\arabiccount \arabiccount=0 \newcount\contentsendcount \contentsendcount=0 \ifpdf \let\ptxadvancepageno\advancepageno \def\advancepageno{% \ptxadvancepageno\global\advance\pagecount by 1 } \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \xdef#1{#1}% \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \def\txiescapepdfutfsixteen#1{% \ifx\pdfescapestrutfsixteen\thisisundefined % No UTF-16 converting macro available. \txiescapepdf{#1}% \else \xdef#1{\pdfescapestrutfsixteen{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros using ideas from pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. The dark red here is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. We use % black by default, though. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % rg sets the color for filling (usual text, etc.); % RG sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\curcolor{0 0 0}% \def\setcolor#1{% \ifx#1\curcolor\else \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% \xdef\curcolor{#1}% \fi } % \let\maincolor\rgbBlack \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname \ifx \declaredencoding \latone % Pass through Latin-1 characters. % LuaTeX with byte wise I/O converts Latin-1 characters to Unicode. \else \ifx \declaredencoding \utfeight % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \fi \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \indexnofonts \makevalueexpandable \turnoffactive \ifx \declaredencoding \latone % The PDF format can use an extended form of Latin-1 in bookmark % strings. See Appendix D of the PDF Reference, Sixth Edition, for % the "PDFDocEncoding". \passthroughcharstrue % Pass through Latin-1 characters. % LuaTeX: Convert to Unicode % pdfTeX: Use Latin-1 as PDFDocEncoding \def\pdfoutlinetext{#1}% \else \ifx \declaredencoding \utfeight \ifx\luatexversion\thisisundefined % For pdfTeX with UTF-8. % TODO: the PDF format can use UTF-16 in bookmark strings, % but the code for this isn't done yet. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \else % For LuaTeX with UTF-8. % Pass through Unicode characters for title texts. \passthroughcharstrue \def\pdfoutlinetext{#1}% \fi \else % For non-Latin-1 or non-UTF-8 encodings. % Use ASCII approximations. \passthroughcharsfalse \def\pdfoutlinetext{#1}% \fi \fi % LuaTeX: Convert to UTF-16 % pdfTeX: Use Latin-1 as PDFDocEncoding \txiescapepdfutfsixteen\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use black for everything. \def\urlcolor{\rgbBlack} \let\linkcolor\rgbBlack \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \pdfoutline goto name{\pdfmkpgn{\pdfdestname}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} % \pdfgettoks - Surround page numbers in #1 with @pdflink. #1 may % be a simple number, or a list of numbers in the case of an index % entry. \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{\pdflinkpage{#1}{#1}}% \def\pdflinkpage#1#2{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#2\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput % % For XeTeX % \ifx\XeTeXrevision\thisisundefined \else % % XeTeX version check % \ifnum\strcmp{\the\XeTeXversion\XeTeXrevision}{0.99996}>-1 % TeX Live 2016 contains XeTeX 0.99996 and xdvipdfmx 20160307. % It can use the `dvipdfmx:config' special (from TeX Live SVN r40941). % For avoiding PDF destination name replacement, we use this special % instead of xdvipdfmx's command line option `-C 0x0010'. \special{dvipdfmx:config C 0x0010} % XeTeX 0.99995+ comes with xdvipdfmx 20160307+. % It can handle Unicode destination names for PDF. \txiuseunicodedestnametrue \else % XeTeX < 0.99996 (TeX Live < 2016) cannot use the % `dvipdfmx:config' special. % So for avoiding PDF destination name replacement, % xdvipdfmx's command line option `-C 0x0010' is necessary. % % XeTeX < 0.99995 can not handle Unicode destination names for PDF % because xdvipdfmx 20150315 has a UTF-16 conversion issue. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). \txiuseunicodedestnamefalse \fi % % Color support % \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % \def\pdfsetcolor#1{\special{pdf:scolor [#1]}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\currentcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\currentcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % PDF outline support % % Emulate pdfTeX primitive \def\pdfdest name#1 xyz{% \special{pdf:dest (#1) [@thispage /XYZ @xpos @ypos null]}% } % \def\setpdfdestname#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \makevalueexpandable \turnoffactive \iftxiuseunicodedestname % Pass through Unicode characters. \else % Use ASCII approximations in destination names. \passthroughcharsfalse \fi \def\pdfdestname{#1}% \txiescapepdf\pdfdestname }} % \def\setpdfoutlinetext#1{{% \turnoffactive % Always use Unicode characters in title texts. \def\pdfoutlinetext{#1}% % For XeTeX, xdvipdfmx converts to UTF-16. % So we do not convert. \txiescapepdf\pdfoutlinetext }} % \def\pdfmkdest#1{% \setpdfdestname{#1}% \safewhatsit{\pdfdest name{\pdfdestname} xyz}% } % % by default, use black for everything. \def\urlcolor{\rgbBlack} \def\linkcolor{\rgbBlack} \def\endlink{\setcolor{\maincolor}\pdfendlink} % \def\dopdfoutline#1#2#3#4{% \setpdfoutlinetext{#1} \setpdfdestname{#3} \ifx\pdfdestname\empty \def\pdfdestname{#4}% \fi % \special{pdf:out [-] #2 << /Title (\pdfoutlinetext) /A << /S /GoTo /D (\pdfdestname) >> >> }% } % \def\pdfmakeoutlines{% \begingroup % % For XeTeX, counts of subentries are not necessary. % Therefore, we read toc only once. % % We use node names as destinations. % % Currently we prefix the section name with the section number % for chapter and appendix headings only in order to avoid too much % horizontal space being required in the PDF viewer. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \dopdfoutline{##2 ##1}{1}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{2}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{3}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% \dopdfoutline{##1}{4}{##3}{##4}}% % \let\appentry\numchapentry% \let\appsecentry\numsecentry% \let\appsubsecentry\numsubsecentry% \let\appsubsubsecentry\numsubsubsecentry% \def\unnchapentry##1##2##3##4{% \dopdfoutline{##1}{1}{##3}{##4}}% \let\unnsecentry\numsecentry% \let\unnsubsecentry\numsubsecentry% \let\unnsubsubsecentry\numsubsubsecentry% % % For XeTeX, xdvipdfmx converts strings to UTF-16. % Therefore, the encoding and the language may not be considered. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] \special{pdf:docview << /PageMode /UseOutlines >> } % ``\special{pdf:tounicode ...}'' is not necessary % because xdvipdfmx converts strings from UTF-8 to UTF-16 without it. % However, due to a UTF-16 conversion issue of xdvipdfmx 20150315, % ``\special{pdf:dest ...}'' cannot handle non-ASCII strings. % It is fixed by xdvipdfmx 20160106 (TeX Live SVN r39753). % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \special{pdf:bann << /Border [0 0 0] /Subtype /Link /A << /S /URI /URI (#1) >> >>}% \endgroup} \def\endlink{\setcolor{\maincolor}\special{pdf:eann}} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{\pdflinkpage{#1}{#1}}% \def\pdflinkpage#1#2{% \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (#1) >> >>}% \setcolor{\linkcolor}#2\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} % % % @image support % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\doxeteximage#1#2#3{% \def\xeteximagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\xeteximageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % XeTeX (and the PDF format) supports .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\xeteximgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errmessage{Could not find image file #1 for XeTeX}% \else \gdef\xeteximgext{JPG}% \fi \else \gdef\xeteximgext{jpeg}% \fi \else \gdef\xeteximgext{jpg}% \fi \else \gdef\xeteximgext{png}% \fi \else \gdef\xeteximgext{PDF}% \fi \else \gdef\xeteximgext{pdf}% \fi \closein 1 \endgroup % % Putting an \hbox around the image can prevent an over-long line % after the image. \hbox\bgroup \def\xetexpdfext{pdf}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \def\xetexpdfext{PDF}% \ifx\xeteximgext\xetexpdfext \XeTeXpdffile "#1".\xeteximgext "" \else \XeTeXpicfile "#1".\xeteximgext "" \fi \fi \ifdim \wd0 >0pt width \xeteximagewidth \fi \ifdim \wd2 >0pt height \xeteximageheight \fi \relax \egroup } \fi % \message{fonts,} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% \ifx#2\ttshape\hyphenchar#1=-1 \fi \ifx#2\ttbshape\hyphenchar#1=-1 \fi \ifx#2\ttslshape\hyphenchar#1=-1 \fi } % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defsl\slshape{10}{\magstep1}{OT1} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\ttslfont=\defttsl \let\slfont=\defsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secrmnotbold\rmshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acronym in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defsl\slshape{10}{\magstephalf}{OT1} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\ttfont=\deftt \let\bffont = \defbf \let\slfont=\defsl \let\ttslfont=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for math mode superscripts (7pt). \def\sevennominalsize{7pt} \setfont\sevenrm\rmshape{7}{1000}{OT1} \setfont\seventt\ttshape{10}{700}{OT1TT} \setfont\sevenbf\bfshape{10}{700}{OT1} \setfont\sevenit\itshape{7}{1000}{OT1IT} \setfont\sevensl\slshape{10}{700}{OT1} \setfont\sevensf\sfshape{10}{700}{OT1} \setfont\sevensc\scshape{10}{700}{OT1} \setfont\seventtsl\ttslshape{10}{700}{OT1TT} \font\seveni=cmmi7 \font\sevensy=cmsy7 \def\sevenecsize{0700} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acronym in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname #1font\endcsname % change the current font } \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. % We don't bother to reset \scriptscriptfont; awaiting user need. % \def\resetmathfonts{% \textfont0=\rmfont \textfont1=\ifont \textfont2=\syfont \textfont\itfam=\itfont \textfont\slfam=\slfont \textfont\bffam=\bffont \textfont\ttfam=\ttfont \textfont\sffam=\sffont % % Fonts for superscript. Note that the 7pt fonts are used regardless % of the current font size. \scriptfont0=\sevenrm \scriptfont1=\seveni \scriptfont2=\sevensy \scriptfont\itfam=\sevenit \scriptfont\slfam=\sevensl \scriptfont\bffam=\sevenbf \scriptfont\ttfam=\seventt \scriptfont\sffam=\sevensf } % \defineassignfonts{SIZE} - % Define sequence \assignfontsSIZE, which switches between font sizes % by redefining the meanings of \STYLEfont. (Just \STYLE additionally sets % the current \fam for math mode.) % \def\defineassignfonts#1{% \expandafter\edef\csname assignfonts#1\endcsname{% \let\noexpand\rmfont\csname #1rm\endcsname \let\noexpand\itfont\csname #1it\endcsname \let\noexpand\slfont\csname #1sl\endcsname \let\noexpand\bffont\csname #1bf\endcsname \let\noexpand\ttfont\csname #1tt\endcsname \let\noexpand\smallcaps\csname #1sc\endcsname \let\noexpand\sffont \csname #1sf\endcsname \let\noexpand\ifont \csname #1i\endcsname \let\noexpand\syfont \csname #1sy\endcsname \let\noexpand\ttslfont\csname #1ttsl\endcsname } } \def\assignfonts#1{% \csname assignfonts#1\endcsname } \newif\ifrmisbold % Select smaller font size with the current style. Used to change font size % in, e.g., the LaTeX logo and acronyms. If we are using bold fonts for % normal roman text, also use bold fonts for roman text in the smaller size. \def\switchtolllsize{% \expandafter\assignfonts\expandafter{\lllsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% \def\switchtolsize{% \expandafter\assignfonts\expandafter{\lsize}% \ifrmisbold \let\rmfont\bffont \fi \csname\curfontstyle\endcsname }% % Define the font-changing commands (all called \...fonts). % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used % in, e.g., the LaTeX logo and acronyms. % % Note: The fonts used for \ifont are for "math italics" (\itfont is for % italics in regular text). \syfont is also used in math mode only. % \def\definefontsetatsize#1#2#3#4#5{% \defineassignfonts{#1}% \expandafter\def\csname #1fonts\endcsname{% \def\curfontsize{#1}% \def\lsize{#2}\def\lllsize{#3}% \csname rmisbold#5\endcsname \csname assignfonts#1\endcsname \resetmathfonts \setleading{#4}% }} \definefontsetatsize{text} {reduced}{smaller}{\textleading}{false} \definefontsetatsize{title} {chap} {subsec} {27pt} {true} \definefontsetatsize{chap} {sec} {text} {19pt} {true} \definefontsetatsize{sec} {subsec} {reduced}{17pt} {true} \definefontsetatsize{ssec} {text} {small} {15pt} {true} \definefontsetatsize{reduced}{small} {smaller}{10.5pt}{false} \definefontsetatsize{small} {smaller}{smaller}{10.5pt}{false} \definefontsetatsize{smaller}{smaller}{smaller}{9.5pt} {false} \def\titlefont#1{{\titlefonts\rm #1}} \let\subsecfonts = \ssecfonts \let\subsubsecfonts = \ssecfonts % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. #1 is what to % print if we are indeed using \tt; #2 is what to print otherwise. \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Check if internal flag is clear, i.e. has not been @set. \def\ifflagclear#1#2#3{% \expandafter\ifx\csname SET#1\endcsname\relax #2\else#3\fi } { \catcode`\'=\active \catcode`\`=\active \gdef\setcodequotes{\let`\codequoteleft \let'\codequoteright} \gdef\setregularquotes{\let`\lq \let'\rq} } \setregularquotes % output for ' in @code % in tt font hex 0D (undirected) or 27 (curly right quote) % \def\codequoteright{% \ifusingtt {\ifflagclear{txicodequoteundirected}% {\ifflagclear{codequoteundirected}% {'}% {\char"0D }}% {\char"0D }}% {'}% } % output for ` in @code % in tt font hex 12 (grave accent) or 60 (curly left quote) % \relax disables Spanish ligatures ?` and !` of \tt font. % \def\codequoteleft{% \ifusingtt {\ifflagclear{txicodequotebacktick}% {\ifflagclear{codequotebacktick}% {\relax`}% {\char"12 }}% {\char"12 }}% {\relax`}% } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % Turn them on by default \let\SETtxicodequoteundirected = t \let\SETtxicodequotebacktick = t % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless the following character is such as % not to need one. \def\smartitaliccorrection{\futurelet\next\smartitaliccorrectionx} \def\smartitaliccorrectionx{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % @cite unconditionally uses \sl with \smartitaliccorrection. \def\cite#1{{\sl #1}\smartitaliccorrection} % @var unconditionally uses \sl. This gives consistency for % parameter names whether they are in @def, @table @code or a % regular paragraph. % To get ttsl font for @var when used in code context, @set txicodevaristt. % The \null is to reset \spacefactor. \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% % \ifflagclear{txicodevaristt}% {\def\varnext{{{\sl #1}}\smartitaliccorrection}}% {\def\varnext{\smartslanted{#1}}}% \varnext } % To be removed after next release \def\SETtxicodevaristt{}% @set txicodevaristt \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % @r for roman font, used for code comment \def\r#1{{% \usenormaldash % get --, --- ligatures even if in @code \defcharsdefault % in case on def line \rm #1}} {\catcode`-=\active \gdef\usenormaldash{\let-\normaldash}} % @sc, undocumented @ii. \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} \newif\iffrenchspacing \frenchspacingfalse % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \iffrenchspacing\else \frenchspacingtrue \sfcode`\.=\@m \sfcode`\?=\@m \sfcode`\!=\@m \sfcode`\:=\@m \sfcode`\;=\@m \sfcode`\,=\@m \def\endofsentencespacefactor{1000}% for @. and friends \fi } \def\plainnonfrenchspacing{% \iffrenchspacing \frenchspacingfalse \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends \fi } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \let\frenchspacingsetting\plainnonfrenchspacing % used in output routine \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \let\frenchspacingsetting\plainfrenchspacing \else\ifx\temp\offword \let\frenchspacingsetting\plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi \frenchspacingsetting } % @t, explicit typewriter. \def\t#1{% {\tt \defcharsdefault \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setcodequotes\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % This is for LuaTeX: It is not sufficient to disable hyphenation at % explicit dashes by setting `\hyphenchar` to -1. \def\dashnobreak{% \normaldash \penalty 10000 } % We must turn on hyphenation at `-' and `_' in @code. % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % We explicitly allow hyphenation at these characters % using \discretionary. % % Hyphenation at - and hyphenation within words was turned off % by default for the tt fonts using the \hyphenchar parameter of TeX. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setcodequotes \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\dashnobreak \let_\realunder \fi \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -, or % (c) we are at the start of the string. % In both cases (b) and (c), \codedashnobreak should be set to \codedash. % % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashnobreak\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashnobreak= \next } } \def\normaldash{-} % \def\codex #1{\tclose{% % Given -foo (with a single dash), we do not want to allow a break % after the -. \codedashnobreak is set to the first character in % @code. \futurelet\codedashnobreak\relax #1% }\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') aka @url takes an optional % (comma-separated) second argument specifying the text to display and % an optional third arg as text to display instead of (rather than in % addition to) the url itself. First (mandatory) arg is the url. % TeX-only option to allow changing PDF output to show only the second % arg (if given), and not the url (which is then just the link target). \newif\ifurefurlonlylink % The default \pretolerance setting stops the penalty inserted in % \urefallowbreak being a discouragement to line breaking. Set it to % a negative value for this paragraph only. Hopefully this does not % conflict with redefinitions of \par done elsewhere. \def\nopretolerance{% \pretolerance=-1 \def\par{\endgraf\pretolerance=100 \let\par\endgraf}% } % The main macro is \urefbreak, which allows breaking at expected % places within the url. \def\urefbreak{\nopretolerance \begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak % \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% look for second arg \ifdim\wd0 > 0pt \ifpdf % For pdfTeX and LuaTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \else \ifx\XeTeXrevision\thisisundefined \unhbox0\ (\urefcode{#1})% DVI, always show arg and url \else % For XeTeX \ifurefurlonlylink % PDF plus option to not display url, show just arg \unhbox0 \else % PDF, normally display both arg and url for consistency, % visibility, if the pdf is eventually used to print, etc. \unhbox0\ (\urefcode{#1})% \fi \fi \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode`\&=\active \catcode`\.=\active \catcode`\#=\active \catcode`\?=\active \catcode`\/=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setcodequotes \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } \def\urefcodeamp{\urefprebreak \&\urefpostbreak} \def\urefcodedot{\urefprebreak .\urefpostbreak} \def\urefcodehash{\urefprebreak \#\urefpostbreak} \def\urefcodequest{\urefprebreak ?\urefpostbreak} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprebreak \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpostbreak \fi } } % By default we'll break after the special characters, but some people like to % break before the special chars, so allow that. Also allow no breaking at % all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\urefallowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\urefallowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} % Allow a ragged right output to aid breaking long URL's. There can % be a break at the \allowbreak with no extra glue (if the existing stretch in % the line is sufficient), a break at the \penalty with extra glue added % at the end of the line, or no break at all here. % Changing the value of the penalty and/or the amount of stretch affects how % preferable one choice is over the other. \def\urefallowbreak{% \penalty0\relax \hskip 0pt plus 2 em\relax \penalty1000\relax \hskip 0pt plus -2 em\relax } \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdforxetex \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct \def\kbd#1{% \tclose{\kbdfont\setcodequotes#1}% } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. % \def\key#1{{\setregularquotes \tt #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\switchtolsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \ifmmode\else % only go into math if not in math mode already \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot % have to provide another name for sup operator \let\mathopsup=\sup $\expandafter\finishmath\fi } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % for @sub and @sup, if in math mode, just do a normal sub/superscript. % If in text, use math to place as sub/superscript, but switch % into text mode, with smaller fonts. This is a different font than the % one used for real math sub/superscripts (8pt vs. 7pt), but let's not % fix it (significant additions to font machinery) until someone notices. % \def\sub{\ifmmode \expandafter\sb \else \expandafter\finishsub\fi} \def\finishsub#1{$\sb{\hbox{\switchtolllsize #1}}$}% % \def\sup{\ifmmode \expandafter\ptexsp \else \expandafter\finishsup\fi} \def\finishsup#1{$\ptexsp{\hbox{\switchtolllsize #1}}$}% % provide this command from LaTeX as it is very common \def\frac#1#2{{{#1}\over{#2}}} % @displaymath. % \globaldefs is needed to recognize the end lines in \tex and % \end tex. Set \thisenv as @end displaymath is seen before @end tex. {\obeylines \globaldefs=1 \envdef\displaymath{% \tex% \def\thisenv{\displaymath}% \begingroup\let\end\displaymathend% $$% } \def\displaymathend{$$\endgroup\end}% \def\Edisplaymath{% \def\thisenv{\tex}% \end tex }} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % % @inlinefmtifelse{FMTNAME,THEN-TEXT,ELSE-TEXT} expands THEN-TEXT if % FMTNAME is tex, else ELSE-TEXT. \long\def\inlinefmtifelse#1{\doinlinefmtifelse #1,,,\finish} \long\def\doinlinefmtifelse#1,#2,#3,#4,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\else \ignorespaces #3\fi } % % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } % @inlineifset{VAR, TEXT} expands TEXT if VAR is @set. % \long\def\inlineifset#1{\doinlineifset #1,\finish} \long\def\doinlineifset#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \else\ignorespaces#2\fi } % @inlineifclear{VAR, TEXT} expands TEXT if VAR is not @set. % \long\def\inlineifclear#1{\doinlineifclear #1,\finish} \long\def\doinlineifclear#1,#2,\finish{% \def\inlinevarname{#1}% \expandafter\ifx\csname SET\inlinevarname\endcsname\relax \ignorespaces#2\fi } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. \def\lbracechar{{\ifusingtt{\char123}{\ensuremath\lbrace}}} \def\rbracechar{{\ifusingtt{\char125}{\ensuremath\rbrace}}} \let\{=\lbracechar \let\}=\rbracechar % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\switchtolllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else \ifx\curfontsize\smallword % For footnotes and indices \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \switchtolllsize A% \fi \fi }% \vss }}% \kern-.15em \TeX } \def\smallword{small} % Some math mode symbols. Define \ensuremath to switch into math mode % unless we are already there. Expansion tricks may not be needed here, % but safer, and can't hurt. \def\ensuremath{\ifmmode \expandafter\asis \else\expandafter\ensuredmath \fi} \def\ensuredmath#1{$\relax#1$} % \def\bullet{\ensuremath\ptexbullet} \def\geq{\ensuremath\ge} \def\leq{\ensuremath\le} \def\minus{\ensuremath-} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\ttfont \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\ifusingtt{\ecfont\char"BF}{\it\$}}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % \def\L{{\ecfont \char"8A}} % L with stroke \def\l{{\ecfont \char"AA}} % l with stroke % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the European Computer Modern fonts (cm-super in outline format) % for non-CM glyphs. That is ec* for regular text and tc* for the text % companion symbols (LaTeX TS1 encoding). Both are part of the ec % package and follow the same conventions. % \def\ecfont{\etcfont{e}} \def\tcfont{\etcfont{t}} % \def\etcfont#1{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifusingtt % typewriter: {\font\thisecfont = #1ctt\ecsize \space at \nominalsize}% % else {\ifx\curfontstyle\bfstylename % bold: \font\thisecfont = #1cb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = #1c\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi}% \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\switchtolllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{% \ifmmode ^\circ \else {\tcfont \char 176}% \fi} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quoteleft=`\` \chardef\quoteright=`\' % only change font for tt for correct kerning and to avoid using % \ecfont unless necessary. \def\quotedblleft{% \ifusingtt{{\ecfont\char"10}}{{\char"5C}}% } \def\quotedblright{% \ifusingtt{{\ecfont\char"11}}{{\char`\"}}% } \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % @setcontentsaftertitlepage used to do an implicit @contents or % @shortcontents after @end titlepage, but it is now obsolete. \def\setcontentsaftertitlepage{% \errmessage{@setcontentsaftertitlepage has been removed as a Texinfo command; move your @contents command if you want the contents after the title page.}}% \def\setshortcontentsaftertitlepage{% \errmessage{@setshortcontentsaftertitlepage has been removed as a Texinfo command; move your @shortcontents and @contents commands if you want the contents after the title page.}}% \parseargdef\shorttitlepage{% {\headingsoff \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page}\pageone} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts \headingsoff % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \pageone \endgroup % } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. \par should % be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rm \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\rmfont \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rm \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenchapheadline% headline on even pages with a new chapter \newtoks\oddchapheadline % headline on odd pages with a new chapter \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make \makeheadline and \makefootline in Plain TeX use those variables \headline={{\textfonts\rm\frenchspacingsetting \ifchapterpage \ifodd\pageno\the\oddchapheadline\else\the\evenchapheadline\fi \else \ifodd\pageno\the\oddheadline\else\the\evenheadline\fi \fi}} \footline={{\textfonts\rm\frenchspacingsetting \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}% \HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}} \global\evenchapheadline=\evenheadline} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}% \global\oddchapheadline=\oddheadline} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\txipageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks % These define \getoddheadingmarks, \getevenheadingmarks, % \getoddfootingmarks, and \getevenfootingmarks, each to one of % \gettopheadingmarks, \getbottomheadingmarks. % \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \parseargdef\everyheadingmarks{\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \parseargdef\everyfootingmarks{\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \parseargdef\headings{\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}\evenchapheadline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}\oddchapheadline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting % Set the page number to 1. \def\pageone{ \global\pageno=1 \global\arabiccount = \pagecount } \let\contentsalignmacro = \chappager % \def\HEADINGSon{\HEADINGSdouble} % defined by \CHAPPAGon % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdouble} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdouble{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\folio\hfil\thistitle}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsingle} \def\HEADINGSsingle{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline={\line{\hfil\folio}} \global\oddchapheadline={\line{\hfil\folio}} \global\let\contentsalignmacro = \chappager } % for @setchapternewpage off \def\HEADINGSsinglechapoff{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\evenchapheadline=\evenheadline \global\oddchapheadline=\oddheadline \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark so that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \ifinner\else \vadjust{\penalty 1200}% not good to break after first line of item. \fi % We can be in inner vertical mode in a footnote, although an % @itemize looks awful there. }% \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @multitable macros % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % @headitem starts a heading row, which we typeset in bold. Assignments % have to be global since we are inside the implicit group of an % alignment entry. \everycr below resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \crcr % must appear first \gdef\headitemcrhook{\nobreak}% attempt to avoid page break after headings \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % default for tables with no headings. \let\headitemcrhook=\relax % \def\tab{\checkenv\multitable &\the\everytab}% \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \parskip=0pt \parindent=6pt \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% Reset from possible headitem. \global\colcount=0 % Reset the column counter. % % Check for saved footnotes, etc.: \checkinserts % % Perhaps a \nobreak, then reset: \headitemcrhook \global\let\headitemcrhook=\relax }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \strut \vtop{% \advance\hsize by -1\leftskip % Find the correct column width \hsize=\expandafter\csname col\the\colcount\endcsname % \advance\rightskip by -1\rightskip % Zero leaving only any stretch \ifnum\colcount=1 \advance\hsize by\leftskip % Add indent of surrounding text \else % In order to keep entries from bumping into each other. \leftskip=12pt \ifsetpercent \else % If a template has been used \advance\hsize by \leftskip \fi \fi \noindent\ignorespaces##\unskip\strut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotlatex, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotlatex} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\iflatex{\doignore{iflatex}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\latex{\doignore{latex}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\-=\active \catcode`\_=\active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % Like \expandablevalue, but completely expandable (the \message in the % definition above operates at the execution level of TeX). Used when % writing to auxiliary files, due to the expansion that \write does. % If flag is undefined, pass through an unexpanded @value command: maybe it % will be set by the time it is read back in. % % NB flag names containing - or _ may not work here. \def\dummyvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax \string\value{#1}% \else \csname SET#1\endcsname \fi } % Used for @value's in index entries to form the sort key: expand the @value % if possible, otherwise sort late. \def\indexnofontsvalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax ZZZZZZZ% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {IX} defines an index named IX. % It automatically defines \IXindex such that % \IXindex ...rest of line... puts an entry in the index IX. % It also defines \IXindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is IX. % \def\newindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \expandafter\chardef\csname#1indfile\endcsname=0 \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % The default indices: \newindex{cp}% concepts, \newcodeindex{fn}% functions, \newcodeindex{vr}% variables, \newcodeindex{tp}% types, \newcodeindex{ky}% keys \newcodeindex{pg}% and programs. % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% \requireopenindexfile{#3}% % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all index macros. % Argument #1 is generated by the calling \fooindex macro, % and it is the two-letter name of the index. \def\doindex#1{\edef\indexname{#1}\parsearg\doindexxxx} \def\doindexxxx #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\docodeindexxxx} \def\docodeindexxxx #1{\docind{\indexname}{#1}} % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % % For control letters, we have \definedummyletter, which omits the % space. % \def\definedummyword #1{\def#1{\string#1\space}}% \def\definedummyletter#1{\def#1{\string#1}}% % Used for the aux, toc and index files to prevent expansion of Texinfo % commands. Most of the commands are controlled through the % \ifdummies conditional. % \def\atdummies{% \dummiestrue % \definedummyletter\@% \definedummyletter\ % \definedummyletter\{% \definedummyletter\}% \definedummyletter\&% % \definedummyletter\_% \definedummyletter\-% % \definedummyword\subentry % % We want to disable all macros so that they are not expanded by \write. \let\commondummyword\definedummyword \macrolist \let\value\dummyvalue % \turnoffactive } \newif\ifdummies \newif\ifindexnofonts \def\commondummyletter#1{% \expandafter\let\csname\string#1:impl\endcsname#1% \edef#1{% \noexpand\ifindexnofonts % empty expansion \noexpand\else \noexpand\ifdummies\string#1% \noexpand\else \noexpand\jumptwofi % dispose of the \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } \def\commondummyaccent#1{% \expandafter\let\csname\string#1:impl\endcsname#1% \edef#1{% \noexpand\ifindexnofonts \noexpand\expandafter % dispose of \else ... \fi \noexpand\asis \noexpand\else \noexpand\ifdummies\string#1% \noexpand\else \noexpand\jumptwofi % dispose of the \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } % Like \commondummyaccent but add a \space at the end of the dummy expansion % #2 is the expansion used for \indexnofonts. #2 is always followed by % \asis to remove a pair of following braces. \def\commondummyword#1#2{% \expandafter\let\csname\string#1:impl\endcsname#1% \expandafter\def\csname\string#1:ixnf\endcsname{#2\asis}% \edef#1{% \noexpand\ifindexnofonts \noexpand\expandafter % dispose of \else ... \fi \expandafter\noexpand\csname\string#1:ixnf\endcsname \noexpand\else \noexpand\ifdummies\string#1\space \noexpand\else \noexpand\jumptwofi % dispose of the \fi \fi \expandafter\noexpand\csname\string#1:impl\endcsname \noexpand\fi \noexpand\fi}% } \def\jumptwofi#1\fi\fi{\fi\fi#1} % For \atdummies and \indexnofonts. \atdummies sets % \dummiestrue and \indexnofonts sets \indexnofontstrue. \def\definedummies{ % @-sign is always an escape character when reading auxiliary files \escapechar = `\@ % \commondummyletter\!% \commondummyaccent\"% \commondummyaccent\'% \commondummyletter\*% \commondummyaccent\,% \commondummyletter\.% \commondummyletter\/% \commondummyletter\:% \commondummyaccent\=% \commondummyletter\?% \commondummyaccent\^% \commondummyaccent\`% \commondummyaccent\~% % % Control letters and accents. \commondummyword\u {}% \commondummyword\v {}% \commondummyword\H {}% \commondummyword\dotaccent {}% \commondummyword\ogonek {}% \commondummyword\ringaccent {}% \commondummyword\tieaccent {}% \commondummyword\ubaraccent {}% \commondummyword\udotaccent {}% \commondummyword\dotless {}% % % Texinfo font commands. \commondummyword\b {}% \commondummyword\i {}% \commondummyword\r {}% \commondummyword\sansserif {}% \commondummyword\sc {}% \commondummyword\slanted {}% \commondummyword\t {}% % % Commands that take arguments. \commondummyword\abbr {}% \commondummyword\acronym {}% \commondummyword\anchor {}% \commondummyword\cite {}% \commondummyword\code {}% \commondummyword\command {}% \commondummyword\dfn {}% \commondummyword\dmn {}% \commondummyword\email {}% \commondummyword\emph {}% \commondummyword\env {}% \commondummyword\file {}% \commondummyword\image {}% \commondummyword\indicateurl{}% \commondummyword\inforef {}% \commondummyword\kbd {}% \commondummyword\key {}% \commondummyword\link {}% \commondummyword\math {}% \commondummyword\option {}% \commondummyword\pxref {}% \commondummyword\ref {}% \commondummyword\samp {}% \commondummyword\strong {}% \commondummyword\tie {}% \commondummyword\U {}% \commondummyword\uref {}% \commondummyword\url {}% \commondummyword\var {}% \commondummyword\verb {}% \commondummyword\w {}% \commondummyword\xref {}% % \commondummyword\AA {AA}% \commondummyword\AE {AE}% \commondummyword\DH {DZZ}% \commondummyword\L {L}% \commondummyword\O {O}% \commondummyword\OE {OE}% \commondummyword\TH {TH}% \commondummyword\aa {aa}% \commondummyword\ae {ae}% \commondummyword\dh {dzz}% \commondummyword\exclamdown {!}% \commondummyword\l {l}% \commondummyword\o {o}% \commondummyword\oe {oe}% \commondummyword\ordf {a}% \commondummyword\ordm {o}% \commondummyword\questiondown {?}% \commondummyword\ss {ss}% \commondummyword\th {th}% % \commondummyword\LaTeX {LaTeX}% \commondummyword\TeX {TeX}% % % Assorted special characters. \commondummyword\ampchar {\normalamp}% \commondummyword\atchar {\@}% \commondummyword\arrow {->}% \commondummyword\backslashchar {\realbackslash}% \commondummyword\bullet {bullet}% \commondummyword\comma {,}% \commondummyword\copyright {copyright}% \commondummyword\dots {...}% \commondummyword\enddots {...}% \commondummyword\entrybreak {}% \commondummyword\equiv {===}% \commondummyword\error {error}% \commondummyword\euro {euro}% \commondummyword\expansion {==>}% \commondummyword\geq {>=}% \commondummyword\guillemetleft {<<}% \commondummyword\guillemetright {>>}% \commondummyword\guilsinglleft {<}% \commondummyword\guilsinglright {>}% \commondummyword\lbracechar {\{}% \commondummyword\leq {<=}% \commondummyword\mathopsup {sup}% \commondummyword\minus {-}% \commondummyword\pounds {pounds}% \commondummyword\point {.}% \commondummyword\print {-|}% \commondummyword\quotedblbase {"}% \commondummyword\quotedblleft {"}% \commondummyword\quotedblright {"}% \commondummyword\quoteleft {`}% \commondummyword\quoteright {'}% \commondummyword\quotesinglbase {,}% \commondummyword\rbracechar {\}}% \commondummyword\registeredsymbol {R}% \commondummyword\result {=>}% \commondummyword\sub {}% \commondummyword\sup {}% \commondummyword\textdegree {o}% } \let\indexlbrace\relax \let\indexrbrace\relax \let\indexatchar\relax \let\indexbackslash\relax {\catcode`\@=0 \catcode`\\=13 @gdef@backslashdisappear{@def\{}} } { \catcode`\<=13 \catcode`\-=13 \catcode`\`=13 \gdef\indexnonalnumdisappear{% \ifflagclear{txiindexlquoteignore}{}{% % @set txiindexlquoteignore makes us ignore left quotes in the sort term. % (Introduced for FSFS 2nd ed.) \let`=\empty }% % \ifflagclear{txiindexbackslashignore}{}{% \backslashdisappear }% \ifflagclear{txiindexhyphenignore}{}{% \def-{}% }% \ifflagclear{txiindexlessthanignore}{}{% \def<{}% }% \ifflagclear{txiindexatsignignore}{}{% \def\@{}% }% } \gdef\indexnonalnumreappear{% \let-\normaldash \let<\normalless } } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% \indexnofontstrue % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % \uccode`\1=`\{ \uppercase{\def\{{1}}% \uccode`\1=`\} \uppercase{\def\}{1}}% \let\lbracechar\{% \let\rbracechar\}% % % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \def\commondummyword##1{\let##1\asis}% \macrolist \let\value\indexnofontsvalue } % #1 is the index name, #2 is the entry text. \def\doind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\doindwrite }% \fi } % Same as \doind, but for code indices \def\docind#1#2{% \iflinks {% % \requireopenindexfile{#1}% \edef\writeto{\csname#1indfile\endcsname}% % \def\indextext{#2}% \safewhatsit\docindwrite }% \fi } % Check if an index file has been opened, and if not, open it. \def\requireopenindexfile#1{% \ifnum\csname #1indfile\endcsname=0 \expandafter\newwrite \csname#1indfile\endcsname \edef\suffix{#1}% % A .fls suffix would conflict with the file extension for the output % of -recorder, so use .f1s instead. \ifx\suffix\indexisfl\def\suffix{f1}\fi % Open the file \immediate\openout\csname#1indfile\endcsname \jobname.\suffix % Using \immediate above here prevents an object entering into the current % box, which could confound checks such as those in \safewhatsit for % preceding skips. \typeout{Writing index file \jobname.\suffix}% \fi} \def\indexisfl{fl} % Definition for writing index entry sort key. { \catcode`\-=13 \gdef\indexwritesortas{% \begingroup \indexnonalnumreappear \indexwritesortasxxx} \gdef\indexwritesortasxxx#1{% \xdef\indexsortkey{#1}\endgroup} } \def\indexwriteseealso#1{ \gdef\pagenumbertext{\string\seealso{#1}}% } \def\indexwriteseeentry#1{ \gdef\pagenumbertext{\string\seeentry{#1}}% } % The default definitions \def\sortas#1{}% \def\seealso#1{\i{\putwordSeeAlso}\ #1}% for sorted index file only \def\putwordSeeAlso{See also} \def\seeentry#1{\i{\putwordSee}\ #1}% for sorted index file only % Given index entry text like "aaa @subentry bbb @sortas{ZZZ}": % * Set \bracedtext to "{aaa}{bbb}" % * Set \fullindexsortkey to "aaa @subentry ZZZ" % * If @seealso occurs, set \pagenumbertext % \def\splitindexentry#1{% \gdef\fullindexsortkey{}% \xdef\bracedtext{}% \def\sep{}% \def\seealso##1{}% \def\seeentry##1{}% \expandafter\doindexsegment#1\subentry\finish\subentry } % append the results from the next segment \def\doindexsegment#1\subentry{% \def\segment{#1}% \ifx\segment\isfinish \else % % Fully expand the segment, throwing away any @sortas directives, and % trim spaces. \edef\trimmed{\segment}% \edef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \ifincodeindex \edef\trimmed{\noexpand\code{\trimmed}}% \fi % \xdef\bracedtext{\bracedtext{\trimmed}}% % % Get the string to sort by. Process the segment with all % font commands turned off. \bgroup \let\sortas\indexwritesortas \let\seealso\indexwriteseealso \let\seeentry\indexwriteseeentry \indexnofonts % The braces around the commands are recognized by texindex. \def\lbracechar{{\string\indexlbrace}}% \def\rbracechar{{\string\indexrbrace}}% \let\{=\lbracechar \let\}=\rbracechar \def\@{{\string\indexatchar}}% \def\atchar##1{\@}% \def\backslashchar{{\string\indexbackslash}}% \uccode`\~=`\\ \uppercase{\let~\backslashchar}% % \let\indexsortkey\empty \global\let\pagenumbertext\empty % Execute the segment and throw away the typeset output. This executes % any @sortas or @seealso commands in this segment. \setbox\dummybox = \hbox{\segment}% \ifx\indexsortkey\empty{% \indexnonalnumdisappear \xdef\trimmed{\segment}% \xdef\trimmed{\expandafter\eatspaces\expandafter{\trimmed}}% \xdef\indexsortkey{\trimmed}% \ifx\indexsortkey\empty \message{Empty index sort key near line \the\inputlineno}% \xdef\indexsortkey{ }% \fi }\fi % % Append to \fullindexsortkey. \edef\tmp{\gdef\noexpand\fullindexsortkey{% \fullindexsortkey\sep\indexsortkey}}% \tmp \egroup \def\sep{\subentry}% % \expandafter\doindexsegment \fi } \def\isfinish{\finish}% \newbox\dummybox % used above \let\subentry\relax % Use \ instead of @ in index files. To support old texi2dvi and texindex. % This works without changing the escape character used in the toc or aux % files because the index entries are fully expanded here, and \string uses % the current value of \escapechar. \def\escapeisbackslash{\escapechar=`\\} % Use \ in index files by default. texi2dvi didn't support @ as the escape % character (as it checked for "\entry" in the files, and not "@entry"). When % the new version of texi2dvi has had a chance to become more prevalent, then % the escape character can change back to @ again. This should be an easy % change to make now because both @ and \ are only used as escape characters in % index files, never standing for themselves. % \set txiindexescapeisbackslash % Write the entry in \indextext to the index file. % \newif\ifincodeindex \def\doindwrite{\incodeindexfalse\doindwritex} \def\docindwrite{\incodeindextrue\doindwritex} \def\doindwritex{% \maybemarginindex % \atdummies % \ifflagclear{txiindexescapeisbackslash}{}{\escapeisbackslash}% % % For texindex which always views { and } as separators. \def\{{\lbracechar{}}% \def\}{\rbracechar{}}% \uccode`\~=`\\ \uppercase{\def~{\backslashchar{}}}% % % Split the entry into primary entry and any subentries, and get the index % sort key. \splitindexentry\indextext % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. % \edef\temp{% \write\writeto{% \string\entry{\fullindexsortkey}% {\ifx\pagenumbertext\empty\noexpand\folio\else\pagenumbertext\fi}% \bracedtext}% }% \temp } % Put the index entry in the margin if desired (undocumented). \def\maybemarginindex{% \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \relax\indextext}}% \fi } \let\SETmarginindex=\relax % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % \entry {topic}{} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % \secondary {subtopic}{} % for a subtopic with sub-subtopics % \tertiary {subtopic}{subsubtopic}{pagelist} % for each sub-subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See comment in \requireopenindexfile. \def\indexname{#1}\ifx\indexname\indexisfl\def\indexname{f1}\fi % % See if the index file exists and is nonempty. \openin 1 \jobname.\indexname s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \typeout{No file \jobname.\indexname s.}% \else % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \thisline \ifeof 1 \putwordIndexIsEmpty \else \expandafter\printindexzz\thisline\relax\relax\finish% \fi \fi \closein 1 \endgroup} % If the index file starts with a backslash, forgo reading the index % file altogether. If somebody upgrades texinfo.tex they may still have % old index files using \ as the escape character. Reading this would % at best lead to typesetting garbage, at worst a TeX syntax error. \def\printindexzz#1#2\finish{% \ifflagclear{txiindexescapeisbackslash}{% \uccode`\~=`\\ \uppercase{\if\noexpand~}\noexpand#1 \ifflagclear{txiskipindexfileswithbackslash}{% \errmessage{% ERROR: A sorted index file in an obsolete format was skipped. To fix this problem, please upgrade your version of 'texi2dvi' or 'texi2pdf' to that at . If you are using an old version of 'texindex' (part of the Texinfo distribution), you may also need to upgrade to a newer version (at least 6.0). You may be able to typeset the index if you run 'texindex \jobname.\indexname' yourself. You could also try setting the 'txiindexescapeisbackslash' flag by running a command like 'texi2dvi -t "@set txiindexescapeisbackslash" \jobname.texi'. If you do this, Texinfo will try to use index files in the old format. If you continue to have problems, deleting the index files and starting again might help (with 'rm \jobname.?? \jobname.??s')% }% }{% (Skipped sorted index file in obsolete format) }% \else \begindoublecolumns \input \jobname.\indexname s \enddoublecolumns \fi }{% \begindoublecolumns \catcode`\\=0\relax % % Make @ an escape character to give macros a chance to work. This % should work because we (hopefully) don't otherwise use @ in index files. %\catcode`\@=12\relax \catcode`\@=0\relax \input \jobname.\indexname s \enddoublecolumns }% } % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. {\catcode`\/=13 \catcode`\-=13 \catcode`\^=13 \catcode`\~=13 \catcode`\_=13 \catcode`\|=13 \catcode`\<=13 \catcode`\>=13 \catcode`\+=13 \catcode`\"=13 \catcode`\$=3 \gdef\initialglyphs{% % special control sequences used in the index sort key \let\indexlbrace\{% \let\indexrbrace\}% \let\indexatchar\@% \def\indexbackslash{\math{\backslash}}% % % Some changes for non-alphabetic characters. Using the glyphs from the % math fonts looks more consistent than the typewriter font used elsewhere % for these characters. \uccode`\~=`\\ \uppercase{\def~{\math{\backslash}}} % % In case @\ is used for backslash \uppercase{\let\\=~} % Can't get bold backslash so don't use bold forward slash \catcode`\/=13 \def/{{\secrmnotbold \normalslash}}% \def-{{\normaldash\normaldash}}% en dash `--' \def^{{\chapbf \normalcaret}}% \def~{{\chapbf \normaltilde}}% \def\_{% \leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em }% \def|{$\vert$}% \def<{$\less$}% \def>{$\gtr$}% \def+{$\normalplus$}% }} \def\initial{% \bgroup \initialglyphs \initialx } \def\initialx#1{% % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. % The glue before the bonus allows a little bit of space at the % bottom of a column to reduce an increase in inter-line spacing. \nobreak \vskip 0pt plus 5\baselineskip \penalty -300 \vskip 0pt plus -5\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus 1\baselineskip \leftline{\secfonts \kern-0.05em \secbf #1}% % \secfonts is inside the argument of \leftline so that the change of % \baselineskip will not affect any glue inserted before the vbox that % \leftline creates. % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip \egroup % \initialglyphs } \newdimen\entryrightmargin \entryrightmargin=0pt % amount to indent subsequent lines in an entry when it spans more than % one line. \newdimen\entrycontskip \entrycontskip=1em % for PDF output, whether to make the text of the entry a link to the page % number. set for @contents and @shortcontents where there is only one % page number. \newif\iflinkentrytext % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % No extra space above this paragraph. \parskip = 0in % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% An undocumented command % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% % Save the text of the entry in \boxA \global\setbox\boxA=\hbox\bgroup \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. % Not absorbing as a macro argument reduces the chance of problems % with catcodes occurring. } {\catcode`\@=11 % #1 is the page number \gdef\finishentry#1{% \egroup % end \boxA \dimen@ = \wd\boxA % Length of text of entry % add any leaders and page number to \boxA. \global\setbox\boxA=\hbox\bgroup \ifpdforxetex \iflinkentrytext \pdflinkpage{#1}{\unhbox\boxA}% \else \unhbox\boxA \fi \else \unhbox\boxA \fi % % Get the width of the page numbers, and only use % leaders if they are present. \global\setbox\boxB = \hbox{#1}% \ifdim\wd\boxB = 0pt \null\nobreak\hfill\ % \else % \null\nobreak\indexdotfill % Have leaders before the page number. % \ifpdforxetex \pdfgettoks#1.% \hskip\skip\thinshrinkable\the\toksA \else \hskip\skip\thinshrinkable #1% \fi \fi \egroup % end \boxA % % now output \ifdim\wd\boxB = 0pt \noindent\unhbox\boxA\par \nobreak \else\bgroup % We want the text of the entries to be aligned to the left, and the % page numbers to be aligned to the right. % \parindent = 0pt \advance\leftskip by 0pt plus 1fil \advance\leftskip by 0pt plus -1fill \rightskip = 0pt plus -1fil \advance\rightskip by 0pt plus 1fill % Cause last line, which could consist of page numbers on their own % if the list of page numbers is long, to be aligned to the right. \parfillskip=0pt plus -1fill % \advance\rightskip by \entryrightmargin % \dimen@ii = \hsize \advance\dimen@ii by -1\leftskip \advance\dimen@ii by -1\entryrightmargin \ifdim\wd\boxA > \dimen@ii % If the entry doesn't fit in one line \ifdim\dimen@ > 0.8\dimen@ii % due to long index text \advance\leftskip by 0pt plus 1fill % ragged right % % Indent all lines but the first one. \advance\leftskip by \entrycontskip \advance\parindent by -\entrycontskip \fi\fi \indent % start paragraph \unhbox\boxA % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % Word spacing - no stretch \spaceskip=\fontdimen2\font minus \fontdimen4\font % \linepenalty=1000 % Discourage line breaks. \hyphenpenalty=5000 % Discourage hyphenation. % \par % format the paragraph \egroup % The \vbox \fi \endgroup }} \newskip\thinshrinkable \skip\thinshrinkable=.15em minus .15em % Like plain.tex's \dotfill, except uses up at least 0.5 em. % The filll stretch here overpowers both the fil and fill stretch to push % the page number to the right. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 0.5em plus 1filll} \def\primary #1{\line{#1\hfil}} \def\secondary{\indententry{0.5cm}} \def\tertiary{\indententry{1cm}} \def\indententry#1#2#3{% \bgroup \leftskip=#1 \entry{#2}{#3}% \egroup } % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 % private names \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % If not much space left on page, start a new page. \ifdim\pagetotal>0.8\vsize\vfill\eject\fi % % Grab any single-column material above us. \output = {% \savetopmark % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumnhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \advance\vsize by -\ht\partialpage \vsize = 2\vsize % % For the benefit of balancing columns \advance\baselineskip by 0pt plus 0.5pt } % The double-column output routine for all double-column pages except % the last, which is done by \balancecolumns. % \def\doublecolumnout{% % \savetopmark \splittopskip=\topskip \splitmaxdepth=\maxdepth \dimen@ = \vsize \divide\dimen@ by 2 % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit\PAGE to\dimen@ \setbox2=\vsplit\PAGE to\dimen@ \global\advance\vsize by 2\ht\partialpage \onepageout\pagesofar % empty except for the first time we are called \unvbox\PAGE \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\txipagewidth{\box0\hfil\box2}% } % Finished with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \txipageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. \savetopmark \balancecolumns }% \eject % call the \output just set \ifdim\pagetotal=0pt % Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. \global\output=\expandafter{\the\defaultoutput} % \endgroup % started in \begindoublecolumns % Leave the double-column material on the current page, no automatic % page break. \box\balancedcolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize. \global\vsize = \txipageheight % \pagegoal = \txipageheight % \else % We had some left-over material. This might happen when \doublecolumnout % is called in \balancecolumns. Try again. \expandafter\enddoublecolumns \fi } \newbox\balancedcolumns \setbox\balancedcolumns=\vbox{shouldnt see this}% % % Only called for the last of the double column material. \doublecolumnout % does the others. \def\balancecolumns{% \setbox0 = \vbox{\unvbox\PAGE}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \ifdim\dimen@<7\baselineskip % Don't split a short final column in two. \setbox2=\vbox{}% \global\setbox\balancedcolumns=\vbox{\pagesofar}% \else % double the leading vertical space \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to \dimen@ii = \dimen@ \splittopskip = \topskip % Loop until left column is at least as high as the right column. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht1<\ht3 \global\advance\dimen@ by 1pt \repeat }% % Now the left column is in box 1, and the right column in box 3. % % Check whether the left column has come out higher than the page itself. % (Note that we have doubled \vsize for the double columns, so % the actual height of the page is 0.5\vsize). \ifdim2\ht1>\vsize % It appears that we have been called upon to balance too much material. % Output some of it with \doublecolumnout, leaving the rest on the page. \setbox\PAGE=\box0 \doublecolumnout \else % Compare the heights of the two columns. \ifdim4\ht1>5\ht3 % Column heights are too different, so don't make their bottoms % flush with each other. \setbox2=\vbox to \ht1 {\unvbox3\vfill}% \setbox0=\vbox to \ht1 {\unvbox1\vfill}% \else % Make column bottoms flush with each other. \setbox2=\vbox to\ht1{\unvbox3\unskip}% \setbox0=\vbox to\ht1{\unvbox1\unskip}% \fi \global\setbox\balancedcolumns=\vbox{\pagesofar}% \fi \fi % } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rm #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page % This outputs a mark at the end of the page that clears \thischapter % and \thissection, as is done in \startcontents. \let\pchapsepmacro\relax \chapmacro{}{Yomitfromtoc}{}% \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} % Start a new page \def\chappager{\par\vfill\supereject} % \chapoddpage - start on an odd page for a new chapter % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \parseargdef\setchapternewpage{\csname CHAPPAG#1\endcsname\HEADINGSon} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\def\HEADINGSon{\HEADINGSsinglechapoff}} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \setchapternewpage on % \chapmacro - Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % Not used for @heading series. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yappendixkeyword{Yappendix} \def\Yomitfromtockeyword{Yomitfromtoc} % % % Definitions for @thischapter. These can be overridden in translation % files. \def\thischapterAppendix{% \putwordAppendix{} \thischapternum: \thischaptername} \def\thischapterChapter{% \putwordChapter{} \thischapternum: \thischaptername} % % \def\chapmacro#1#2#3{% \expandafter\ifx\thisenv\titlepage\else \checkenv{}% chapters, etc., should not start inside an environment. \fi % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \gdef\currentsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\currentchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% \let\noexpand\thischapter\noexpand\thischapterAppendix }% \else \toks0={#1}% \xdef\currentchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% \let\noexpand\thischapter\noexpand\thischapterChapter }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\currentchapterdefs \let\prevsectiondefs=\currentsectiondefs \domark % {% \chapfonts \rm \let\footnote=\errfootnoteheading % give better error message % % Have to define \currentsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\currentsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Definition for @thissection. This can be overridden in translation % files. \def\thissectionDef{% \putwordSection{} \thissectionnum: \thissectionname} % % Print any size, any type, section title. % % #1 is the text of the title, % #2 is the section level (sec/subsec/subsubsec), % #3 is the section type (Ynumbered, Ynothing, Yappendix, Yomitfromtoc), % #4 is the section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \def\sectionlevel{#2}% \def\temptype{#3}% % % It is ok for the @heading series commands to appear inside an % environment (it's been historically allowed, though the logic is % dubious), but not the others. \ifx\temptype\Yomitfromtockeyword\else \checkenv{}% non-@*heading should not be in an environment. \fi \let\footnote=\errfootnoteheading % % Switch to the right set of fonts. \csname #2fonts\endcsname \rm % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\currentsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\currentsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \let\noexpand\thissection\noexpand\thissectionDef }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\currentsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% \let\noexpand\thissection\noexpand\thissectionDef }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \global\let\prevsectiondefs=\currentsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\currentsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \currentsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\currentsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\currentsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdforxetex \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } % process toc file to find the maximum width of the section numbers for % each chapter \def\findsecnowidths{% \begingroup \setupdatafile \activecatcodes \secentryfonts % Redefinitions \def\numchapentry##1##2##3##4{% \def\curchapname{secnowidth-##2}% \curchapmax=0pt }% \let\appentry\numchapentry % \def\numsecentry##1##2##3##4{% \def\cursecname{secnowidth-##2}% \cursecmax=0pt % \setbox0=\hbox{##2}% \ifdim\wd0>\curchapmax \curchapmax=\wd0 \expandafter\xdef\csname\curchapname\endcsname{\the\wd0}% \fi }% \let\appsecentry\numsecentry % \def\numsubsecentry##1##2##3##4{% \def\curssecname{secnowidth-##2}% \curssecmax=0pt % \setbox0=\hbox{##2}% \ifdim\wd0>\cursecmax \cursecmax=\wd0 \expandafter\xdef\csname\cursecname\endcsname{\the\wd0}% \fi }% \let\appsubsecentry\numsubsecentry % \def\numsubsubsecentry##1##2##3##4{% \setbox0=\hbox{##2}% \ifdim\wd0>\curssecmax \curssecmax=\wd0 \expandafter\xdef\csname\curssecname\endcsname{\the\wd0}% \fi }% \let\appsubsubsecentry\numsubsubsecentry % % Discard any output by outputting to dummy vbox, in case the toc file % contains macros that we have not redefined above. \setbox\dummybox\vbox\bgroup \input \tocreadfilename\relax \egroup \endgroup } \newdimen\curchapmax \newdimen\cursecmax \newdimen\curssecmax % set #1 to the maximum section width for #2 \def\retrievesecnowidth#1#2{% \expandafter\let\expandafter\savedsecnowidth \csname secnowidth-#2\endcsname \ifx\savedsecnowidth\relax #1=0pt \else #1=\savedsecnowidth \fi } \newdimen\secnowidthchap \secnowidthchap=0pt \newdimen\secnowidthsec \secnowidthsec=0pt \newdimen\secnowidthssec \secnowidthssec=0pt \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \entryrightmargin=\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi \def\thistitle{}% no title in double-sided headings % Record where the Roman numerals started. \ifnum\romancount=0 \global\romancount=\pagecount \fi \linkentrytexttrue } % \raggedbottom in plain.tex hardcodes \topskip so override it \catcode`\@=11 \def\raggedbottom{\advance\topskip by 0pt plus60pt \r@ggedbottomtrue} \catcode`\@=\other % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \findsecnowidths \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \contentsendroman } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \extrasecnoskip=0.4pt \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \contentsendroman } \let\shortcontents = \summarycontents % Get ready to use Arabic numerals again \def\contentsendroman{% \lastnegativepageno = \pageno \global\pageno=1 \contentsendcount = \pagecount } % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents, % and are read in from the *.toc file. % % The arguments are like: % \def\numchapentry#1#2#3#4 % #1 - the chapter or section name. % #2 - section number % #3 - level of section (e.g "chap", "sec") % #4 - page number % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{% % Add stretch and a bonus for breaking the page before the part heading. % This reduces the chance of the page being broken immediately after the % part heading, before a following chapter heading. \vskip 0pt plus 5\baselineskip \penalty-300 \vskip 0pt plus -5\baselineskip \dochapentry{#1}{\numeralbox}{}% } % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{% \retrievesecnowidth\secnowidthchap{#2}% \dochapentry{#1}{#2}{#4}% } % Chapters, in the short toc. \def\shortchapentry#1#2#3#4{% \tocentry{#1}{\shortchaplabel{#2}}{#4}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{% \retrievesecnowidth\secnowidthchap{#2}% \dochapentry{\appendixbox{#2}\hskip.7em#1}{}{#4}% } % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{}{#4}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#1}{#2}{#4}} \def\numsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthsec{#2}% \dosecentry{#1}{#2}{#4}% } \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthsec{#2}% \dosecentry{#1}{}{#4}% } % Subsections. \def\numsubsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthssec{#2}% \dosubsecentry{#1}{#2}{#4}% } \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{% \retrievesecnowidth\secnowidthssec{#2}% \dosubsecentry{#1}{}{#4}% } % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#2}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text, #2 is % a section number if present, and #3 is the page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2#3{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup % Move the page numbers slightly to the right \advance\entryrightmargin by -0.05em \chapentryfonts \extrasecnoskip=0.4em % separate chapter number more \tocentry{#1}{#2}{#3}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2#3{\begingroup \secnowidth=\secnowidthchap \secentryfonts \leftskip=\tocindent \tocentry{#1}{#2}{#3}% \endgroup} \def\dosubsecentry#1#2#3{\begingroup \secnowidth=\secnowidthsec \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{#2}{#3}% \endgroup} \def\dosubsubsecentry#1#2#3{\begingroup \secnowidth=\secnowidthssec \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{#2}{#3}% \endgroup} % Used for the maximum width of a section number so we can align % section titles. \newdimen\secnowidth \secnowidth=0pt \newdimen\extrasecnoskip \extrasecnoskip=0pt % \tocentry{TITLE}{SEC NO}{PAGE} % \def\tocentry#1#2#3{% \def\secno{#2}% \ifx\empty\secno \entry{#1}{#3}% \else \ifdim 0pt=\secnowidth \setbox0=\hbox{#2\hskip\labelspace\hskip\extrasecnoskip}% \else \advance\secnowidth by \labelspace \advance\secnowidth by \extrasecnoskip \setbox0=\hbox to \secnowidth{% #2\hskip\labelspace\hskip\extrasecnoskip\hfill}% \fi \entrycontskip=\wd0 \entry{\box0 #1}{#3}% \fi } \newdimen\labelspace \labelspace=0.6em \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setregularquotes \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode `\`=\other \catcode `\'=\other % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % % Inverse of the list at the beginning of the file. \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\sp=\ptexsp \let\*=\ptexstar %\let\sup=\ptexsup % do not redefine, we want @sup to work in math mode \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip \ifnum\lastpenalty<10000 % Penalize breaking before the environment, because preceding text % often leads into it. \penalty100 \fi \vskip\envskipamount \fi \fi }} \def\afterenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip % only require the font if @cartouche is actually used \def\cartouchefontdefs{% \font\circle=lcircle10\relax \circthick=\fontdimen8\circle } \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \envparseargdef\cartouche{% \cartouchefontdefs \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. % % Set paragraph width for text inside cartouche. There are % left and right margins of 3pt each plus two vrules 0.4pt each. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \advance\cartinner by -6.8pt % % For drawing top and bottom of cartouche. Each corner char % adds 6pt and we take off the width of a rule to line up with the % right boundary perfectly. \cartouter=\hsize \advance\cartouter by 11.6pt % \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \setbox\groupbox=\vtop\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \def\arg{#1}% \ifx\arg\empty\else \centerV{\hfil \bf #1 \hfil}% \fi \kern3pt \vskip -\parskip } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \addgroupbox \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp, @verbatim % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setcodequotes \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \parsearg\gobble } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2.4em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt \def\par{\leavevmode\endgraf}% \parindent = 0pt \setcodequotes \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. \newbox\verbbox \def\starttabbox{\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \leavevmode\box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim \def\par{\egroup\leavevmode\box\verbbox\endgraf\starttabbox}% \tabexpand \setcodequotes % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{% \starttabbox#2\egroup\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. % The \egroup ends the \verbbox started at the end of the last line in % the block. \endgroup % \envdef\verbatim{% \setnormaldispenv\setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim {% \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \edef\tmp{\noexpand\input #1 } \expandafter }\expandafter\starttabbox\tmp\egroup \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is desirable. % \def\copying{\checkenv{}\begingroup\macrobodyctxt\docopying} {\catcode`\ =\other \gdef\docopying#1@end copying{\endgroup\def\copyingtext{#1}} } \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } % Called as \printdefunline \deffooheader{text} % \def\printdefunline#1#2{% \begingroup \plainfrenchspacing % call \deffooheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \deffoox % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % @defblock, @defline do not automatically create index entries \envdef\defblock{% \startdefun } \let\Edefblock\Edefun \def\defline{% \doingtypefnfalse \parseargusing\activeparens{\printdefunline\deflineheader}% } \def\deflineheader#1 #2 #3\endheader{% \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% } \def\deftypeline{% \doingtypefntrue \parseargusing\activeparens{\printdefunline\deftypelineheader}% } \def\deftypelineheader#1 #2 #3 #4\endheader{% \printdefname{#1}{#2}{#3}\magicamp\defunargs{#4\unskip}% } % \makedefun{deffoo} (\deffooheader parameters) { (\deffooheader expansion) } % % Define \deffoo, \deffoox \Edeffoo and \deffooheader. \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{% % First, check whether we are in the right environment: \checkenv#1% % % As in \startdefun, allow line break if we have multiple x headers % in a row. It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#3% definition of \deffooheader follows } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}#1 #2 #3\endheader{% \doind{fn}{\code{#2}}% \printdefname{#1}{}{#2}\magicamp\defunargs{#3\unskip}% } % @defop category class name args \makedefun{defop}#1 {\defopheaderx{#1\ \putwordon}} \def\defopheaderx#1#2 #3 #4\endheader{% \doind{fn}{\code{#3}\space\putwordon\ \code{#2}}% \printdefname{#1\ \code{#2}}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}#1 #2 #3 #4\endheader{% \doind{fn}{\code{#3}}% \doingtypefntrue \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% } % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopheaderx{#1\ \putwordon}} \def\deftypeopheaderx#1#2 #3 #4 #5\endheader{% \doind{fn}{\code{#4}\space\putwordon\ \code{#1\ \code{#2}}}% \doingtypefntrue \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}#1 #2 #3 #4\endheader{% \doind{vr}{\code{#3}}% \printdefname{#1}{#2}{#3}\defunargs{#4\unskip}% } % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvheaderx{#1\ \putwordof}} \def\deftypecvheaderx#1#2 #3 #4 #5\endheader{% \doind{vr}{\code{#4}\space\putwordof\ \code{#2}}% \printdefname{#1\ \code{#2}}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvheaderx{#1\ \putwordof}} \def\defcvheaderx#1#2 {\deftypecvheaderx{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \printdefname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopheaderx\putwordMethodon} \makedefun{deftypemethod}{\deftypeopheaderx\putwordMethodon} \makedefun{defivar}{\defcvheaderx\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvheaderx\putwordInstanceVariableof} % \printdefname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\printdefname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \ifflagclear{txideftypefnnl}{}{\rettypeownlinetrue}% \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% \def\^^M{}% for line continuation % % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% \ifflagclear{txidefnamenospace}{% {\rm\enskip}% hskip 0.5 em of \rmfont }{}% % \boldbrax % arguments will be output next, if any. } % Print arguments. Use slanted for @def*, typewriter for @deftype*. \def\defunargs#1{% \bgroup \def\^^M{}% for line continuation \df \ifdoingtypefn \tt \else \sl \fi \ifflagclear{txicodevaristt}{}% {\def\var##1{{\setregularquotes \ttsl ##1}}}% #1% \egroup } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \gdef\defcharsdefault{% \let(=\lparen \let)=\rparen \let[=\lbrack \let]=\rbrack \let& = \&% } \globaldefs=1 \defcharsdefault \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \let\ampchar\& \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\rm\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \let\E=\expandafter % Used at the time of macro expansion. % Argument is macro body with arguments substituted \def\scanmacro#1{% \newlinechar`\^^M % expand the expansion of \eatleadingcr twice to maybe remove a leading % newline (and \else and \fi tokens), then call \eatspaces on the result. \def\xeatspaces##1{% \E\E\E\E\E\E\E\eatspaces\E\E\E\E\E\E\E{\eatleadingcr##1% }}% \def\xempty##1{}% % % Process the macro body under the current catcode regime. \scantokens{#1@comment}% % % The \comment is to remove the \newlinechar added by \scantokens, and % can be noticed by \parsearg. Note \c isn't used because this means cedilla % in math mode. } % Used for copying and captions \def\scanexp#1{% \expandafter\scanmacro\expandafter{#1}% } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \commondummyword\macro1\commondummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\commondummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } {\catcode`\^^M=\other% \gdef\eatleadingcr#1{\if\noexpand#1\noexpand^^M\else\E#1\fi}}% % Warning: this won't work for a delimited argument % or for an empty argument % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \catcode`\@=\other \catcode`\^^M=\other \catcode`\\=\active \passthroughcharstrue } \def\macrobodyctxt{% used for @macro definitions and @copying \scanctxt \catcode`\ =\other \catcode`\{=\other \catcode`\}=\other } % Used when scanning braced macro arguments. Note, however, that catcode % changes here are ineffectual if the macro invocation was nested inside % an argument to another Texinfo command. \def\macroargctxt{% \scanctxt \catcode`\ =\active } \def\macrolineargctxt{% used for whole-line arguments without braces \scanctxt \catcode`\{=\other \catcode`\}=\other } % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \usembodybackslash \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\commondummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\commondummyword \noexpand#1% \fi } % \getargs -- Parse the arguments to a @macro line. Set \macname to % the name of the macro, and \argl to the braced argument list. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % This made use of the feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. % Parse the optional {params} list to @macro or @rmacro. % Set \paramno to the number of arguments, % and \paramlist to a parameter text for the macro (e.g. #1,#2,#3 for a % three-param macro.) Define \macarg.BLAH for each BLAH in the params % list to some hook where the argument is to be expanded. If there are % less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % If there are 10 or more arguments, a different technique is used: see % \parsemmanyargdef. % \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax % \hash is redefined to `#' later to get it into definitions \let\xeatspaces\relax \let\xempty\relax \parsemargdefxxx#1,;,% \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno\noexpand\xempty{}}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} % the \xempty{} is to give \eatleadingcr an argument in the case of an % empty macro argument. % \parsemacbody, \parsermacbody % % Read recursive and nonrecursive macro bodies. (They're different since % rec and nonrec macros end differently.) % % We are in \macrobodyctxt, and the \xdef causes backslashes in the macro % body to be transformed. % Set \macrobody to the body of the macro, and call \macrodef. % {\catcode`\ =\other\long\gdef\parsemacbody#1@end macro{% \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% {\catcode`\ =\other\long\gdef\parsermacbody#1@end rmacro{% \xdef\macrobody{\eatcr{#1}}\endgroup\macrodef}}% % Make @ a letter, so that we can make private-to-Texinfo macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax %%%%%%%%%%%%%% Code for > 10 arguments only %%%%%%%%%%%%%%%%%% % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime under which the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, no macro can have more than 256 arguments (else error). % % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments' values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa. % \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } % Define the named-macro outside of this group and then close this group. % \def\macargexpandinbody@{% \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Trailing missing arguments are set to empty. % \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } %%%%%%%%%%%%%% End of code for > 10 arguments %%%%%%%%%%%%%%%%%% % This defines a Texinfo @macro or @rmacro, called by \parsemacbody. % \macrobody has the body of the macro in it, with placeholders for % its parameters, looking like "\xeatspaces{\hash 1}". % \paramno is the number of parameters % \paramlist is a TeX parameter text, e.g. "#1,#2,#3," % There are four cases: macros of zero, one, up to nine, and many arguments. % \xdef is used so that macro definitions will survive the file % they're defined in: @include reads the file inside a group. % \def\macrodef{% \let\hash=##% convert placeholders to macro parameter chars \ifnum\paramno=1 \long\def\xeatspaces##1{##1}% % We don't use \xeatspaces for single-argument macros, because we % want to keep ends of lines. This definition removes \xeatspaces % when \macrobody is expanded below. \else \def\xeatspaces{\string\xeatspaces}% % This expands \xeatspaces as a sequence of character tokens, which % stops \scantokens inserting an extra space after the control sequence. \fi \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\spaceisspace \noexpand\endlineisspace \noexpand\expandafter % skip any whitespace after the macro name. \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname{% \endgroup \noexpand\scanmacro{\macrobody}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\braceorline \expandafter\noexpand\csname\the\macname @@@\endcsname}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \endgroup \noexpand\scanmacro{\macrobody}% }% \else % at most 9 \ifnum\paramno<10\relax % @MACNAME sets the context for reading the macro argument % @MACNAME@@ gets the argument, processes backslashes and appends a % comma. % @MACNAME@@@ removes braces surrounding the argument list. % @MACNAME@@@@ scans the macro body with arguments substituted. \expandafter\xdef\csname\the\macname\endcsname{% \begingroup \noexpand\expandafter % This \expandafter skip any spaces after the \noexpand\macroargctxt % macro before we change the catcode of space. \noexpand\expandafter \expandafter\noexpand\csname\the\macname @@\endcsname}% \expandafter\xdef\csname\the\macname @@\endcsname##1{% \noexpand\passargtomacro \expandafter\noexpand\csname\the\macname @@@\endcsname{##1,}}% \expandafter\xdef\csname\the\macname @@@\endcsname##1{% \expandafter\noexpand\csname\the\macname @@@@\endcsname ##1}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname @@@@\endcsname\paramlist{% \endgroup\noexpand\scanmacro{\macrobody}}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\macrobody \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi} \catcode `\@\texiatcatcode\relax % end private-to-Texinfo catcodes \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % {\catcode`\@=0 \catcode`\\=13 % We need to manipulate \ so use @ as escape @catcode`@_=11 % private names @catcode`@!=11 % used as argument separator % \passargtomacro#1#2 - % Call #1 with a list of tokens #2, with any doubled backslashes in #2 % compressed to one. % % This implementation works by expansion, and not execution (so we cannot use % \def or similar). This reduces the risk of this failing in contexts where % complete expansion is done with no execution (for example, in writing out to % an auxiliary file for an index entry). % % State is kept in the input stream: the argument passed to % @look_ahead, @gobble_and_check_finish and @add_segment is % % THE_MACRO ARG_RESULT ! {PENDING_BS} NEXT_TOKEN (... rest of input) % % where: % THE_MACRO - name of the macro we want to call % ARG_RESULT - argument list we build to pass to that macro % PENDING_BS - either a backslash or nothing % NEXT_TOKEN - used to look ahead in the input stream to see what's coming next @gdef@passargtomacro#1#2{% @add_segment #1!{}@relax#2\@_finish\% } @gdef@_finish{@_finishx} @global@let@_finishx@relax % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 used to look ahead % % If the next token is not a backslash, process the rest of the argument; % otherwise, remove the next token. @gdef@look_ahead#1!#2#3#4{% @ifx#4\% @expandafter@gobble_and_check_finish @else @expandafter@add_segment @fi#1!{#2}#4#4% } % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 should be a backslash, which is gobbled. % #5 looks ahead % % Double backslash found. Add a single backslash, and look ahead. @gdef@gobble_and_check_finish#1!#2#3#4#5{% @add_segment#1\!{}#5#5% } @gdef@is_fi{@fi} % #1 - THE_MACRO ARG_RESULT % #2 - PENDING_BS % #3 - NEXT_TOKEN % #4 is input stream until next backslash % % Input stream is either at the start of the argument, or just after a % backslash sequence, either a lone backslash, or a doubled backslash. % NEXT_TOKEN contains the first token in the input stream: if it is \finish, % finish; otherwise, append to ARG_RESULT the segment of the argument up until % the next backslash. PENDING_BACKSLASH contains a backslash to represent % a backslash just before the start of the input stream that has not been % added to ARG_RESULT. @gdef@add_segment#1!#2#3#4\{% @ifx#3@_finish @call_the_macro#1!% @else % append the pending backslash to the result, followed by the next segment @expandafter@is_fi@look_ahead#1#2#4!{\}@fi % this @fi is discarded by @look_ahead. % we can't get rid of it with \expandafter because we don't know how % long #4 is. } % #1 - THE_MACRO % #2 - ARG_RESULT % #3 discards the res of the conditional in @add_segment, and @is_fi ends the % conditional. @gdef@call_the_macro#1#2!#3@fi{@is_fi #1{#2}} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \braceorline MAC is used for a one-argument macro MAC. It checks % whether the next non-whitespace character is a {. It sets the context % for reading the argument (slightly different in the two cases). Then, % to read the argument, in the whole-line case, it then calls the regular % \parsearg MAC; in the lbrace case, it calls \passargtomacro MAC. % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup \macroargctxt \expandafter\passargtomacro \else \macrolineargctxt\expandafter\parsearg \fi \macnamexxx} % @linemacro \parseargdef\linemacro{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty \paramno=0 \let\hash\relax \def\paramlist{\hash 1\endlinemacro}% \else \expandafter\linegetparamlist\argl;% \fi \begingroup \macrobodyctxt \usembodybackslash \parselinemacrobody } % Build up \paramlist which will be used as the parameter text for the macro. % At the end it will be like "#1 #2 #3\endlinemacro". \def\linegetparamlist#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \linegetparamlistxxx#1,;,% } \def\linegetparamlistxxx#1,{% \if#1;\let\next=\linegetparamlistxxxx \else \let\next=\linegetparamlistxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\hash\the\paramno}% \edef\paramlist{\paramlist\hash\the\paramno\space}% \fi\next} \def\linegetparamlistxxxx{% \expandafter\fixparamlist\paramlist\fixparamlist } % Replace final space token \def\fixparamlist#1 \fixparamlist{% \def\paramlist{#1\endlinemacro}% } % Read the body of the macro, replacing backslash-surrounded variables % {\catcode`\ =\other\long\gdef\parselinemacrobody#1@end linemacro{% \xdef\macrobody{#1}% \endgroup \linemacrodef }} % Make the definition \def\linemacrodef{% \let\hash=##% \expandafter\xdef\csname\the\macname\endcsname{% \bgroup \noexpand\parsearg \expandafter\noexpand\csname\the\macname @@\endcsname } \expandafter\xdef\csname\the\macname @@\endcsname##1{% \egroup \expandafter\noexpand \csname\the\macname @@@\endcsname##1\noexpand\endlinemacro } \expandafter\expandafter \expandafter\xdef \expandafter\expandafter\csname\the\macname @@@\endcsname\paramlist{% \newlinechar=13 % split \macrobody into lines \noexpand\scantokens{\macrobody}% } } % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}\omittopnode} % Used so that the @top node doesn't have to be wrapped in an @ifnottex % conditional. % \doignore goes to more effort to skip nested conditionals but we don't need % that here. \def\omittopnode{% \ifx\lastnode\wordTop \expandafter\ignorenode\fi } \def\wordTop{Top} % Until the next @node, @part or @bye command, divert output to a box that % is not output. \def\ignorenode{\setbox\dummybox\vbox\bgroup \def\part{\egroup\part}% \def\node{\egroup\node}% \ignorenodebye } {\let\bye\relax \gdef\ignorenodebye{\let\bye\ignorenodebyedef} \gdef\ignorenodebyedef{\egroup(`Top' node ignored)\bye}} % The redefinition of \bye here is because it is declared \outer \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @nodedescription, @nodedescriptionblock - do nothing for TeX \parseargdef\nodedescription{} \def\nodedescriptionblock{\doignore{nodedescriptionblock}} % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \currentsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \requireauxfile \atdummies % preserve commands, but don't expand them % match definition in \xrdef, \refx, \xrefX. \def\value##1{##1}% \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\currentsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref{\putwordsee{} \xrefXX} \def\xref{\putwordSee{} \xrefXX} \def\ref{\xrefXX} \def\xrefXX#1{\def\xrefXXarg{#1}\futurelet\tokenafterxref\xrefXXX} \def\xrefXXX{\expandafter\xrefX\expandafter[\xrefXXarg,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % \getprintedrefname{#1}{#3}{#5}% \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \startxreflink{#1}{#4}% {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". \iffloat distinguishes them by % \Xthisreftitle being set to a magic string. \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % Only output a following space if the -snt ref is nonempty, as the ref % will be empty for @unnumbered and @anchor. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi % % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % \ifflagclear{txiomitxrefpg}{% % We always want a comma ,% % output the `page 3'. \turnoffactive \putpageref{#1}% % Add a , if xref followed by a space \if\space\noexpand\tokenafterxref ,% \else\ifx\ \tokenafterxref ,% @TAB \else\ifx\*\tokenafterxref ,% @* \else\ifx\ \tokenafterxref ,% @SPACE \else\ifx\ \tokenafterxref ,% @NL \else\ifx\tie\tokenafterxref ,% @tie \fi\fi\fi\fi\fi\fi }{}% \fi\fi \fi \endlink \endgroup} % \getprintedrefname{NODE}{LABEL}{MANUAL} % - set \printedrefname and \printedmanual % \def\getprintedrefname#1#2#3{% % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #2}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\printedmanual{\ignorespaces #3}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #2) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi } % \startxreflink{NODE}{FILE} - start link in pdf output. \def\startxreflink#1#2{% \ifpdforxetex % For pdfTeX and LuaTeX {\indexnofonts \makevalueexpandable \turnoffactive % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #2, including (wrongly) those in the middle of the filename. \getfilename{#2}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \setpdfdestname{#1}% % \ifx\pdfdestname\empty \def\pdfdestname{Top}% no empty targets \fi % \leavevmode \ifpdf \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfdestname}% \else goto name{\pdfmkpgn{\pdfdestname}}% \fi \else % XeTeX \ifnum\filenamelength>0 % With default settings, % XeTeX (xdvipdfmx) replaces link destination names with integers. % In this case, the replaced destination names of % remote PDFs are no longer known. In order to avoid a replacement, % you can use xdvipdfmx's command line option `-C 0x0010'. % If you use XeTeX 0.99996+ (TeX Live 2016+), % this command line option is no longer necessary % because we can use the `dvipdfmx:config' special. \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoToR /F (\the\filename.pdf) /D (\pdfdestname) >> >>}% \else \special{pdf:bann << /Border [0 0 0] /Type /Annot /Subtype /Link /A << /S /GoTo /D (\pdfdestname) >> >>}% \fi \fi }% \setcolor{\linkcolor}% \fi } % can be overridden in translation files \def\putpageref#1{% \space\putwordpage\tie\refx{#1-pg}} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % @link{NODENAME, LABEL, MANUAL} - create a "plain" link, with no % page number. Not useful if printed on paper. % \def\link#1{\linkX[#1,,,]} \def\linkX[#1,#2,#3,#4]{% \begingroup \unsepspaces \getprintedrefname{#1}{#2}{#3}% \startxreflink{#1}{#3}% \printedrefname \endlink \endgroup } % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % \refx{NAME} - reference a cross-reference string named NAME. \def\refx#1{% \requireauxfile {% \indexnofonts \turnoffactive \def\value##1{##1}% \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi } % This is the macro invoked by entries in the aux file. Define a control % sequence for a cross-reference target (we prepend XR to the control sequence % name to avoid collisions). The value is the page number. If this is a float % type, we have more work to do. % \def\xrdef#1#2{% {% Expand the node or anchor name to remove control sequences. % \turnoffactive stops 8-bit characters being changed to commands % like @'e. \refx does the same to retrieve the value in the definition. \indexnofonts \turnoffactive \def\value##1{##1}% \xdef\safexrefname{#1}% }% % \bgroup \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% \egroup % We put the \gdef inside a group to avoid the definitions building up on % TeX's save stack, which can cause it to run out of space for aux files with % thousands of lines. \gdef doesn't use the save stack, but \csname does % when it defines an unknown control sequence as \relax. % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate at the beginning of the file. % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % Used when writing to the aux file, or when using data from it. \def\requireauxfile{% \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi \global\let\requireauxfile=\relax % Only do this once. } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\active \catcode`\|=\active \catcode`\<=\active \catcode`\>=\active \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % \catcode`\\=\active % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % % Nested footnotes are not supported in TeX, that would take a lot % more work. (\startsavinginserts does not suffice.) \let\footnote=\errfootnotenest % % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\txipagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 \def\errfootnotenest{% \errhelp=\EMsimple \errmessage{Nested footnotes not supported in texinfo.tex, even though they work in makeinfo; sorry} } \def\errfootnoteheading{% \errhelp=\EMsimple \errmessage{Footnotes in chapters, sections, etc., are not supported} } % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from https://ctan.org/texarchive/macros/texinfo/texinfo/doc/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % Approximate height of a line in the standard text font. \newdimen\capheight \setbox0=\vbox{\tenrm H} \capheight=\ht0 % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names \makevalueexpandable \ifvmode \imagevmodetrue \medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \vskip\parskip % % Place image in a \vtop for a top page margin that is (close to) correct, % as \topskip glue is relative to the first baseline. \vtop\bgroup \kern -\capheight \vskip-\parskip \fi % \ifx\centersub\centerV % For @center @image, enter vertical mode and add vertical space % Enter an extra \parskip because @center doesn't add space itself. \vbox\bgroup\vskip\parskip\medskip\vskip\parskip \else % Enter horizontal mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. \imageindent \fi % % Output the image. \ifpdf % For pdfTeX and LuaTeX <= 0.80 \dopdfimage{#1}{#2}{#3}% \else \ifx\XeTeXrevision\thisisundefined % For epsf.tex % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \else % For XeTeX \doxeteximage{#1}{#2}{#3}% \fi \fi % \ifimagevmode \egroup \medskip % space after a standalone image \fi \ifx\centersub\centerV % @center @image \medskip \egroup % close \vbox \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \currentsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\currentsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \requireauxfile \atdummies % \ifx\thisshortcaption\empty \def\gtemp{\thiscaption}% \else \def\gtemp{\thisshortcaption}% \fi \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanctxt\docaptionz} \def\docaptionz#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \currentsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{% \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \let_ = \normalunderscore % normal _ character for filename test \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore #1_\finish \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX } % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % XeTeX and LuaTeX can handle Unicode natively. % Their default I/O uses UTF-8 sequences instead of a byte-wise operation. % Other TeX engines' I/O (pdfTeX, etc.) is byte-wise. % \newif\iftxinativeunicodecapable \newif\iftxiusebytewiseio \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \txinativeunicodecapablefalse \txiusebytewiseiotrue \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi \else \txinativeunicodecapabletrue \txiusebytewiseiofalse \fi % Set I/O by bytes instead of UTF-8 sequence for XeTeX and LuaTex % for non-UTF-8 (byte-wise) encodings. % \def\setbytewiseio{% \ifx\XeTeXrevision\thisisundefined \else \XeTeXdefaultencoding "bytes" % For subsequent files to be read \XeTeXinputencoding "bytes" % For document root file % Unfortunately, there seems to be no corresponding XeTeX command for % output encoding. This is a problem for auxiliary index and TOC files. % The only solution would be perhaps to write out @U{...} sequences in % place of non-ASCII characters. \fi \ifx\luatexversion\thisisundefined \else \directlua{ local utf8_char, byte, gsub = unicode.utf8.char, string.byte, string.gsub local function convert_char (char) return utf8_char(byte(char)) end local function convert_line (line) return gsub(line, ".", convert_char) end callback.register("process_input_buffer", convert_line) local function convert_line_out (line) local line_out = "" for c in string.utfvalues(line) do line_out = line_out .. string.char(c) end return line_out end callback.register("process_output_buffer", convert_line_out) } \fi \txiusebytewiseiotrue } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \def\documentencoding{\parseargusing\filenamecatcodes\documentencodingzzz} \def\documentencodingzzz#1{% % % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \iftxinativeunicodecapable \setbytewiseio \fi \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \iftxinativeunicodecapable % For native Unicode handling (XeTeX and LuaTeX) \nativeunicodechardefs \else % For treating UTF-8 as byte sequences (TeX, eTeX and pdfTeX). % Since we already invoke \utfeightchardefs at the top level, % making non-ascii chars active is sufficient. \setnonasciicharscatcode\active \fi % \else \message{Ignoring unknown document encoding: #1.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii % \ifx\XeTeXrevision\thisisundefined \else \ifx \declaredencoding \utfeight \else \ifx \declaredencoding \ascii \else \message{Warning: XeTeX with non-UTF-8 encodings cannot handle % non-ASCII characters in auxiliary files.}% \fi \fi \fi } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing, sorry: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} \def\gdefchar#1#2{% \gdef#1{% \ifpassthroughchars \string#1% \else #2% \fi }} \begingroup % Make non-ASCII characters active for defining the character definition % macros. \setnonasciicharscatcode\active % Latin1 (ISO-8859-1) character definitions. \gdef\latonechardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\exclamdown} \gdefchar^^a2{{\tcfont \char162}} % cent \gdefchar^^a3{\pounds{}} \gdefchar^^a4{{\tcfont \char164}} % currency \gdefchar^^a5{{\tcfont \char165}} % yen \gdefchar^^a6{{\tcfont \char166}} % broken bar \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\copyright{}} \gdefchar^^aa{\ordf} \gdefchar^^ab{\guillemetleft{}} \gdefchar^^ac{\ensuremath\lnot} \gdefchar^^ad{\-} \gdefchar^^ae{\registeredsymbol{}} \gdefchar^^af{\={}} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{$\pm$} \gdefchar^^b2{$^2$} \gdefchar^^b3{$^3$} \gdefchar^^b4{\'{}} \gdefchar^^b5{$\mu$} \gdefchar^^b6{\P} \gdefchar^^b7{\ensuremath\cdot} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{$^1$} \gdefchar^^ba{\ordm} \gdefchar^^bb{\guillemetright{}} \gdefchar^^bc{$1\over4$} \gdefchar^^bd{$1\over2$} \gdefchar^^be{$3\over4$} \gdefchar^^bf{\questiondown} % \gdefchar^^c0{\`A} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\~A} \gdefchar^^c4{\"A} \gdefchar^^c5{\ringaccent A} \gdefchar^^c6{\AE} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\`E} \gdefchar^^c9{\'E} \gdefchar^^ca{\^E} \gdefchar^^cb{\"E} \gdefchar^^cc{\`I} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\"I} % \gdefchar^^d0{\DH} \gdefchar^^d1{\~N} \gdefchar^^d2{\`O} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\~O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\O} \gdefchar^^d9{\`U} \gdefchar^^da{\'U} \gdefchar^^db{\^U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\TH} \gdefchar^^df{\ss} % \gdefchar^^e0{\`a} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\~a} \gdefchar^^e4{\"a} \gdefchar^^e5{\ringaccent a} \gdefchar^^e6{\ae} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\`e} \gdefchar^^e9{\'e} \gdefchar^^ea{\^e} \gdefchar^^eb{\"e} \gdefchar^^ec{\`{\dotless i}} \gdefchar^^ed{\'{\dotless i}} \gdefchar^^ee{\^{\dotless i}} \gdefchar^^ef{\"{\dotless i}} % \gdefchar^^f0{\dh} \gdefchar^^f1{\~n} \gdefchar^^f2{\`o} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\~o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\o} \gdefchar^^f9{\`u} \gdefchar^^fa{\'u} \gdefchar^^fb{\^u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\th} \gdefchar^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \gdef\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdefchar^^a4{\euro{}} \gdefchar^^a6{\v S} \gdefchar^^a8{\v s} \gdefchar^^b4{\v Z} \gdefchar^^b8{\v z} \gdefchar^^bc{\OE} \gdefchar^^bd{\oe} \gdefchar^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \gdef\lattwochardefs{% \gdefchar^^a0{\tie} \gdefchar^^a1{\ogonek{A}} \gdefchar^^a2{\u{}} \gdefchar^^a3{\L} \gdefchar^^a4{\missingcharmsg{CURRENCY SIGN}} \gdefchar^^a5{\v L} \gdefchar^^a6{\'S} \gdefchar^^a7{\S} \gdefchar^^a8{\"{}} \gdefchar^^a9{\v S} \gdefchar^^aa{\cedilla S} \gdefchar^^ab{\v T} \gdefchar^^ac{\'Z} \gdefchar^^ad{\-} \gdefchar^^ae{\v Z} \gdefchar^^af{\dotaccent Z} % \gdefchar^^b0{\textdegree} \gdefchar^^b1{\ogonek{a}} \gdefchar^^b2{\ogonek{ }} \gdefchar^^b3{\l} \gdefchar^^b4{\'{}} \gdefchar^^b5{\v l} \gdefchar^^b6{\'s} \gdefchar^^b7{\v{}} \gdefchar^^b8{\cedilla\ } \gdefchar^^b9{\v s} \gdefchar^^ba{\cedilla s} \gdefchar^^bb{\v t} \gdefchar^^bc{\'z} \gdefchar^^bd{\H{}} \gdefchar^^be{\v z} \gdefchar^^bf{\dotaccent z} % \gdefchar^^c0{\'R} \gdefchar^^c1{\'A} \gdefchar^^c2{\^A} \gdefchar^^c3{\u A} \gdefchar^^c4{\"A} \gdefchar^^c5{\'L} \gdefchar^^c6{\'C} \gdefchar^^c7{\cedilla C} \gdefchar^^c8{\v C} \gdefchar^^c9{\'E} \gdefchar^^ca{\ogonek{E}} \gdefchar^^cb{\"E} \gdefchar^^cc{\v E} \gdefchar^^cd{\'I} \gdefchar^^ce{\^I} \gdefchar^^cf{\v D} % \gdefchar^^d0{\DH} \gdefchar^^d1{\'N} \gdefchar^^d2{\v N} \gdefchar^^d3{\'O} \gdefchar^^d4{\^O} \gdefchar^^d5{\H O} \gdefchar^^d6{\"O} \gdefchar^^d7{$\times$} \gdefchar^^d8{\v R} \gdefchar^^d9{\ringaccent U} \gdefchar^^da{\'U} \gdefchar^^db{\H U} \gdefchar^^dc{\"U} \gdefchar^^dd{\'Y} \gdefchar^^de{\cedilla T} \gdefchar^^df{\ss} % \gdefchar^^e0{\'r} \gdefchar^^e1{\'a} \gdefchar^^e2{\^a} \gdefchar^^e3{\u a} \gdefchar^^e4{\"a} \gdefchar^^e5{\'l} \gdefchar^^e6{\'c} \gdefchar^^e7{\cedilla c} \gdefchar^^e8{\v c} \gdefchar^^e9{\'e} \gdefchar^^ea{\ogonek{e}} \gdefchar^^eb{\"e} \gdefchar^^ec{\v e} \gdefchar^^ed{\'{\dotless{i}}} \gdefchar^^ee{\^{\dotless{i}}} \gdefchar^^ef{\v d} % \gdefchar^^f0{\dh} \gdefchar^^f1{\'n} \gdefchar^^f2{\v n} \gdefchar^^f3{\'o} \gdefchar^^f4{\^o} \gdefchar^^f5{\H o} \gdefchar^^f6{\"o} \gdefchar^^f7{$\div$} \gdefchar^^f8{\v r} \gdefchar^^f9{\ringaccent u} \gdefchar^^fa{\'u} \gdefchar^^fb{\H u} \gdefchar^^fc{\"u} \gdefchar^^fd{\'y} \gdefchar^^fe{\cedilla t} \gdefchar^^ff{\dotaccent{}} } \endgroup % active chars % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } % Give non-ASCII bytes the active definitions for processing UTF-8 sequences \begingroup \catcode`\~13 \catcode`\$12 \catcode`\"12 % Loop from \countUTFx to \countUTFy, performing \UTFviiiTmp % substituting ~ and $ with a character token of that value. \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uccode`\$\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} % For bytes other than the first in a UTF-8 sequence. Not expected to % be expanded except when writing to auxiliary files. \countUTFx = "80 \countUTFy = "C2 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $\fi}}% \UTFviiiLoop \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiTwoOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiThreeOctets\expandafter$\fi}}% \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \gdef~{% \ifpassthroughchars $% \else\expandafter\UTFviiiFourOctets\expandafter$\fi }}% \UTFviiiLoop \endgroup \def\globallet{\global\let} % save some \expandafter's below % @U{xxxx} to produce U+xxxx, if we support it. \def\U#1{% \expandafter\ifx\csname uni:#1\endcsname \relax \iftxinativeunicodecapable % All Unicode characters can be used if native Unicode handling is % active. However, if the font does not have the glyph, % letters are missing. \begingroup \uccode`\.="#1\relax \uppercase{.} \endgroup \else \errhelp = \EMsimple \errmessage{Unicode character U+#1 not supported, sorry}% \fi \else \csname uni:#1\endcsname \fi } % These macros are used here to construct the name of a control % sequence to be defined. \def\UTFviiiTwoOctetsName#1#2{% \csname u8:#1\string #2\endcsname}% \def\UTFviiiThreeOctetsName#1#2#3{% \csname u8:#1\string #2\string #3\endcsname}% \def\UTFviiiFourOctetsName#1#2#3#4{% \csname u8:#1\string #2\string #3\string #4\endcsname}% % For UTF-8 byte sequences (TeX, e-TeX and pdfTeX), % provide a definition macro to replace a Unicode character; % this gets used by the @U command % \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacterUTFviii#1#2{% \countUTFz = "#1\relax \begingroup \parseXMLCharref % Give \u8:... its definition. The sequence of seven \expandafter's % expands after the \gdef three times, e.g. % % 1. \UTFviiTwoOctetsName B1 B2 % 2. \csname u8:B1 \string B2 \endcsname % 3. \u8: B1 B2 (a single control sequence token) % \expandafter\expandafter \expandafter\expandafter \expandafter\expandafter \expandafter\gdef \UTFviiiTmp{#2}% % \expandafter\ifx\csname uni:#1\endcsname \relax \else \message{Internal error, already defined: #1}% \fi % % define an additional control sequence for this code point. \expandafter\globallet\csname uni:#1\endcsname \UTFviiiTmp \endgroup} % % Given the value in \countUTFz as a Unicode code point, set \UTFviiiTmp % to the corresponding UTF-8 sequence. \gdef\parseXMLCharref{% \ifnum\countUTFz < "20\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 0020}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctetsName.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctetsName.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctetsName.{!,;}% \fi\fi\fi } % Extract a byte from the end of the UTF-8 representation of \countUTFx. % It must be a non-initial byte in the sequence. % Change \uccode of #1 for it to be used in \parseUTFviiiB as one % of the bytes. \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz % Save to be the future value of \countUTFz. \multiply\countUTFz by 64 % \countUTFz is now \countUTFx with the last 5 bits cleared. Subtract % in order to get the last five bits. \advance\countUTFx by -\countUTFz % Convert this to the byte in the UTF-8 sequence. \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} % Used to put a UTF-8 byte sequence into \UTFviiiTmp % #1 is the increment for \countUTFz to yield a the first byte of the UTF-8 % sequence. % #2 is one of the \UTFviii*OctetsName macros. % #3 is always a full stop (.) % #4 is a template for the other bytes in the sequence. The values for these % bytes is substituted in here with \uppercase using the \uccode's. \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro that sets a catcode to `other' non-globally % \def\DeclareUnicodeCharacterNativeOther#1#2{% \catcode"#1=\other } % https://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_M % U+0000..U+007F = https://en.wikipedia.org/wiki/Basic_Latin_(Unicode_block) % U+0080..U+00FF = https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block) % U+0100..U+017F = https://en.wikipedia.org/wiki/Latin_Extended-A % U+0180..U+024F = https://en.wikipedia.org/wiki/Latin_Extended-B % % Many of our renditions are less than wonderful, and all the missing % characters are available somewhere. Loading the necessary fonts % awaits user request. We can't truly support Unicode without % reimplementing everything that's been done in LaTeX for many years, % plus probably using luatex or xetex, and who knows what else. % We won't be doing that here in this simple file. But we can try to at % least make most of the characters not bomb out. % \def\unicodechardefs{% \DeclareUnicodeCharacter{0020}{ } % space \DeclareUnicodeCharacter{0021}{\char"21 }% % space to terminate number \DeclareUnicodeCharacter{0022}{\char"22 }% \DeclareUnicodeCharacter{0023}{\char"23 }% \DeclareUnicodeCharacter{0024}{\char"24 }% \DeclareUnicodeCharacter{0025}{\char"25 }% \DeclareUnicodeCharacter{0026}{\char"26 }% \DeclareUnicodeCharacter{0027}{\char"27 }% \DeclareUnicodeCharacter{0028}{\char"28 }% \DeclareUnicodeCharacter{0029}{\char"29 }% \DeclareUnicodeCharacter{002A}{\char"2A }% \DeclareUnicodeCharacter{002B}{\char"2B }% \DeclareUnicodeCharacter{002C}{\char"2C }% \DeclareUnicodeCharacter{002D}{\char"2D }% \DeclareUnicodeCharacter{002E}{\char"2E }% \DeclareUnicodeCharacter{002F}{\char"2F }% \DeclareUnicodeCharacter{0030}{0}% \DeclareUnicodeCharacter{0031}{1}% \DeclareUnicodeCharacter{0032}{2}% \DeclareUnicodeCharacter{0033}{3}% \DeclareUnicodeCharacter{0034}{4}% \DeclareUnicodeCharacter{0035}{5}% \DeclareUnicodeCharacter{0036}{6}% \DeclareUnicodeCharacter{0037}{7}% \DeclareUnicodeCharacter{0038}{8}% \DeclareUnicodeCharacter{0039}{9}% \DeclareUnicodeCharacter{003A}{\char"3A }% \DeclareUnicodeCharacter{003B}{\char"3B }% \DeclareUnicodeCharacter{003C}{\char"3C }% \DeclareUnicodeCharacter{003D}{\char"3D }% \DeclareUnicodeCharacter{003E}{\char"3E }% \DeclareUnicodeCharacter{003F}{\char"3F }% \DeclareUnicodeCharacter{0040}{\char"40 }% \DeclareUnicodeCharacter{0041}{A}% \DeclareUnicodeCharacter{0042}{B}% \DeclareUnicodeCharacter{0043}{C}% \DeclareUnicodeCharacter{0044}{D}% \DeclareUnicodeCharacter{0045}{E}% \DeclareUnicodeCharacter{0046}{F}% \DeclareUnicodeCharacter{0047}{G}% \DeclareUnicodeCharacter{0048}{H}% \DeclareUnicodeCharacter{0049}{I}% \DeclareUnicodeCharacter{004A}{J}% \DeclareUnicodeCharacter{004B}{K}% \DeclareUnicodeCharacter{004C}{L}% \DeclareUnicodeCharacter{004D}{M}% \DeclareUnicodeCharacter{004E}{N}% \DeclareUnicodeCharacter{004F}{O}% \DeclareUnicodeCharacter{0050}{P}% \DeclareUnicodeCharacter{0051}{Q}% \DeclareUnicodeCharacter{0052}{R}% \DeclareUnicodeCharacter{0053}{S}% \DeclareUnicodeCharacter{0054}{T}% \DeclareUnicodeCharacter{0055}{U}% \DeclareUnicodeCharacter{0056}{V}% \DeclareUnicodeCharacter{0057}{W}% \DeclareUnicodeCharacter{0058}{X}% \DeclareUnicodeCharacter{0059}{Y}% \DeclareUnicodeCharacter{005A}{Z}% \DeclareUnicodeCharacter{005B}{\char"5B }% \DeclareUnicodeCharacter{005C}{\char"5C }% \DeclareUnicodeCharacter{005D}{\char"5D }% \DeclareUnicodeCharacter{005E}{\char"5E }% \DeclareUnicodeCharacter{005F}{\char"5F }% \DeclareUnicodeCharacter{0060}{\char"60 }% \DeclareUnicodeCharacter{0061}{a}% \DeclareUnicodeCharacter{0062}{b}% \DeclareUnicodeCharacter{0063}{c}% \DeclareUnicodeCharacter{0064}{d}% \DeclareUnicodeCharacter{0065}{e}% \DeclareUnicodeCharacter{0066}{f}% \DeclareUnicodeCharacter{0067}{g}% \DeclareUnicodeCharacter{0068}{h}% \DeclareUnicodeCharacter{0069}{i}% \DeclareUnicodeCharacter{006A}{j}% \DeclareUnicodeCharacter{006B}{k}% \DeclareUnicodeCharacter{006C}{l}% \DeclareUnicodeCharacter{006D}{m}% \DeclareUnicodeCharacter{006E}{n}% \DeclareUnicodeCharacter{006F}{o}% \DeclareUnicodeCharacter{0070}{p}% \DeclareUnicodeCharacter{0071}{q}% \DeclareUnicodeCharacter{0072}{r}% \DeclareUnicodeCharacter{0073}{s}% \DeclareUnicodeCharacter{0074}{t}% \DeclareUnicodeCharacter{0075}{u}% \DeclareUnicodeCharacter{0076}{v}% \DeclareUnicodeCharacter{0077}{w}% \DeclareUnicodeCharacter{0078}{x}% \DeclareUnicodeCharacter{0079}{y}% \DeclareUnicodeCharacter{007A}{z}% \DeclareUnicodeCharacter{007B}{\char"7B }% \DeclareUnicodeCharacter{007C}{\char"7C }% \DeclareUnicodeCharacter{007D}{\char"7D }% \DeclareUnicodeCharacter{007E}{\char"7E }% % \DeclareUnicodeCharacter{007F}{} % DEL % \DeclareUnicodeCharacter{00A0}{\tie}% \DeclareUnicodeCharacter{00A1}{\exclamdown}% \DeclareUnicodeCharacter{00A2}{{\tcfont \char162}}% 0242=cent \DeclareUnicodeCharacter{00A3}{\pounds{}}% \DeclareUnicodeCharacter{00A4}{{\tcfont \char164}}% 0244=currency \DeclareUnicodeCharacter{00A5}{{\tcfont \char165}}% 0245=yen \DeclareUnicodeCharacter{00A6}{{\tcfont \char166}}% 0246=brokenbar \DeclareUnicodeCharacter{00A7}{\S}% \DeclareUnicodeCharacter{00A8}{\"{ }}% \DeclareUnicodeCharacter{00A9}{\copyright{}}% \DeclareUnicodeCharacter{00AA}{\ordf}% \DeclareUnicodeCharacter{00AB}{\guillemetleft{}}% \DeclareUnicodeCharacter{00AC}{\ensuremath\lnot}% \DeclareUnicodeCharacter{00AD}{\-}% \DeclareUnicodeCharacter{00AE}{\registeredsymbol{}}% \DeclareUnicodeCharacter{00AF}{\={ }}% % \DeclareUnicodeCharacter{00B0}{\textdegree}% \DeclareUnicodeCharacter{00B1}{\ensuremath\pm}% \DeclareUnicodeCharacter{00B2}{$^2$}% \DeclareUnicodeCharacter{00B3}{$^3$}% \DeclareUnicodeCharacter{00B4}{\'{ }}% \DeclareUnicodeCharacter{00B5}{$\mu$}% \DeclareUnicodeCharacter{00B6}{\P}% \DeclareUnicodeCharacter{00B7}{\ensuremath\cdot}% \DeclareUnicodeCharacter{00B8}{\cedilla{ }}% \DeclareUnicodeCharacter{00B9}{$^1$}% \DeclareUnicodeCharacter{00BA}{\ordm}% \DeclareUnicodeCharacter{00BB}{\guillemetright{}}% \DeclareUnicodeCharacter{00BC}{$1\over4$}% \DeclareUnicodeCharacter{00BD}{$1\over2$}% \DeclareUnicodeCharacter{00BE}{$3\over4$}% \DeclareUnicodeCharacter{00BF}{\questiondown}% % \DeclareUnicodeCharacter{00C0}{\`A}% \DeclareUnicodeCharacter{00C1}{\'A}% \DeclareUnicodeCharacter{00C2}{\^A}% \DeclareUnicodeCharacter{00C3}{\~A}% \DeclareUnicodeCharacter{00C4}{\"A}% \DeclareUnicodeCharacter{00C5}{\AA}% \DeclareUnicodeCharacter{00C6}{\AE}% \DeclareUnicodeCharacter{00C7}{\cedilla{C}}% \DeclareUnicodeCharacter{00C8}{\`E}% \DeclareUnicodeCharacter{00C9}{\'E}% \DeclareUnicodeCharacter{00CA}{\^E}% \DeclareUnicodeCharacter{00CB}{\"E}% \DeclareUnicodeCharacter{00CC}{\`I}% \DeclareUnicodeCharacter{00CD}{\'I}% \DeclareUnicodeCharacter{00CE}{\^I}% \DeclareUnicodeCharacter{00CF}{\"I}% % \DeclareUnicodeCharacter{00D0}{\DH}% \DeclareUnicodeCharacter{00D1}{\~N}% \DeclareUnicodeCharacter{00D2}{\`O}% \DeclareUnicodeCharacter{00D3}{\'O}% \DeclareUnicodeCharacter{00D4}{\^O}% \DeclareUnicodeCharacter{00D5}{\~O}% \DeclareUnicodeCharacter{00D6}{\"O}% \DeclareUnicodeCharacter{00D7}{\ensuremath\times}% \DeclareUnicodeCharacter{00D8}{\O}% \DeclareUnicodeCharacter{00D9}{\`U}% \DeclareUnicodeCharacter{00DA}{\'U}% \DeclareUnicodeCharacter{00DB}{\^U}% \DeclareUnicodeCharacter{00DC}{\"U}% \DeclareUnicodeCharacter{00DD}{\'Y}% \DeclareUnicodeCharacter{00DE}{\TH}% \DeclareUnicodeCharacter{00DF}{\ss}% % \DeclareUnicodeCharacter{00E0}{\`a}% \DeclareUnicodeCharacter{00E1}{\'a}% \DeclareUnicodeCharacter{00E2}{\^a}% \DeclareUnicodeCharacter{00E3}{\~a}% \DeclareUnicodeCharacter{00E4}{\"a}% \DeclareUnicodeCharacter{00E5}{\aa}% \DeclareUnicodeCharacter{00E6}{\ae}% \DeclareUnicodeCharacter{00E7}{\cedilla{c}}% \DeclareUnicodeCharacter{00E8}{\`e}% \DeclareUnicodeCharacter{00E9}{\'e}% \DeclareUnicodeCharacter{00EA}{\^e}% \DeclareUnicodeCharacter{00EB}{\"e}% \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}}% \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}}% \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}}% \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}}% % \DeclareUnicodeCharacter{00F0}{\dh}% \DeclareUnicodeCharacter{00F1}{\~n}% \DeclareUnicodeCharacter{00F2}{\`o}% \DeclareUnicodeCharacter{00F3}{\'o}% \DeclareUnicodeCharacter{00F4}{\^o}% \DeclareUnicodeCharacter{00F5}{\~o}% \DeclareUnicodeCharacter{00F6}{\"o}% \DeclareUnicodeCharacter{00F7}{\ensuremath\div}% \DeclareUnicodeCharacter{00F8}{\o}% \DeclareUnicodeCharacter{00F9}{\`u}% \DeclareUnicodeCharacter{00FA}{\'u}% \DeclareUnicodeCharacter{00FB}{\^u}% \DeclareUnicodeCharacter{00FC}{\"u}% \DeclareUnicodeCharacter{00FD}{\'y}% \DeclareUnicodeCharacter{00FE}{\th}% \DeclareUnicodeCharacter{00FF}{\"y}% % \DeclareUnicodeCharacter{0100}{\=A}% \DeclareUnicodeCharacter{0101}{\=a}% \DeclareUnicodeCharacter{0102}{\u{A}}% \DeclareUnicodeCharacter{0103}{\u{a}}% \DeclareUnicodeCharacter{0104}{\ogonek{A}}% \DeclareUnicodeCharacter{0105}{\ogonek{a}}% \DeclareUnicodeCharacter{0106}{\'C}% \DeclareUnicodeCharacter{0107}{\'c}% \DeclareUnicodeCharacter{0108}{\^C}% \DeclareUnicodeCharacter{0109}{\^c}% \DeclareUnicodeCharacter{010A}{\dotaccent{C}}% \DeclareUnicodeCharacter{010B}{\dotaccent{c}}% \DeclareUnicodeCharacter{010C}{\v{C}}% \DeclareUnicodeCharacter{010D}{\v{c}}% \DeclareUnicodeCharacter{010E}{\v{D}}% \DeclareUnicodeCharacter{010F}{d'}% % \DeclareUnicodeCharacter{0110}{\DH}% \DeclareUnicodeCharacter{0111}{\dh}% \DeclareUnicodeCharacter{0112}{\=E}% \DeclareUnicodeCharacter{0113}{\=e}% \DeclareUnicodeCharacter{0114}{\u{E}}% \DeclareUnicodeCharacter{0115}{\u{e}}% \DeclareUnicodeCharacter{0116}{\dotaccent{E}}% \DeclareUnicodeCharacter{0117}{\dotaccent{e}}% \DeclareUnicodeCharacter{0118}{\ogonek{E}}% \DeclareUnicodeCharacter{0119}{\ogonek{e}}% \DeclareUnicodeCharacter{011A}{\v{E}}% \DeclareUnicodeCharacter{011B}{\v{e}}% \DeclareUnicodeCharacter{011C}{\^G}% \DeclareUnicodeCharacter{011D}{\^g}% \DeclareUnicodeCharacter{011E}{\u{G}}% \DeclareUnicodeCharacter{011F}{\u{g}}% % \DeclareUnicodeCharacter{0120}{\dotaccent{G}}% \DeclareUnicodeCharacter{0121}{\dotaccent{g}}% \DeclareUnicodeCharacter{0122}{\cedilla{G}}% \DeclareUnicodeCharacter{0123}{\cedilla{g}}% \DeclareUnicodeCharacter{0124}{\^H}% \DeclareUnicodeCharacter{0125}{\^h}% \DeclareUnicodeCharacter{0126}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0127}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0128}{\~I}% \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}}% \DeclareUnicodeCharacter{012A}{\=I}% \DeclareUnicodeCharacter{012B}{\={\dotless{i}}}% \DeclareUnicodeCharacter{012C}{\u{I}}% \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}}% \DeclareUnicodeCharacter{012E}{\ogonek{I}}% \DeclareUnicodeCharacter{012F}{\ogonek{i}}% % \DeclareUnicodeCharacter{0130}{\dotaccent{I}}% \DeclareUnicodeCharacter{0131}{\dotless{i}}% \DeclareUnicodeCharacter{0132}{IJ}% \DeclareUnicodeCharacter{0133}{ij}% \DeclareUnicodeCharacter{0134}{\^J}% \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}}% \DeclareUnicodeCharacter{0136}{\cedilla{K}}% \DeclareUnicodeCharacter{0137}{\cedilla{k}}% \DeclareUnicodeCharacter{0138}{\ensuremath\kappa}% \DeclareUnicodeCharacter{0139}{\'L}% \DeclareUnicodeCharacter{013A}{\'l}% \DeclareUnicodeCharacter{013B}{\cedilla{L}}% \DeclareUnicodeCharacter{013C}{\cedilla{l}}% \DeclareUnicodeCharacter{013D}{L'}% should kern \DeclareUnicodeCharacter{013E}{l'}% should kern \DeclareUnicodeCharacter{013F}{L\U{00B7}}% % \DeclareUnicodeCharacter{0140}{l\U{00B7}}% \DeclareUnicodeCharacter{0141}{\L}% \DeclareUnicodeCharacter{0142}{\l}% \DeclareUnicodeCharacter{0143}{\'N}% \DeclareUnicodeCharacter{0144}{\'n}% \DeclareUnicodeCharacter{0145}{\cedilla{N}}% \DeclareUnicodeCharacter{0146}{\cedilla{n}}% \DeclareUnicodeCharacter{0147}{\v{N}}% \DeclareUnicodeCharacter{0148}{\v{n}}% \DeclareUnicodeCharacter{0149}{'n}% \DeclareUnicodeCharacter{014A}{\missingcharmsg{ENG}}% \DeclareUnicodeCharacter{014B}{\missingcharmsg{eng}}% \DeclareUnicodeCharacter{014C}{\=O}% \DeclareUnicodeCharacter{014D}{\=o}% \DeclareUnicodeCharacter{014E}{\u{O}}% \DeclareUnicodeCharacter{014F}{\u{o}}% % \DeclareUnicodeCharacter{0150}{\H{O}}% \DeclareUnicodeCharacter{0151}{\H{o}}% \DeclareUnicodeCharacter{0152}{\OE}% \DeclareUnicodeCharacter{0153}{\oe}% \DeclareUnicodeCharacter{0154}{\'R}% \DeclareUnicodeCharacter{0155}{\'r}% \DeclareUnicodeCharacter{0156}{\cedilla{R}}% \DeclareUnicodeCharacter{0157}{\cedilla{r}}% \DeclareUnicodeCharacter{0158}{\v{R}}% \DeclareUnicodeCharacter{0159}{\v{r}}% \DeclareUnicodeCharacter{015A}{\'S}% \DeclareUnicodeCharacter{015B}{\'s}% \DeclareUnicodeCharacter{015C}{\^S}% \DeclareUnicodeCharacter{015D}{\^s}% \DeclareUnicodeCharacter{015E}{\cedilla{S}}% \DeclareUnicodeCharacter{015F}{\cedilla{s}}% % \DeclareUnicodeCharacter{0160}{\v{S}}% \DeclareUnicodeCharacter{0161}{\v{s}}% \DeclareUnicodeCharacter{0162}{\cedilla{T}}% \DeclareUnicodeCharacter{0163}{\cedilla{t}}% \DeclareUnicodeCharacter{0164}{\v{T}}% \DeclareUnicodeCharacter{0165}{\v{t}}% \DeclareUnicodeCharacter{0166}{\missingcharmsg{H WITH STROKE}}% \DeclareUnicodeCharacter{0167}{\missingcharmsg{h WITH STROKE}}% \DeclareUnicodeCharacter{0168}{\~U}% \DeclareUnicodeCharacter{0169}{\~u}% \DeclareUnicodeCharacter{016A}{\=U}% \DeclareUnicodeCharacter{016B}{\=u}% \DeclareUnicodeCharacter{016C}{\u{U}}% \DeclareUnicodeCharacter{016D}{\u{u}}% \DeclareUnicodeCharacter{016E}{\ringaccent{U}}% \DeclareUnicodeCharacter{016F}{\ringaccent{u}}% % \DeclareUnicodeCharacter{0170}{\H{U}}% \DeclareUnicodeCharacter{0171}{\H{u}}% \DeclareUnicodeCharacter{0172}{\ogonek{U}}% \DeclareUnicodeCharacter{0173}{\ogonek{u}}% \DeclareUnicodeCharacter{0174}{\^W}% \DeclareUnicodeCharacter{0175}{\^w}% \DeclareUnicodeCharacter{0176}{\^Y}% \DeclareUnicodeCharacter{0177}{\^y}% \DeclareUnicodeCharacter{0178}{\"Y}% \DeclareUnicodeCharacter{0179}{\'Z}% \DeclareUnicodeCharacter{017A}{\'z}% \DeclareUnicodeCharacter{017B}{\dotaccent{Z}}% \DeclareUnicodeCharacter{017C}{\dotaccent{z}}% \DeclareUnicodeCharacter{017D}{\v{Z}}% \DeclareUnicodeCharacter{017E}{\v{z}}% \DeclareUnicodeCharacter{017F}{\missingcharmsg{LONG S}}% % \DeclareUnicodeCharacter{01C4}{D\v{Z}}% \DeclareUnicodeCharacter{01C5}{D\v{z}}% \DeclareUnicodeCharacter{01C6}{d\v{z}}% \DeclareUnicodeCharacter{01C7}{LJ}% \DeclareUnicodeCharacter{01C8}{Lj}% \DeclareUnicodeCharacter{01C9}{lj}% \DeclareUnicodeCharacter{01CA}{NJ}% \DeclareUnicodeCharacter{01CB}{Nj}% \DeclareUnicodeCharacter{01CC}{nj}% \DeclareUnicodeCharacter{01CD}{\v{A}}% \DeclareUnicodeCharacter{01CE}{\v{a}}% \DeclareUnicodeCharacter{01CF}{\v{I}}% % \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}}% \DeclareUnicodeCharacter{01D1}{\v{O}}% \DeclareUnicodeCharacter{01D2}{\v{o}}% \DeclareUnicodeCharacter{01D3}{\v{U}}% \DeclareUnicodeCharacter{01D4}{\v{u}}% % \DeclareUnicodeCharacter{01E2}{\={\AE}}% \DeclareUnicodeCharacter{01E3}{\={\ae}}% \DeclareUnicodeCharacter{01E6}{\v{G}}% \DeclareUnicodeCharacter{01E7}{\v{g}}% \DeclareUnicodeCharacter{01E8}{\v{K}}% \DeclareUnicodeCharacter{01E9}{\v{k}}% % \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}}% \DeclareUnicodeCharacter{01F1}{DZ}% \DeclareUnicodeCharacter{01F2}{Dz}% \DeclareUnicodeCharacter{01F3}{dz}% \DeclareUnicodeCharacter{01F4}{\'G}% \DeclareUnicodeCharacter{01F5}{\'g}% \DeclareUnicodeCharacter{01F8}{\`N}% \DeclareUnicodeCharacter{01F9}{\`n}% \DeclareUnicodeCharacter{01FC}{\'{\AE}}% \DeclareUnicodeCharacter{01FD}{\'{\ae}}% \DeclareUnicodeCharacter{01FE}{\'{\O}}% \DeclareUnicodeCharacter{01FF}{\'{\o}}% % \DeclareUnicodeCharacter{021E}{\v{H}}% \DeclareUnicodeCharacter{021F}{\v{h}}% % \DeclareUnicodeCharacter{0226}{\dotaccent{A}}% \DeclareUnicodeCharacter{0227}{\dotaccent{a}}% \DeclareUnicodeCharacter{0228}{\cedilla{E}}% \DeclareUnicodeCharacter{0229}{\cedilla{e}}% \DeclareUnicodeCharacter{022E}{\dotaccent{O}}% \DeclareUnicodeCharacter{022F}{\dotaccent{o}}% % \DeclareUnicodeCharacter{0232}{\=Y}% \DeclareUnicodeCharacter{0233}{\=y}% \DeclareUnicodeCharacter{0237}{\dotless{j}}% % \DeclareUnicodeCharacter{02BC}{'}% % \DeclareUnicodeCharacter{02DB}{\ogonek{ }}% % % Greek letters upper case \DeclareUnicodeCharacter{0391}{{\it A}}% \DeclareUnicodeCharacter{0392}{{\it B}}% \DeclareUnicodeCharacter{0393}{\ensuremath{\mit\Gamma}}% \DeclareUnicodeCharacter{0394}{\ensuremath{\mit\Delta}}% \DeclareUnicodeCharacter{0395}{{\it E}}% \DeclareUnicodeCharacter{0396}{{\it Z}}% \DeclareUnicodeCharacter{0397}{{\it H}}% \DeclareUnicodeCharacter{0398}{\ensuremath{\mit\Theta}}% \DeclareUnicodeCharacter{0399}{{\it I}}% \DeclareUnicodeCharacter{039A}{{\it K}}% \DeclareUnicodeCharacter{039B}{\ensuremath{\mit\Lambda}}% \DeclareUnicodeCharacter{039C}{{\it M}}% \DeclareUnicodeCharacter{039D}{{\it N}}% \DeclareUnicodeCharacter{039E}{\ensuremath{\mit\Xi}}% \DeclareUnicodeCharacter{039F}{{\it O}}% \DeclareUnicodeCharacter{03A0}{\ensuremath{\mit\Pi}}% \DeclareUnicodeCharacter{03A1}{{\it P}}% %\DeclareUnicodeCharacter{03A2}{} % none - corresponds to final sigma \DeclareUnicodeCharacter{03A3}{\ensuremath{\mit\Sigma}}% \DeclareUnicodeCharacter{03A4}{{\it T}}% \DeclareUnicodeCharacter{03A5}{\ensuremath{\mit\Upsilon}}% \DeclareUnicodeCharacter{03A6}{\ensuremath{\mit\Phi}}% \DeclareUnicodeCharacter{03A7}{{\it X}}% \DeclareUnicodeCharacter{03A8}{\ensuremath{\mit\Psi}}% \DeclareUnicodeCharacter{03A9}{\ensuremath{\mit\Omega}}% % % Vowels with accents \DeclareUnicodeCharacter{0390}{\ensuremath{\ddot{\acute\iota}}}% \DeclareUnicodeCharacter{03AC}{\ensuremath{\acute\alpha}}% \DeclareUnicodeCharacter{03AD}{\ensuremath{\acute\epsilon}}% \DeclareUnicodeCharacter{03AE}{\ensuremath{\acute\eta}}% \DeclareUnicodeCharacter{03AF}{\ensuremath{\acute\iota}}% \DeclareUnicodeCharacter{03B0}{\ensuremath{\acute{\ddot\upsilon}}}% % % Standalone accent \DeclareUnicodeCharacter{0384}{\ensuremath{\acute{\ }}}% % % Greek letters lower case \DeclareUnicodeCharacter{03B1}{\ensuremath\alpha}% \DeclareUnicodeCharacter{03B2}{\ensuremath\beta}% \DeclareUnicodeCharacter{03B3}{\ensuremath\gamma}% \DeclareUnicodeCharacter{03B4}{\ensuremath\delta}% \DeclareUnicodeCharacter{03B5}{\ensuremath\epsilon}% \DeclareUnicodeCharacter{03B6}{\ensuremath\zeta}% \DeclareUnicodeCharacter{03B7}{\ensuremath\eta}% \DeclareUnicodeCharacter{03B8}{\ensuremath\theta}% \DeclareUnicodeCharacter{03B9}{\ensuremath\iota}% \DeclareUnicodeCharacter{03BA}{\ensuremath\kappa}% \DeclareUnicodeCharacter{03BB}{\ensuremath\lambda}% \DeclareUnicodeCharacter{03BC}{\ensuremath\mu}% \DeclareUnicodeCharacter{03BD}{\ensuremath\nu}% \DeclareUnicodeCharacter{03BE}{\ensuremath\xi}% \DeclareUnicodeCharacter{03BF}{{\it o}}% omicron \DeclareUnicodeCharacter{03C0}{\ensuremath\pi}% \DeclareUnicodeCharacter{03C1}{\ensuremath\rho}% \DeclareUnicodeCharacter{03C2}{\ensuremath\varsigma}% \DeclareUnicodeCharacter{03C3}{\ensuremath\sigma}% \DeclareUnicodeCharacter{03C4}{\ensuremath\tau}% \DeclareUnicodeCharacter{03C5}{\ensuremath\upsilon}% \DeclareUnicodeCharacter{03C6}{\ensuremath\phi}% \DeclareUnicodeCharacter{03C7}{\ensuremath\chi}% \DeclareUnicodeCharacter{03C8}{\ensuremath\psi}% \DeclareUnicodeCharacter{03C9}{\ensuremath\omega}% % % More Greek vowels with accents \DeclareUnicodeCharacter{03CA}{\ensuremath{\ddot\iota}}% \DeclareUnicodeCharacter{03CB}{\ensuremath{\ddot\upsilon}}% \DeclareUnicodeCharacter{03CC}{\ensuremath{\acute o}}% \DeclareUnicodeCharacter{03CD}{\ensuremath{\acute\upsilon}}% \DeclareUnicodeCharacter{03CE}{\ensuremath{\acute\omega}}% % % Variant Greek letters \DeclareUnicodeCharacter{03D1}{\ensuremath\vartheta}% \DeclareUnicodeCharacter{03D6}{\ensuremath\varpi}% \DeclareUnicodeCharacter{03F1}{\ensuremath\varrho}% % \DeclareUnicodeCharacter{1E02}{\dotaccent{B}}% \DeclareUnicodeCharacter{1E03}{\dotaccent{b}}% \DeclareUnicodeCharacter{1E04}{\udotaccent{B}}% \DeclareUnicodeCharacter{1E05}{\udotaccent{b}}% \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}}% \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}}% \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}}% \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}}% \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}}% \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}}% \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}}% \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}}% % \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}}% \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}}% % \DeclareUnicodeCharacter{1E20}{\=G}% \DeclareUnicodeCharacter{1E21}{\=g}% \DeclareUnicodeCharacter{1E22}{\dotaccent{H}}% \DeclareUnicodeCharacter{1E23}{\dotaccent{h}}% \DeclareUnicodeCharacter{1E24}{\udotaccent{H}}% \DeclareUnicodeCharacter{1E25}{\udotaccent{h}}% \DeclareUnicodeCharacter{1E26}{\"H}% \DeclareUnicodeCharacter{1E27}{\"h}% % \DeclareUnicodeCharacter{1E30}{\'K}% \DeclareUnicodeCharacter{1E31}{\'k}% \DeclareUnicodeCharacter{1E32}{\udotaccent{K}}% \DeclareUnicodeCharacter{1E33}{\udotaccent{k}}% \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}}% \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}}% \DeclareUnicodeCharacter{1E36}{\udotaccent{L}}% \DeclareUnicodeCharacter{1E37}{\udotaccent{l}}% \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}}% \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}}% \DeclareUnicodeCharacter{1E3E}{\'M}% \DeclareUnicodeCharacter{1E3F}{\'m}% % \DeclareUnicodeCharacter{1E40}{\dotaccent{M}}% \DeclareUnicodeCharacter{1E41}{\dotaccent{m}}% \DeclareUnicodeCharacter{1E42}{\udotaccent{M}}% \DeclareUnicodeCharacter{1E43}{\udotaccent{m}}% \DeclareUnicodeCharacter{1E44}{\dotaccent{N}}% \DeclareUnicodeCharacter{1E45}{\dotaccent{n}}% \DeclareUnicodeCharacter{1E46}{\udotaccent{N}}% \DeclareUnicodeCharacter{1E47}{\udotaccent{n}}% \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}}% \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}}% % \DeclareUnicodeCharacter{1E54}{\'P}% \DeclareUnicodeCharacter{1E55}{\'p}% \DeclareUnicodeCharacter{1E56}{\dotaccent{P}}% \DeclareUnicodeCharacter{1E57}{\dotaccent{p}}% \DeclareUnicodeCharacter{1E58}{\dotaccent{R}}% \DeclareUnicodeCharacter{1E59}{\dotaccent{r}}% \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}}% \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}}% \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}}% \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}}% % \DeclareUnicodeCharacter{1E60}{\dotaccent{S}}% \DeclareUnicodeCharacter{1E61}{\dotaccent{s}}% \DeclareUnicodeCharacter{1E62}{\udotaccent{S}}% \DeclareUnicodeCharacter{1E63}{\udotaccent{s}}% \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}}% \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}}% \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}}% \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}}% \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}}% \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}}% % \DeclareUnicodeCharacter{1E7C}{\~V}% \DeclareUnicodeCharacter{1E7D}{\~v}% \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}}% \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}}% % \DeclareUnicodeCharacter{1E80}{\`W}% \DeclareUnicodeCharacter{1E81}{\`w}% \DeclareUnicodeCharacter{1E82}{\'W}% \DeclareUnicodeCharacter{1E83}{\'w}% \DeclareUnicodeCharacter{1E84}{\"W}% \DeclareUnicodeCharacter{1E85}{\"w}% \DeclareUnicodeCharacter{1E86}{\dotaccent{W}}% \DeclareUnicodeCharacter{1E87}{\dotaccent{w}}% \DeclareUnicodeCharacter{1E88}{\udotaccent{W}}% \DeclareUnicodeCharacter{1E89}{\udotaccent{w}}% \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}}% \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}}% \DeclareUnicodeCharacter{1E8C}{\"X}% \DeclareUnicodeCharacter{1E8D}{\"x}% \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}}% \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}}% % \DeclareUnicodeCharacter{1E90}{\^Z}% \DeclareUnicodeCharacter{1E91}{\^z}% \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}}% \DeclareUnicodeCharacter{1E93}{\udotaccent{z}}% \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}}% \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}}% \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}}% \DeclareUnicodeCharacter{1E97}{\"t}% \DeclareUnicodeCharacter{1E98}{\ringaccent{w}}% \DeclareUnicodeCharacter{1E99}{\ringaccent{y}}% % \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}}% \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}}% % \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}}% \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}}% \DeclareUnicodeCharacter{1EBC}{\~E}% \DeclareUnicodeCharacter{1EBD}{\~e}% % \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}}% \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}}% \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}}% \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}}% % \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}}% \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}}% % \DeclareUnicodeCharacter{1EF2}{\`Y}% \DeclareUnicodeCharacter{1EF3}{\`y}% \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}}% % \DeclareUnicodeCharacter{1EF8}{\~Y}% \DeclareUnicodeCharacter{1EF9}{\~y}% % % Exotic spaces \DeclareUnicodeCharacter{2007}{\hphantom{0}}% % % Punctuation \DeclareUnicodeCharacter{2013}{--}% \DeclareUnicodeCharacter{2014}{---}% \DeclareUnicodeCharacter{2018}{\quoteleft{}}% \DeclareUnicodeCharacter{2019}{\quoteright{}}% \DeclareUnicodeCharacter{201A}{\quotesinglbase{}}% \DeclareUnicodeCharacter{201C}{\quotedblleft{}}% \DeclareUnicodeCharacter{201D}{\quotedblright{}}% \DeclareUnicodeCharacter{201E}{\quotedblbase{}}% \DeclareUnicodeCharacter{2020}{\ensuremath\dagger}% \DeclareUnicodeCharacter{2021}{\ensuremath\ddagger}% \DeclareUnicodeCharacter{2022}{\bullet{}}% \DeclareUnicodeCharacter{202F}{\thinspace}% \DeclareUnicodeCharacter{2026}{\dots{}}% \DeclareUnicodeCharacter{2039}{\guilsinglleft{}}% \DeclareUnicodeCharacter{203A}{\guilsinglright{}}% % \DeclareUnicodeCharacter{20AC}{\euro{}}% % \DeclareUnicodeCharacter{2192}{\arrow}% \DeclareUnicodeCharacter{21D2}{\result{}}% % % Mathematical symbols \DeclareUnicodeCharacter{2200}{\ensuremath\forall}% \DeclareUnicodeCharacter{2203}{\ensuremath\exists}% \DeclareUnicodeCharacter{2208}{\ensuremath\in}% \DeclareUnicodeCharacter{2212}{\minus{}}% \DeclareUnicodeCharacter{2217}{\ast}% \DeclareUnicodeCharacter{221E}{\ensuremath\infty}% \DeclareUnicodeCharacter{2225}{\ensuremath\parallel}% \DeclareUnicodeCharacter{2227}{\ensuremath\wedge}% \DeclareUnicodeCharacter{2229}{\ensuremath\cap}% \DeclareUnicodeCharacter{2261}{\equiv{}}% \DeclareUnicodeCharacter{2264}{\ensuremath\leq}% \DeclareUnicodeCharacter{2265}{\ensuremath\geq}% \DeclareUnicodeCharacter{2282}{\ensuremath\subset}% \DeclareUnicodeCharacter{2287}{\ensuremath\supseteq}% % \DeclareUnicodeCharacter{2016}{\ensuremath\Vert}% \DeclareUnicodeCharacter{2032}{\ensuremath\prime}% \DeclareUnicodeCharacter{210F}{\ensuremath\hbar}% \DeclareUnicodeCharacter{2111}{\ensuremath\Im}% \DeclareUnicodeCharacter{2113}{\ensuremath\ell}% \DeclareUnicodeCharacter{2118}{\ensuremath\wp}% \DeclareUnicodeCharacter{211C}{\ensuremath\Re}% \DeclareUnicodeCharacter{2135}{\ensuremath\aleph}% \DeclareUnicodeCharacter{2190}{\ensuremath\leftarrow}% \DeclareUnicodeCharacter{2191}{\ensuremath\uparrow}% \DeclareUnicodeCharacter{2193}{\ensuremath\downarrow}% \DeclareUnicodeCharacter{2194}{\ensuremath\leftrightarrow}% \DeclareUnicodeCharacter{2195}{\ensuremath\updownarrow}% \DeclareUnicodeCharacter{2196}{\ensuremath\nwarrow}% \DeclareUnicodeCharacter{2197}{\ensuremath\nearrow}% \DeclareUnicodeCharacter{2198}{\ensuremath\searrow}% \DeclareUnicodeCharacter{2199}{\ensuremath\swarrow}% \DeclareUnicodeCharacter{21A6}{\ensuremath\mapsto}% \DeclareUnicodeCharacter{21A9}{\ensuremath\hookleftarrow}% \DeclareUnicodeCharacter{21AA}{\ensuremath\hookrightarrow}% \DeclareUnicodeCharacter{21BC}{\ensuremath\leftharpoonup}% \DeclareUnicodeCharacter{21BD}{\ensuremath\leftharpoondown}% \DeclareUnicodeCharacter{21C0}{\ensuremath\rightharpoonup}% \DeclareUnicodeCharacter{21C1}{\ensuremath\rightharpoondown}% \DeclareUnicodeCharacter{21CC}{\ensuremath\rightleftharpoons}% \DeclareUnicodeCharacter{21D0}{\ensuremath\Leftarrow}% \DeclareUnicodeCharacter{21D1}{\ensuremath\Uparrow}% \DeclareUnicodeCharacter{21D3}{\ensuremath\Downarrow}% \DeclareUnicodeCharacter{21D4}{\ensuremath\Leftrightarrow}% \DeclareUnicodeCharacter{21D5}{\ensuremath\Updownarrow}% \DeclareUnicodeCharacter{2202}{\ensuremath\partial}% \DeclareUnicodeCharacter{2205}{\ensuremath\emptyset}% \DeclareUnicodeCharacter{2207}{\ensuremath\nabla}% \DeclareUnicodeCharacter{2209}{\ensuremath\notin}% \DeclareUnicodeCharacter{220B}{\ensuremath\owns}% \DeclareUnicodeCharacter{220F}{\ensuremath\prod}% \DeclareUnicodeCharacter{2210}{\ensuremath\coprod}% \DeclareUnicodeCharacter{2211}{\ensuremath\sum}% \DeclareUnicodeCharacter{2213}{\ensuremath\mp}% \DeclareUnicodeCharacter{2218}{\ensuremath\circ}% \DeclareUnicodeCharacter{221A}{\ensuremath\surd}% \DeclareUnicodeCharacter{221D}{\ensuremath\propto}% \DeclareUnicodeCharacter{2220}{\ensuremath\angle}% \DeclareUnicodeCharacter{2223}{\ensuremath\mid}% \DeclareUnicodeCharacter{2228}{\ensuremath\vee}% \DeclareUnicodeCharacter{222A}{\ensuremath\cup}% \DeclareUnicodeCharacter{222B}{\ensuremath\smallint}% \DeclareUnicodeCharacter{222E}{\ensuremath\oint}% \DeclareUnicodeCharacter{223C}{\ensuremath\sim}% \DeclareUnicodeCharacter{2240}{\ensuremath\wr}% \DeclareUnicodeCharacter{2243}{\ensuremath\simeq}% \DeclareUnicodeCharacter{2245}{\ensuremath\cong}% \DeclareUnicodeCharacter{2248}{\ensuremath\approx}% \DeclareUnicodeCharacter{224D}{\ensuremath\asymp}% \DeclareUnicodeCharacter{2250}{\ensuremath\doteq}% \DeclareUnicodeCharacter{2260}{\ensuremath\neq}% \DeclareUnicodeCharacter{226A}{\ensuremath\ll}% \DeclareUnicodeCharacter{226B}{\ensuremath\gg}% \DeclareUnicodeCharacter{227A}{\ensuremath\prec}% \DeclareUnicodeCharacter{227B}{\ensuremath\succ}% \DeclareUnicodeCharacter{2283}{\ensuremath\supset}% \DeclareUnicodeCharacter{2286}{\ensuremath\subseteq}% \DeclareUnicodeCharacter{228E}{\ensuremath\uplus}% \DeclareUnicodeCharacter{2291}{\ensuremath\sqsubseteq}% \DeclareUnicodeCharacter{2292}{\ensuremath\sqsupseteq}% \DeclareUnicodeCharacter{2293}{\ensuremath\sqcap}% \DeclareUnicodeCharacter{2294}{\ensuremath\sqcup}% \DeclareUnicodeCharacter{2295}{\ensuremath\oplus}% \DeclareUnicodeCharacter{2296}{\ensuremath\ominus}% \DeclareUnicodeCharacter{2297}{\ensuremath\otimes}% \DeclareUnicodeCharacter{2298}{\ensuremath\oslash}% \DeclareUnicodeCharacter{2299}{\ensuremath\odot}% \DeclareUnicodeCharacter{22A2}{\ensuremath\vdash}% \DeclareUnicodeCharacter{22A3}{\ensuremath\dashv}% \DeclareUnicodeCharacter{22A4}{\ensuremath\ptextop}% \DeclareUnicodeCharacter{22A5}{\ensuremath\bot}% \DeclareUnicodeCharacter{22A8}{\ensuremath\models}% \DeclareUnicodeCharacter{22C0}{\ensuremath\bigwedge}% \DeclareUnicodeCharacter{22C1}{\ensuremath\bigvee}% \DeclareUnicodeCharacter{22C2}{\ensuremath\bigcap}% \DeclareUnicodeCharacter{22C3}{\ensuremath\bigcup}% \DeclareUnicodeCharacter{22C4}{\ensuremath\diamond}% \DeclareUnicodeCharacter{22C5}{\ensuremath\cdot}% \DeclareUnicodeCharacter{22C6}{\ensuremath\star}% \DeclareUnicodeCharacter{22C8}{\ensuremath\bowtie}% \DeclareUnicodeCharacter{2308}{\ensuremath\lceil}% \DeclareUnicodeCharacter{2309}{\ensuremath\rceil}% \DeclareUnicodeCharacter{230A}{\ensuremath\lfloor}% \DeclareUnicodeCharacter{230B}{\ensuremath\rfloor}% \DeclareUnicodeCharacter{2322}{\ensuremath\frown}% \DeclareUnicodeCharacter{2323}{\ensuremath\smile}% % \DeclareUnicodeCharacter{25B3}{\ensuremath\triangle}% \DeclareUnicodeCharacter{25B7}{\ensuremath\triangleright}% \DeclareUnicodeCharacter{25BD}{\ensuremath\bigtriangledown}% \DeclareUnicodeCharacter{25C1}{\ensuremath\triangleleft}% \DeclareUnicodeCharacter{25C7}{\ensuremath\diamond}% \DeclareUnicodeCharacter{2660}{\ensuremath\spadesuit}% \DeclareUnicodeCharacter{2661}{\ensuremath\heartsuit}% \DeclareUnicodeCharacter{2662}{\ensuremath\diamondsuit}% \DeclareUnicodeCharacter{2663}{\ensuremath\clubsuit}% \DeclareUnicodeCharacter{266D}{\ensuremath\flat}% \DeclareUnicodeCharacter{266E}{\ensuremath\natural}% \DeclareUnicodeCharacter{266F}{\ensuremath\sharp}% \DeclareUnicodeCharacter{26AA}{\ensuremath\bigcirc}% \DeclareUnicodeCharacter{27B9}{\ensuremath\rangle}% \DeclareUnicodeCharacter{27C2}{\ensuremath\perp}% \DeclareUnicodeCharacter{27E8}{\ensuremath\langle}% \DeclareUnicodeCharacter{27F5}{\ensuremath\longleftarrow}% \DeclareUnicodeCharacter{27F6}{\ensuremath\longrightarrow}% \DeclareUnicodeCharacter{27F7}{\ensuremath\longleftrightarrow}% \DeclareUnicodeCharacter{27FC}{\ensuremath\longmapsto}% \DeclareUnicodeCharacter{29F5}{\ensuremath\setminus}% \DeclareUnicodeCharacter{2A00}{\ensuremath\bigodot}% \DeclareUnicodeCharacter{2A01}{\ensuremath\bigoplus}% \DeclareUnicodeCharacter{2A02}{\ensuremath\bigotimes}% \DeclareUnicodeCharacter{2A04}{\ensuremath\biguplus}% \DeclareUnicodeCharacter{2A06}{\ensuremath\bigsqcup}% \DeclareUnicodeCharacter{2A3F}{\ensuremath\amalg}% \DeclareUnicodeCharacter{2AAF}{\ensuremath\preceq}% \DeclareUnicodeCharacter{2AB0}{\ensuremath\succeq}% % \global\mathchardef\checkmark="1370% actually the square root sign \DeclareUnicodeCharacter{2713}{\ensuremath\checkmark}% }% end of \unicodechardefs % UTF-8 byte sequence (pdfTeX) definitions (replacing and @U command) % It makes the setting that replace UTF-8 byte sequence. \def\utfeightchardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterUTFviii \unicodechardefs } % Whether the active definitions of non-ASCII characters expand to % non-active tokens with the same character code. This is used to % write characters literally, instead of using active definitions for % printing the correct glyphs. \newif\ifpassthroughchars \passthroughcharsfalse % For native Unicode handling (XeTeX and LuaTeX), % provide a definition macro to replace/pass-through a Unicode character % \def\DeclareUnicodeCharacterNative#1#2{% \ifnum"#1>"7F % only make non-ASCII chars active \catcode"#1=\active \def\dodeclareunicodecharacternative##1##2##3{% \begingroup \uccode`\~="##2\relax \uppercase{\gdef~}{% \ifpassthroughchars ##1% \else ##3% \fi } \endgroup } \begingroup \uccode`\.="#1\relax \uppercase{\def\UTFNativeTmp{.}}% \expandafter\dodeclareunicodecharacternative\UTFNativeTmp{#1}{#2}% \endgroup \fi } % Native Unicode handling (XeTeX and LuaTeX) character replacing definition. % It activates the setting that replaces Unicode characters. \def\nativeunicodechardefs{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNative \unicodechardefs } % For native Unicode handling (XeTeX and LuaTeX), % make the character token expand % to the sequences given in \unicodechardefs for printing. \def\DeclareUnicodeCharacterNativeAtU#1#2{% \def\UTFAtUTmp{#2} \expandafter\globallet\csname uni:#1\endcsname \UTFAtUTmp } % @U command definitions for native Unicode handling (XeTeX and LuaTeX). \def\nativeunicodechardefsatu{% \let\DeclareUnicodeCharacter\DeclareUnicodeCharacterNativeAtU \unicodechardefs } % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Define all Unicode characters we know about \iftxinativeunicodecapable \nativeunicodechardefsatu \else \utfeightchardefs \fi \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \txipageheight = \vsize % \hsize = #2\relax \txipagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \else \ifx\XeTeXrevision\thisisundefined \special{papersize=#8,#7}% \else \pdfpageheight #7\relax \pdfpagewidth #8\relax % XeTeX does not have \pdfhorigin and \pdfvorigin. \fi \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{-11.4mm}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} \def\bsixpaper{{\globaldefs = 1 \afourpaper \internalpagesizes{140mm}{100mm}% {-6.35mm}{-12.7mm}% {\bindingoffset}{14pt}% {176mm}{125mm}% \let\SETdispenvsize=\smallword \lispnarrowing = 0.2in \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by 2.5in % default 1in margin above heading line % and 1.5in to include heading, footing and % bottom margin % \dimen2 = \hsize \advance\dimen2 by 2in % default to 1 inch margin on each side % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper % Default value of \hfuzz, for suppressing warnings about overfull hboxes. \hfuzz = 1pt \message{microtype,} % protrusion, from Thanh's protcode.tex. \def\mtsetprotcode#1{% \rpcode#1`\!=200 \rpcode#1`\,=700 \rpcode#1`\-=700 \rpcode#1`\.=700 \rpcode#1`\;=500 \rpcode#1`\:=500 \rpcode#1`\?=200 \rpcode#1`\'=700 \rpcode#1 34=500 % '' \rpcode#1 123=300 % -- \rpcode#1 124=200 % --- \rpcode#1`\)=50 \rpcode#1`\A=50 \rpcode#1`\F=50 \rpcode#1`\K=50 \rpcode#1`\L=50 \rpcode#1`\T=50 \rpcode#1`\V=50 \rpcode#1`\W=50 \rpcode#1`\X=50 \rpcode#1`\Y=50 \rpcode#1`\k=50 \rpcode#1`\r=50 \rpcode#1`\t=50 \rpcode#1`\v=50 \rpcode#1`\w=50 \rpcode#1`\x=50 \rpcode#1`\y=50 % \lpcode#1`\`=700 \lpcode#1 92=500 % `` \lpcode#1`\(=50 \lpcode#1`\A=50 \lpcode#1`\J=50 \lpcode#1`\T=50 \lpcode#1`\V=50 \lpcode#1`\W=50 \lpcode#1`\X=50 \lpcode#1`\Y=50 \lpcode#1`\v=50 \lpcode#1`\w=50 \lpcode#1`\x=50 \lpcode#1`\y=0 % \mtadjustprotcode#1\relax } \newcount\countC \def\mtadjustprotcode#1{% \countC=0 \loop \ifcase\lpcode#1\countC\else \mtadjustcp\lpcode#1\countC \fi \ifcase\rpcode#1\countC\else \mtadjustcp\rpcode#1\countC \fi \advance\countC 1 \ifnum\countC < 256 \repeat } \newcount\countB \def\mtadjustcp#1#2#3{% \setbox\boxA=\hbox{% \ifx#2\font\else#2\fi \char#3}% \countB=\wd\boxA \multiply\countB #1#2#3\relax \divide\countB \fontdimen6 #2\relax #1#2#3=\countB\relax } \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \mtsetprotcode\textrm \def\mtfontexpand#1{\pdffontexpand#1 20 20 1 autoexpand\relax} \else % TeX \def\mtfontexpand#1{} \fi \else % LuaTeX \mtsetprotcode\textrm \def\mtfontexpand#1{\expandglyphsinfont#1 20 20 1\relax} \fi \else % XeTeX \mtsetprotcode\textrm \def\mtfontexpand#1{} \fi \newif\ifmicrotype \def\microtypeON{% \microtypetrue % \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \pdfadjustspacing=2 \pdfprotrudechars=2 \fi \else % LuaTeX \adjustspacing=2 \protrudechars=2 \fi \else % XeTeX \XeTeXprotrudechars=2 \fi % \mtfontexpand\textrm \mtfontexpand\textsl \mtfontexpand\textbf } \def\microtypeOFF{% \microtypefalse % \ifx\XeTeXrevision\thisisundefined \ifx\luatexversion\thisisundefined \ifpdf % pdfTeX \pdfadjustspacing=0 \pdfprotrudechars=0 \fi \else % LuaTeX \adjustspacing=0 \protrudechars=0 \fi \else % XeTeX \XeTeXprotrudechars=0 \fi } \microtypeOFF \parseargdef\microtype{% \def\txiarg{#1}% \ifx\txiarg\onword \microtypeON \else\ifx\txiarg\offword \microtypeOFF \else \errhelp = \EMsimple \errmessage{Unknown @microtype option `\txiarg', must be on|off}% \fi\fi } \message{and turning on texinfo input format.} % Make UTF-8 the default encoding. \documentencodingzzz{UTF-8} \def^^L{\par} % remove \outer, so ^L can appear in an @comment \catcode`\^^K = 10 % treat vertical tab as whitespace % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % Set catcodes for Texinfo file % Active characters for printing the wanted glyph. % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. % \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hatchar=`\^ \catcode`\^=\active \def\activehat{{\tt \hatchar}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \let\realunder=_ \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix \catcode`\-=\active \let-=\normaldash % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \setregularquotes \let\b = \strong \let\i = \smartitalic % in principle, all other definitions in \tex have to be undone too. } % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \passthroughcharstrue \let-=\normaldash \let"=\normaldoublequote \let$=\normaldollar %$ font-lock fix \let+=\normalplus \let<=\normalless \let>=\normalgreater \let^=\normalcaret \let_=\normalunderscore \let|=\normalverticalbar \let~=\normaltilde \otherbackslash \setregularquotes \unsepspaces } % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \loadconf turn them back on. \catcode`+=\other \catcode`\_=\other % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ % Print a typewriter backslash. For math mode, we can't simply use % \backslashcurfont: the story here is that in math mode, the \char % of \backslashcurfont ends up printing the roman \ from the math symbol % font (because \char in math mode uses the \mathcode, and plain.tex % sets \mathcode`\\="026E). Hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. \def\ttbackslash{{\tt \ifmmode \mathchar29020 \else \backslashcurfont \fi}} \let\backslashchar = \ttbackslash % \backslashchar{} is for user documents. % These are made active for url-breaking, so need % active definitions as the normal characters. \def\normaldot{.} \def\normalquest{?} \def\normalslash{/} % \newlinesloadsconf - call \loadconf as soon as possible in the % file, e.g. at the first newline. % {\catcode`\^=7 \catcode`\^^M=13 \gdef\newlineloadsconf{% \catcode`\^^M=13 % \newlineloadsconfzz% } \gdef\newlineloadsconfzz#1^^M{% \def\c{\loadconf\c}% % Definition for the first newline read in the file \def ^^M{\loadconf}% % In case the first line has a whole-line or environment command on it \let\originalparsearg\parsearg% \def\parsearg{\loadconf\originalparsearg}% % % \startenvironment is in the expansion of commands defined with \envdef \let\originalstartenvironment\startenvironment% \def\startenvironment{\loadconf\startenvironment}% }} % Emergency active definition of newline, in case an active newline token % appears by mistake. {\catcode`\^=7 \catcode13=13% \gdef\enableemergencynewline{% \gdef^^M{% \par% %\par% }}} % \loadconf gets called at the beginning of every Texinfo file. % If texinfo.cnf is present on the system, read it. Useful for site-wide % @afourpaper, etc. Not opening texinfo.cnf directly in texinfo.tex % makes it possible to make a format file for Texinfo. % \gdef\loadconf{% \relax % Terminate the filename if running as "tex '&texinfo' FILE.texi". % % Turn off the definitions that trigger \loadconf \everyjobreset \catcode13=5 % regular end of line \enableemergencynewline \let\c=\comment \let\parsearg\originalparsearg \let\startenvironment\originalstartenvironment % % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. \catcode`+=\active \catcode`\_=\active % \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 } % Redefine some control sequences to be controlled by the \ifdummies % and \ifindexnofonts switches. Do this at the end so that the control % sequences are all defined. \definedummies \catcode`\@=0 % \realbackslash is an actual character `\' with catcode other. {\catcode`\\=\other @gdef@realbackslash{\}} % In Texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. @let\ = @ttbackslash % If in a .fmt file, print the version number. % \eatinput stops the `\input texinfo' from showing up. % After that, `\' should revert to printing a backslash. % Turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. % @everyjob{@message{[Texinfo version @texinfoversion]}% @global@let\ = @eatinput @catcode`+=@active @catcode`@_=@active} {@catcode`@^=7 @catcode`@^^M=13% @gdef@eatinput input texinfo#1^^M{@loadconf}} @def@everyjobreset{@ifx\@eatinput @let\ = @ttbackslash @fi} % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. % {@catcode`- = @active @gdef@normalturnoffactive{% @turnoffactive @let\=@ttbackslash } } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @c Local variables: @c eval: (add-hook 'before-save-hook 'time-stamp nil t) @c time-stamp-pattern: "texinfoversion{%Y-%02m-%02d.%02H}" @c page-delimiter: "^\\\\message" @c End: @newlineloadsconf gperf-3.2.1/doc/gperf_4.html0000664000000000000000000001061614776761154011260 Perfect Hash Function Generator - 3 Static search structures and GNU gperf Go to the first, previous, next, last section, table of contents.


3 Static search structures and GNU gperf

A static search structure is an Abstract Data Type with certain fundamental operations, e.g., initialize, insert, and retrieve. Conceptually, all insertions occur before any retrievals. In practice, gperf generates a static array containing search set keywords and any associated attributes specified by the user. Thus, there is essentially no execution-time cost for the insertions. It is a useful data structure for representing static search sets. Static search sets occur frequently in software system applications. Typical static search sets include compiler reserved words, assembler instruction opcodes, and built-in shell interpreter commands. Search set members, called keywords, are inserted into the structure only once, usually during program initialization, and are not generally modified at run-time.

Numerous static search structure implementations exist, e.g., arrays, linked lists, binary search trees, digital search tries, and hash tables. Different approaches offer trade-offs between space utilization and search time efficiency. For example, an n element sorted array is space efficient, though the average-case time complexity for retrieval operations using binary search is proportional to log n. Conversely, hash table implementations often locate a table entry in constant time, but typically impose additional memory overhead and exhibit poor worst case performance.

Minimal perfect hash functions provide an optimal solution for a particular class of static search sets. A minimal perfect hash function is defined by two properties:

For most applications it is far easier to generate perfect hash functions than minimal perfect hash functions. Moreover, non-minimal perfect hash functions frequently execute faster than minimal ones in practice. This phenomena occurs since searching a sparse keyword table increases the probability of locating a “null” entry, thereby reducing string comparisons. gperf's default behavior generates near-minimal perfect hash functions for keyword sets. However, gperf provides many options that permit user control over the degree of minimality and perfection.

Static search sets often exhibit relative stability over time. For example, Ada's 63 reserved words have remained constant for nearly a decade. It is therefore frequently worthwhile to expend concerted effort building an optimal search structure once, if it subsequently receives heavy use multiple times. gperf removes the drudgery associated with constructing time- and space-efficient search structures by hand. It has proven a useful and practical tool for serious programming projects. Output from gperf is currently used in several production and research compilers, including GNU C, GNU C++, GNU Java, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet part of the official GNU distribution. Each compiler utilizes gperf to automatically generate static search structures that efficiently identify their respective reserved keywords.


Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf.info0000664000000000000000000031026314776761153011024 This is gperf.info, produced by makeinfo version 7.1 from gperf.texi. INFO-DIR-SECTION Programming Tools START-INFO-DIR-ENTRY * Gperf: (gperf). Perfect Hash Function Generator. END-INFO-DIR-ENTRY This file documents the features of the GNU Perfect Hash Function Generator 3.2. Copyright © 1989-2024 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled "GNU General Public License" is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled "GNU General Public License" and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English.  File: gperf.info, Node: Top, Next: Copying, Up: (dir) Introduction ************ This manual documents the GNU ‘gperf’ perfect hash function generator utility, focusing on its features and how to use them, and how to report bugs. * Menu: * Copying:: GNU General Public License says how you can copy and share ‘gperf’. * Contributors:: People who have contributed to ‘gperf’. * Motivation:: The purpose of ‘gperf’. * Search Structures:: Static search structures and GNU ‘gperf’ * Description:: High-level discussion of how GPERF functions. * Options:: A description of options to the program. * Bugs:: Known bugs and limitations with GPERF. * Projects:: Things still left to do. * Bibliography:: Material Referenced in this Report. * Concept Index:: -- The Detailed Node Listing -- High-Level Description of GNU ‘gperf’ * Input Format:: Input Format to ‘gperf’ * Output Format:: Output Format for Generated C Code with ‘gperf’ * Binary Strings:: Use of NUL bytes * Controlling Identifiers:: Avoiding collisions of identifiers * Output Copyright:: The Copyright of the Output. Input Format to ‘gperf’ * Declarations:: Declarations. * Keywords:: Format for Keyword Entries. * Functions:: Including Additional C Functions. * Controls for GNU indent:: Where to place directives for GNU ‘indent’. Declarations * User-supplied Struct:: Specifying keywords with attributes. * Gperf Declarations:: Embedding command line options in the input. * C Code Inclusion:: Including C declarations and definitions. Invoking ‘gperf’ * Input Details:: Options that affect Interpretation of the Input File * Output Language:: Specifying the Language for the Output Code * Output Details:: Fine tuning Details in the Output Code * Algorithmic Details:: Changing the Algorithms employed by ‘gperf’ * Verbosity:: Informative Output  File: gperf.info, Node: Copying, Next: Contributors, Prev: Top, Up: Top GNU GENERAL PUBLIC LICENSE ************************** Version 3, 29 June 2007 Copyright © 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble ======== The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS ==================== 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a. The work must carry prominent notices stating that you modified it, and giving a relevant date. b. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d. Limiting the use for publicity purposes of names of licensors or authors of the material; or e. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS =========================== How to Apply These Terms to Your New Programs ============================================= If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. Copyright (C) YEAR NAME OF AUTHOR This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: PROGRAM Copyright (C) YEAR NAME OF AUTHOR This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’. This is free software, and you are welcome to redistribute it under certain conditions; type ‘show c’ for details. The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .  File: gperf.info, Node: Contributors, Next: Motivation, Prev: Copying, Up: Top Contributors to GNU ‘gperf’ Utility *********************************** • The GNU ‘gperf’ perfect hash function generator utility was written in GNU C++ by Douglas C. Schmidt. The general idea for the perfect hash function generator was inspired by Keith Bostic's algorithm written in C, and distributed to net.sources around 1984. The current program is a heavily modified, enhanced, and extended implementation of Keith's basic idea, created at the University of California, Irvine. Bugs, patches, and suggestions should be reported to ‘’. • Special thanks is extended to Michael Tiemann and Doug Lea, for providing a useful compiler, and for giving me a forum to exhibit my creation. In addition, Adam de Boor and Nels Olson provided many tips and insights that greatly helped improve the quality and functionality of ‘gperf’. • Bruno Haible enhanced and optimized the search algorithm. He also rewrote the input routines and the output routines for better reliability, and added a testsuite.  File: gperf.info, Node: Motivation, Next: Search Structures, Prev: Contributors, Up: Top 1 Introduction ************** ‘gperf’ is a perfect hash function generator written in C++. It transforms an N element user-specified keyword set W into a perfect hash function F. F uniquely maps keywords in W onto the range 0..K, where K >= N-1. If K = N-1 then F is a _minimal_ perfect hash function. ‘gperf’ generates a 0..K element static lookup table and a pair of C functions. These functions determine whether a given character string S occurs in W, using at most one probe into the lookup table. ‘gperf’ currently generates the reserved keyword recognizer for lexical analyzers in several production and research compilers and language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal, GNU Modula 3, and GNU indent. Complete C++ source code for ‘gperf’ is available from ‘https://ftp.gnu.org/pub/gnu/gperf/’. A paper describing ‘gperf’'s design and implementation in greater detail is available in the Second USENIX C++ Conference proceedings or from ‘http://www.cs.wustl.edu/~schmidt/resume.html’.  File: gperf.info, Node: Search Structures, Next: Description, Prev: Motivation, Up: Top 2 Static search structures and GNU ‘gperf’ ****************************************** A “static search structure” is an Abstract Data Type with certain fundamental operations, e.g., _initialize_, _insert_, and _retrieve_. Conceptually, all insertions occur before any retrievals. In practice, ‘gperf’ generates a _static_ array containing search set keywords and any associated attributes specified by the user. Thus, there is essentially no execution-time cost for the insertions. It is a useful data structure for representing _static search sets_. Static search sets occur frequently in software system applications. Typical static search sets include compiler reserved words, assembler instruction opcodes, and built-in shell interpreter commands. Search set members, called “keywords”, are inserted into the structure only once, usually during program initialization, and are not generally modified at run-time. Numerous static search structure implementations exist, e.g., arrays, linked lists, binary search trees, digital search tries, and hash tables. Different approaches offer trade-offs between space utilization and search time efficiency. For example, an N element sorted array is space efficient, though the average-case time complexity for retrieval operations using binary search is proportional to log N. Conversely, hash table implementations often locate a table entry in constant time, but typically impose additional memory overhead and exhibit poor worst case performance. _Minimal perfect hash functions_ provide an optimal solution for a particular class of static search sets. A minimal perfect hash function is defined by two properties: • It allows keyword recognition in a static search set using at most _one_ probe into the hash table. This represents the "perfect" property. • The actual memory allocated to store the keywords is precisely large enough for the keyword set, and _no larger_. This is the "minimal" property. For most applications it is far easier to generate _perfect_ hash functions than _minimal perfect_ hash functions. Moreover, non-minimal perfect hash functions frequently execute faster than minimal ones in practice. This phenomena occurs since searching a sparse keyword table increases the probability of locating a "null" entry, thereby reducing string comparisons. ‘gperf’'s default behavior generates _near-minimal_ perfect hash functions for keyword sets. However, ‘gperf’ provides many options that permit user control over the degree of minimality and perfection. Static search sets often exhibit relative stability over time. For example, Ada's 63 reserved words have remained constant for nearly a decade. It is therefore frequently worthwhile to expend concerted effort building an optimal search structure _once_, if it subsequently receives heavy use multiple times. ‘gperf’ removes the drudgery associated with constructing time- and space-efficient search structures by hand. It has proven a useful and practical tool for serious programming projects. Output from ‘gperf’ is currently used in several production and research compilers, including GNU C, GNU C++, GNU Java, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet part of the official GNU distribution. Each compiler utilizes ‘gperf’ to automatically generate static search structures that efficiently identify their respective reserved keywords.  File: gperf.info, Node: Description, Next: Options, Prev: Search Structures, Up: Top 3 High-Level Description of GNU ‘gperf’ *************************************** * Menu: * Input Format:: Input Format to ‘gperf’ * Output Format:: Output Format for Generated C Code with ‘gperf’ * Binary Strings:: Use of NUL bytes * Controlling Identifiers:: Avoiding collisions of identifiers * Output Copyright:: The Copyright of the Output. The perfect hash function generator ‘gperf’ reads a set of "keywords" from an input file (or from the standard input by default). It attempts to derive a perfect hashing function that recognizes a member of the “static keyword set” with at most a single probe into the lookup table. If ‘gperf’ succeeds in generating such a function it produces a pair of C source code routines that perform hashing and table lookup recognition. All generated C code is directed to the standard output. Command-line options described below allow you to modify the input and output format to ‘gperf’. By default, ‘gperf’ attempts to produce time-efficient code, with less emphasis on efficient space utilization. However, several options exist that permit trading-off execution time for storage space and vice versa. In particular, expanding the generated table size produces a sparse search structure, generally yielding faster searches. Conversely, you can direct ‘gperf’ to utilize a C ‘switch’ statement scheme that minimizes data space storage size. Furthermore, using a C ‘switch’ may actually speed up the keyword retrieval time somewhat. Actual results depend on your C compiler, of course. In general, ‘gperf’ assigns values to the bytes it is using for hashing until some set of values gives each keyword a unique value. A helpful heuristic is that the larger the hash value range, the easier it is for ‘gperf’ to find and generate a perfect hash function. Experimentation is the key to getting the most from ‘gperf’.  File: gperf.info, Node: Input Format, Next: Output Format, Up: Description 3.1 Input Format to ‘gperf’ =========================== You can control the input file format by varying certain command-line arguments, in particular the ‘-t’ option. The input's appearance is similar to GNU utilities ‘flex’ and ‘bison’ (or UNIX utilities ‘lex’ and ‘yacc’). Here's an outline of the general format: declarations %% keywords %% functions _Unlike_ ‘flex’ or ‘bison’, the declarations section and the functions section are optional. The following sections describe the input format for each section. * Menu: * Declarations:: Declarations. * Keywords:: Format for Keyword Entries. * Functions:: Including Additional C Functions. * Controls for GNU indent:: Where to place directives for GNU ‘indent’. It is possible to omit the declaration section entirely, if the ‘-t’ option is not given. In this case the input file begins directly with the first keyword line, e.g.: january february march april ...  File: gperf.info, Node: Declarations, Next: Keywords, Up: Input Format 3.1.1 Declarations ------------------ The keyword input file optionally contains a section for including arbitrary C declarations and definitions, ‘gperf’ declarations that act like command-line options, as well as for providing a user-supplied ‘struct’. * Menu: * User-supplied Struct:: Specifying keywords with attributes. * Gperf Declarations:: Embedding command line options in the input. * C Code Inclusion:: Including C declarations and definitions.  File: gperf.info, Node: User-supplied Struct, Next: Gperf Declarations, Up: Declarations 3.1.1.1 User-supplied ‘struct’ .............................. If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) _is_ enabled, you _must_ provide a C ‘struct’ as the last component in the declaration section from the input file. The first field in this struct must be of type ‘char *’ or ‘const char *’ if the ‘-P’ option is not given, or of type ‘int’ if the option ‘-P’ (or, equivalently, the ‘%pic’ declaration) is enabled. This first field must be called ‘name’, although it is possible to modify its name with the ‘-K’ option (or, equivalently, the ‘%define slot-name’ declaration) described below. Here is a simple example, using months of the year and their attributes as input: struct month { char *name; int number; int days; int leap_days; }; %% january, 1, 31, 31 february, 2, 28, 29 march, 3, 31, 31 april, 4, 30, 30 may, 5, 31, 31 june, 6, 30, 30 july, 7, 31, 31 august, 8, 31, 31 september, 9, 30, 30 october, 10, 31, 31 november, 11, 30, 30 december, 12, 31, 31 Separating the ‘struct’ declaration from the list of keywords and other fields are a pair of consecutive percent signs, ‘%%’, appearing left justified in the first column, as in the UNIX utility ‘lex’. If the ‘struct’ has already been declared in an include file, it can be mentioned in an abbreviated form, like this: struct month; %% january, 1, 31, 31 ...  File: gperf.info, Node: Gperf Declarations, Next: C Code Inclusion, Prev: User-supplied Struct, Up: Declarations 3.1.1.2 Gperf Declarations .......................... The declaration section can contain ‘gperf’ declarations. They influence the way ‘gperf’ works, like command line options do. In fact, every such declaration is equivalent to a command line option. There are three forms of declarations: 1. Declarations without argument, like ‘%compare-lengths’. 2. Declarations with an argument, like ‘%switch=COUNT’. 3. Declarations of names of entities in the output file, like ‘%define lookup-function-name NAME’. When a declaration is given both in the input file and as a command line option, the command-line option's value prevails. The following ‘gperf’ declarations are available. ‘%delimiters=DELIMITER-LIST’ Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. ‘%struct-type’ Allows you to include a ‘struct’ type declaration for generated code; see above for an example. ‘%ignore-case’ Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. ‘%language=LANGUAGE-NAME’ Instructs ‘gperf’ to generate code in the language specified by the option's argument. Languages handled are currently: ‘KR-C’ Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’. ‘C’ Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you ‘#define const’ to empty for compilers which don't know about this keyword. ‘ANSI-C’ ANSI C. This language is understood by ANSI C (C89, ISO C90) compilers, ISO C99 compilers, and C++ compilers. ‘C++’ C++. This language is understood by C++ compilers. The default is ANSI-C. ‘%define slot-name NAME’ This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied ‘struct’. ‘%define initializer-suffix INITIALIZERS’ This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following SLOT-NAME in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following SLOT-NAME. ‘%define hash-function-name NAME’ Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file. ‘%define lookup-function-name NAME’ Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application. ‘%define class-name NAME’ This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is ‘Perfect_Hash’. ‘%7bit’ This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions ‘isalnum’ and ‘isgraph’ do _not_ guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.) ‘%compare-lengths’ Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (*note Binary Strings::). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via ‘strcmp’. However, using ‘%compare-lengths’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table. ‘%compare-strncmp’ Generates C code that uses the ‘strncmp’ function to perform string comparisons. The default action is to use ‘strcmp’. ‘%readonly-tables’ Makes the contents of all generated lookup tables constant, i.e., "readonly". Many compilers can generate more efficient code for this by putting the tables in readonly memory. ‘%enum’ Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark ‘’. ‘%includes’ Include the necessary system include file, ‘’, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code. ‘%global-table’ Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). ‘%pic’ Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the ‘%struct-type’ declaration (or, equivalently, the option ‘-t’) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + O’, where O is the offset. The string pool name can be changed through the ‘%define string-pool-name’ declaration. ‘%define string-pool-name NAME’ Allows you to specify the name of the generated string pool created by the declaration ‘%pic’ (or, equivalently, the option ‘-P’). The default name is ‘stringpool’. This declaration permits the use of two hash tables in the same file, with ‘%pic’ and even when the ‘%global-table’ declaration (or, equivalently, the option ‘-G’) is given. ‘%null-strings’ Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as the declaration ‘%pic’), at the expense of one more test-and-branch instruction at run time. ‘%define constants-prefix PREFIX’ Allows you to specify a prefix for the constants ‘TOTAL_KEYWORDS’, ‘MIN_WORD_LENGTH’, ‘MAX_WORD_LENGTH’, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘%define word-array-name NAME’ Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘%define length-table-name NAME’ Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘%switch=COUNT’ Causes the generated C code to use a ‘switch’ statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many ‘switch’ statements are generated. A value of 1 generates 1 ‘switch’ containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each ‘switch’, etc. This is useful since many C compilers cannot correctly generate code for large ‘switch’ statements. This option was inspired in part by Keith Bostic's original C program. ‘%omit-struct-type’ Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere.  File: gperf.info, Node: C Code Inclusion, Prev: Gperf Declarations, Up: Declarations 3.1.1.3 C Code Inclusion ........................ Using a syntax similar to GNU utilities ‘flex’ and ‘bison’, it is possible to directly include C source text and comments verbatim into the generated output file. This is accomplished by enclosing the region inside left-justified surrounding ‘%{’, ‘%}’ pairs. Here is an input fragment based on the previous example that illustrates this feature: %{ #include /* This section of code is inserted directly into the output. */ int return_month_days (struct month *months, int is_leap_year); %} struct month { char *name; int number; int days; int leap_days; }; %% january, 1, 31, 31 february, 2, 28, 29 march, 3, 31, 31 ...  File: gperf.info, Node: Keywords, Next: Functions, Prev: Declarations, Up: Input Format 3.1.2 Format for Keyword Entries -------------------------------- The second input file format section contains lines of keywords and any associated attributes you might supply. A line beginning with ‘#’ in the first column is considered a comment. Everything following the ‘#’ is ignored, up to and including the following newline. A line beginning with ‘%’ in the first column is an option declaration and must not occur within the keywords section. The first field of each non-comment line is always the keyword itself. It can be given in two ways: as a simple name, i.e., without surrounding string quotation marks, or as a string enclosed in double-quotes, in C syntax, possibly with backslash escapes like ‘\"’ or ‘\234’ or ‘\xa8’. In either case, it must start right at the beginning of the line, without leading whitespace. In this context, a "field" is considered to extend up to, but not include, the first blank, comma, or newline. Here is a simple example taken from a partial list of C reserved words: # These are a few C reserved words, see the c.gperf file # for a complete list of ANSI C reserved words. unsigned sizeof switch signed if default for while return Note that unlike ‘flex’ or ‘bison’ the first ‘%%’ marker may be elided if the declaration section is empty. Additional fields may optionally follow the leading keyword. Fields should be separated by commas, and terminate at the end of line. What these fields mean is entirely up to you; they are used to initialize the elements of the user-defined ‘struct’ provided by you in the declaration section. If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) is _not_ enabled these fields are simply ignored. All previous examples except the last one contain keyword attributes.  File: gperf.info, Node: Functions, Next: Controls for GNU indent, Prev: Keywords, Up: Input Format 3.1.3 Including Additional C Functions -------------------------------------- The optional third section also corresponds closely with conventions found in ‘flex’ and ‘bison’. All text in this section, starting at the final ‘%%’ and extending to the end of the input file, is included verbatim into the generated output file. Naturally, it is your responsibility to ensure that the code contained in this section is valid C.  File: gperf.info, Node: Controls for GNU indent, Prev: Functions, Up: Input Format 3.1.4 Where to place directives for GNU ‘indent’. ------------------------------------------------- If you want to invoke GNU ‘indent’ on a ‘gperf’ input file, you will see that GNU ‘indent’ doesn't understand the ‘%%’, ‘%{’ and ‘%}’ directives that control ‘gperf’'s interpretation of the input file. Therefore you have to insert some directives for GNU ‘indent’. More precisely, assuming the most general input file structure declarations part 1 %{ verbatim code %} declarations part 2 %% keywords %% functions you would insert ‘*INDENT-OFF*’ and ‘*INDENT-ON*’ comments as follows: /* *INDENT-OFF* */ declarations part 1 %{ /* *INDENT-ON* */ verbatim code /* *INDENT-OFF* */ %} declarations part 2 %% keywords %% /* *INDENT-ON* */ functions  File: gperf.info, Node: Output Format, Next: Binary Strings, Prev: Input Format, Up: Description 3.2 Output Format for Generated C Code with ‘gperf’ =================================================== Several options control how the generated C code appears on the standard output. Two C functions are generated. They are called ‘hash’ and ‘in_word_set’, although you may modify their names with a command-line option. Both functions require two arguments, a string, ‘char *’ STR, and a length parameter, ‘int’ LEN. Their default function prototypes are as follows: -- Function: unsigned int hash (const char * STR, size_t LEN) By default, the generated ‘hash’ function returns an integer value created by adding LEN to several user-specified STR byte positions indexed into an “associated values” table stored in a local static array. The associated values table is constructed internally by ‘gperf’ and later output as a static local C array called ‘hash_table’. The relevant selected positions (i.e. indices into STR) are specified via the ‘-k’ option when running ‘gperf’, as detailed in the _Options_ section below (*note Options::). -- Function: in_word_set (const char * STR, size_t LEN) If STR is in the keyword set, returns a pointer to that keyword. More exactly, if the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) was given, it returns a pointer to the matching keyword's structure. Otherwise it returns ‘NULL’. If the option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is not used, STR must be a NUL terminated string of exactly length LEN. If ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, STR must simply be an array of LEN bytes and does not need to be NUL terminated. The code generated for these two functions is affected by the following options: ‘-t’ ‘--struct-type’ Make use of the user-defined ‘struct’. ‘-S TOTAL-SWITCH-STATEMENTS’ ‘--switch=TOTAL-SWITCH-STATEMENTS’ Generate 1 or more C ‘switch’ statement rather than use a large, (and potentially sparse) static array. Although the exact time and space savings of this approach vary according to your C compiler's degree of optimization, this method often results in smaller and faster code. If the ‘-t’ and ‘-S’ options (or, equivalently, the ‘%struct-type’ and ‘%switch’ declarations) are omitted, the default action is to generate a ‘char *’ array containing the keywords, together with additional empty strings used for padding the array. By experimenting with the various input and output options, and timing the resulting C code, you can determine the best option choices for different keyword set characteristics.  File: gperf.info, Node: Binary Strings, Next: Controlling Identifiers, Prev: Output Format, Up: Description 3.3 Use of NUL bytes ==================== By default, the code generated by ‘gperf’ operates on zero terminated strings, the usual representation of strings in C. This means that the keywords in the input file must not contain NUL bytes, and the STR argument passed to ‘hash’ or ‘in_word_set’ must be NUL terminated and have exactly length LEN. If option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, then the STR argument does not need to be NUL terminated. The code generated by ‘gperf’ will only access the first LEN, not LEN+1, bytes starting at STR. However, the keywords in the input file still must not contain NUL bytes. If option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration) is used, then the hash table performs binary comparison. The keywords in the input file may contain NUL bytes, written in string syntax as ‘\000’ or ‘\x00’, and the code generated by ‘gperf’ will treat NUL like any other byte. Also, in this case the ‘-c’ option (or, equivalently, the ‘%compare-strncmp’ declaration) is ignored.  File: gperf.info, Node: Controlling Identifiers, Next: Output Copyright, Prev: Binary Strings, Up: Description 3.4 Controlling Identifiers =========================== The identifiers of the functions, tables, and constants defined by the code generated by ‘gperf’ can be controlled through ‘gperf’ declarations or the equivalent command-line options. This is useful for three purposes: • Esthetics of the generated code. For this purpose, just use the available declarations or options at will. • Controlling the exported identifiers of a library. Assume you include code generated by ‘gperf’ in a library, and to avoid collisions with other libraries, you want to ensure that all exported identifiers of this library start with a certain prefix. By default, the only exported identifier is the lookup function. You can therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration). When you use the option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration), the only exported entity is a class. You control its name through the option ‘-Z’ (or, equivalently, the ‘%define class-name’ declaration). • Allowing multiple ‘gperf’ generated codes in a single compilation unit. Assume you invoke ‘gperf’ multiple times, with different input files, and want the generated code to be included from the same source file. In this case, you have to customize not only the exported identifiers, but also the names of functions with ‘static’ scope, types, and constants. By default, you will have to deal with the lookup function, the hash function, and the constants. You should therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration), the option ‘-H’ (or, equivalently, the ‘%define hash-function-name’ declaration), and the option ‘--constants-prefix’ (or, equivalently, the ‘%define constants-prefix’ declaration). If you use the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration), you will also have to deal with the word array, the length table if present, and the string pool if present. This means: You should use the option ‘-W’ (or, equivalently, the ‘%define word-array-name’ declaration). If you use the option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration), you should use the option ‘--length-table-name’ (or, equivalently, the ‘%define length-table-name’ declaration). If you use the option ‘-P’ (or, equivalently, the ‘%pic’ declaration), you should use the option ‘-Q’ (or, equivalently, the ‘%define string-pool-name’ declaration).  File: gperf.info, Node: Output Copyright, Prev: Controlling Identifiers, Up: Description 3.5 The Copyright of the Output =============================== ‘gperf’ is under GPL, but that does not cause the output produced by ‘gperf’ to be under GPL. The reason is that the output contains only small pieces of text that come directly from ‘gperf’'s source code - only about 7 lines long, too small for being significant -, and therefore the output is not a "work based on ‘gperf’" (in the sense of the GPL version 3). On the other hand, the output produced by ‘gperf’ contains essentially all of the input file. Therefore the output is a "derivative work" of the input (in the sense of U.S. copyright law); and its copyright status depends on the copyright of the input. For most software licenses, the result is that the output is under the same license, with the same copyright holder, as the input that was passed to ‘gperf’.  File: gperf.info, Node: Options, Next: Bugs, Prev: Description, Up: Top 4 Invoking ‘gperf’ ****************** There are _many_ options to ‘gperf’. They were added to make the program more convenient for use with real applications. "On-line" help is readily available via the ‘--help’ option. Here is the complete list of options. * Menu: * Output File:: Specifying the Location of the Output File * Input Details:: Options that affect Interpretation of the Input File * Output Language:: Specifying the Language for the Output Code * Output Details:: Fine tuning Details in the Output Code * Algorithmic Details:: Changing the Algorithms employed by ‘gperf’ * Verbosity:: Informative Output  File: gperf.info, Node: Output File, Next: Input Details, Up: Options 4.1 Specifying the Location of the Output File ============================================== ‘--output-file=FILE’ Allows you to specify the name of the file to which the output is written to. The results are written to standard output if no output file is specified or if it is ‘-’.  File: gperf.info, Node: Input Details, Next: Output Language, Prev: Output File, Up: Options 4.2 Options that affect Interpretation of the Input File ======================================================== These options are also available as declarations in the input file (*note Gperf Declarations::). ‘-e KEYWORD-DELIMITER-LIST’ ‘--delimiters=KEYWORD-DELIMITER-LIST’ Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. One useful trick is to use -e'TAB', where TAB is the literal tab character. ‘-t’ ‘--struct-type’ Allows you to include a ‘struct’ type declaration for generated code. Any text before a pair of consecutive ‘%%’ is considered part of the type declaration. Keywords and additional fields may follow this, one group of fields per line. A set of examples for generating perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2, Modula 3 and JavaScript reserved words are distributed with this release. ‘--ignore-case’ Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. This option is therefore not suitable if a properly internationalized or locale aware case mapping should be used. (For example, in a Turkish locale, the upper case equivalent of the lowercase ASCII letter ‘i’ is the non-ASCII character ‘capital i with dot above’.) For this case, it is better to apply an uppercase or lowercase conversion on the string before passing it to the ‘gperf’ generated function.  File: gperf.info, Node: Output Language, Next: Output Details, Prev: Input Details, Up: Options 4.3 Options to specify the Language for the Output Code ======================================================= These options are also available as declarations in the input file (*note Gperf Declarations::). ‘-L GENERATED-LANGUAGE-NAME’ ‘--language=GENERATED-LANGUAGE-NAME’ Instructs ‘gperf’ to generate code in the language specified by the option's argument. Languages handled are currently: ‘KR-C’ Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’. ‘C’ Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you ‘#define const’ to empty for compilers which don't know about this keyword. ‘ANSI-C’ ANSI C. This language is understood by ANSI C compilers and C++ compilers. ‘C++’ C++. This language is understood by C++ compilers. The default is ANSI-C. ‘-a’ This option is supported for compatibility with previous releases of ‘gperf’. It does not do anything. ‘-g’ This option is supported for compatibility with previous releases of ‘gperf’. It does not do anything.  File: gperf.info, Node: Output Details, Next: Algorithmic Details, Prev: Output Language, Up: Options 4.4 Options for fine tuning Details in the Output Code ====================================================== Most of these options are also available as declarations in the input file (*note Gperf Declarations::). ‘-K SLOT-NAME’ ‘--slot-name=SLOT-NAME’ This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied ‘struct’. ‘-F INITIALIZERS’ ‘--initializer-suffix=INITIALIZERS’ This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following SLOT-NAME in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following SLOT-NAME. ‘-H HASH-FUNCTION-NAME’ ‘--hash-function-name=HASH-FUNCTION-NAME’ Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file. ‘-N LOOKUP-FUNCTION-NAME’ ‘--lookup-function-name=LOOKUP-FUNCTION-NAME’ Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application. ‘-Z CLASS-NAME’ ‘--class-name=CLASS-NAME’ This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is ‘Perfect_Hash’. ‘-7’ ‘--seven-bit’ This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions ‘isalnum’ and ‘isgraph’ do _not_ guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.) This was the default in versions of ‘gperf’ earlier than 2.7; now the default is to support 8-bit and multibyte characters. ‘-l’ ‘--compare-lengths’ Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (*note Binary Strings::). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via ‘strcmp’. However, using ‘-l’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table. ‘-c’ ‘--compare-strncmp’ Generates C code that uses the ‘strncmp’ function to perform string comparisons. The default action is to use ‘strcmp’. ‘-C’ ‘--readonly-tables’ Makes the contents of all generated lookup tables constant, i.e., "readonly". Many compilers can generate more efficient code for this by putting the tables in readonly memory. ‘-E’ ‘--enum’ Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark ‘’. ‘-I’ ‘--includes’ Include the necessary system include file, ‘’, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code. ‘-G’ ‘--global-table’ Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). ‘-P’ ‘--pic’ Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + O’, where O is the offset. The string pool name can be changed through the option ‘--string-pool-name’. ‘-Q STRING-POOL-NAME’ ‘--string-pool-name=STRING-POOL-NAME’ Allows you to specify the name of the generated string pool created by option ‘-P’. The default name is ‘stringpool’. This option permits the use of two hash tables in the same file, with ‘-P’ and even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘--null-strings’ Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as option ‘-P’), at the expense of one more test-and-branch instruction at run time. ‘--constants-prefix=PREFIX’ Allows you to specify a prefix for the constants ‘TOTAL_KEYWORDS’, ‘MIN_WORD_LENGTH’, ‘MAX_WORD_LENGTH’, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘-W HASH-TABLE-ARRAY-NAME’ ‘--word-array-name=HASH-TABLE-ARRAY-NAME’ Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘--length-table-name=LENGTH-TABLE-ARRAY-NAME’ Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given. ‘-S TOTAL-SWITCH-STATEMENTS’ ‘--switch=TOTAL-SWITCH-STATEMENTS’ Causes the generated C code to use a ‘switch’ statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many ‘switch’ statements are generated. A value of 1 generates 1 ‘switch’ containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each ‘switch’, etc. This is useful since many C compilers cannot correctly generate code for large ‘switch’ statements. This option was inspired in part by Keith Bostic's original C program. ‘-T’ ‘--omit-struct-type’ Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. ‘-p’ This option is supported for compatibility with previous releases of ‘gperf’. It does not do anything.  File: gperf.info, Node: Algorithmic Details, Next: Verbosity, Prev: Output Details, Up: Options 4.5 Options for changing the Algorithms employed by ‘gperf’ =========================================================== ‘-k SELECTED-BYTE-POSITIONS’ ‘--key-positions=SELECTED-BYTE-POSITIONS’ Allows selection of the byte positions used in the keywords' hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, e.g., ‘-k 9,4,13,14’; ranges may be used, e.g., ‘-k 2-7’; and positions may occur in any order. Furthermore, the wildcard '*' causes the generated hash function to consider *all* byte positions in each keyword, whereas '$' instructs the hash function to use the "final byte" of a keyword (this is the only way to use a byte position greater than 255, incidentally). For instance, the option ‘-k 1,2,4,6-10,'$'’ generates a hash function that considers positions 1,2,4,6,7,8,9,10, plus the last byte in each keyword (which may be at a different position for each keyword, obviously). Keywords with length less than the indicated byte positions work properly, since selected byte positions exceeding the keyword length are simply not referenced in the hash function. This option is not normally needed since version 2.8 of ‘gperf’; the default byte positions are computed depending on the keyword set, through a search that minimizes the number of byte positions. ‘-D’ ‘--duplicates’ Handle keywords whose selected byte sets hash to duplicate values. Duplicate hash values can occur if a set of keywords has the same names, but possesses different attributes, or if the selected byte positions are not well chosen. With the -D option ‘gperf’ treats all these keywords as part of an equivalence class and generates a perfect hash function with multiple comparisons for duplicate keywords. It is up to you to completely disambiguate the keywords by modifying the generated C code. However, ‘gperf’ helps you out by organizing the output. Using this option usually means that the generated hash function is no longer perfect. On the other hand, it permits ‘gperf’ to work on keyword sets that it otherwise could not handle. ‘-m ITERATIONS’ ‘--multiple-iterations=ITERATIONS’ Perform multiple choices of the ‘-i’ and ‘-j’ values, and choose the best results. This increases the running time by a factor of ITERATIONS but does a good job minimizing the generated table size. ‘-i INITIAL-VALUE’ ‘--initial-asso=INITIAL-VALUE’ Provides an initial VALUE for the associate values array. Default is 0. Increasing the initial value helps inflate the final table size, possibly leading to more time efficient keyword lookups. Note that this option is not particularly useful when ‘-S’ (or, equivalently, ‘%switch’) is used. Also, ‘-i’ is overridden when the ‘-r’ option is used. ‘-j JUMP-VALUE’ ‘--jump=JUMP-VALUE’ Affects the "jump value", i.e., how far to advance the associated byte value upon collisions. JUMP-VALUE is rounded up to an odd number, the default is 5. If the JUMP-VALUE is 0 ‘gperf’ jumps by random amounts. ‘-n’ ‘--no-strlen’ Instructs the generator not to include the length of a keyword when computing its hash value. This may save a few assembly instructions in the generated lookup table. ‘-r’ ‘--random’ Utilizes randomness to initialize the associated values table. This frequently generates solutions faster than using deterministic initialization (which starts all associated values at 0). Furthermore, using the randomization option generally increases the size of the table. ‘-s SIZE-MULTIPLE’ ‘--size-multiple=SIZE-MULTIPLE’ Affects the size of the generated hash table. The numeric argument for this option indicates "how many times larger or smaller" the maximum associated value range should be, in relationship to the number of keywords. It can be written as an integer, a floating-point number or a fraction. For example, a value of 3 means "allow the maximum associated value to be about 3 times larger than the number of input keywords". Conversely, a value of 1/3 means "allow the maximum associated value to be about 3 times smaller than the number of input keywords". Values smaller than 1 are useful for limiting the overall size of the generated hash table, though the option ‘-m’ is better at this purpose. If 'generate switch' option ‘-S’ (or, equivalently, ‘%switch’) is _not_ enabled, the maximum associated value influences the static array table size, and a larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. The default value is 1, thus the default maximum associated value is about the same size as the number of keywords. (For efficiency, the maximum associated value is always rounded up to a power of 2.) The actual table size may vary somewhat, since this technique is essentially a heuristic.  File: gperf.info, Node: Verbosity, Prev: Algorithmic Details, Up: Options 4.6 Informative Output ====================== ‘-h’ ‘--help’ Prints a short summary on the meaning of each program option. Aborts further program execution. ‘-v’ ‘--version’ Prints out the current version number. ‘-d’ ‘--debug’ Enables the debugging option. This produces verbose diagnostics to "standard error" when ‘gperf’ is executing. It is useful both for maintaining the program and for determining whether a given set of options is actually speeding up the search for a solution. Some useful information is dumped at the end of the program when the ‘-d’ option is enabled.  File: gperf.info, Node: Bugs, Next: Projects, Prev: Options, Up: Top 5 Known Bugs and Limitations with ‘gperf’ ***************************************** The following are some limitations with the current release of ‘gperf’: • The ‘gperf’ utility is tuned to execute quickly, and works quickly for small to medium size data sets (around 1000 keywords). It is extremely useful for maintaining perfect hash functions for compiler keyword sets. Since version 3.0, ‘gperf’ also works efficiently on much larger keyword sets (over 15,000 keywords). • The size of the generate static keyword array can get _extremely_ large if the input keyword file is large or if the keywords are quite similar. This tends to slow down the compilation of the generated C code, and _greatly_ inflates the object code size. If this situation occurs, consider using the ‘-S’ option to reduce data size, potentially increasing the keyword recognition time by a negligible amount. Since many C compilers cannot correctly generate code for large switch statements it is important to qualify the -S option with an appropriate numerical argument that controls the number of switch statements generated. • The maximum number of selected byte positions has an arbitrary limit of 255. This restriction should be removed, and if anyone considers this a problem write me and let me know so I can remove the constraint.  File: gperf.info, Node: Projects, Next: Bibliography, Prev: Bugs, Up: Top 6 Things Still Left to Do ************************* It should be "relatively" easy to replace the current perfect hash function algorithm with a more exhaustive approach; the perfect hash module is essential independent from other program modules. Additional worthwhile improvements include: • Another useful extension involves modifying the program to generate "minimal" perfect hash functions (under certain circumstances, the current version can be rather extravagant in the generated table size). This is mostly of theoretical interest, since a sparse table often produces faster lookups, and use of the ‘-S’ ‘switch’ option can minimize the data size, at the expense of slightly longer lookups (note that the gcc compiler generally produces good code for ‘switch’ statements, reducing the need for more complex schemes). • In addition to improving the algorithm, it would also be useful to generate an Ada package as the code output, in addition to the current C and C++ routines.  File: gperf.info, Node: Bibliography, Next: Concept Index, Prev: Projects, Up: Top 7 Bibliography ************** [1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect Hashing Functions Information Sciences 39(1986), 187-195. [2] Cichelli, Richard J. Author's Response to "On Cichelli's Minimal Perfect Hash Functions Method" Communications of the ACM, 23, 12(December 1980), 729. [3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple Communications of the ACM, 23, 1(January 1980), 17-19. [4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal Perfect Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27. [5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58. [6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal Perfect Hashing Functions Communications of the ACM, 24, 12(December 1981), 829-833. [7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect Hash Functions Method Communications of the ACM, 23, 12(December 1980), 728-729. [8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532 [9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator Second USENIX C++ Conference Proceedings, April 1990. [10] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator C++ Report, SIGS 10 10 (November/December 1998). [11] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions for Reserved Word Lists SIGPLAN Notices, 20, 12(September 1985), 47-53. [12] Sprugnoli, R. Perfect Hashing Functions: A Single Probe Retrieving Method for Static Sets Communications of the ACM, 20 11(November 1977), 841-850. [13] Stallman, Richard M. Using and Porting GNU CC Free Software Foundation, 1988. [14] Stroustrup, Bjarne The C++ Programming Language. Addison-Wesley, 1986. [15] Tiemann, Michael D. User's Guide to GNU C++ Free Software Foundation, 1989.  File: gperf.info, Node: Concept Index, Prev: Bibliography, Up: Top Concept Index ************* [index] * Menu: * %{: C Code Inclusion. (line 6) * %}: C Code Inclusion. (line 6) * %%: User-supplied Struct. (line 33) * %7bit: Gperf Declarations. (line 95) * %compare-lengths: Gperf Declarations. (line 103) * %compare-strncmp: Gperf Declarations. (line 115) * %define class-name: Gperf Declarations. (line 89) * %define constants-prefix: Gperf Declarations. (line 167) * %define hash-function-name: Gperf Declarations. (line 79) * %define initializer-suffix: Gperf Declarations. (line 71) * %define length-table-name: Gperf Declarations. (line 181) * %define lookup-function-name: Gperf Declarations. (line 84) * %define slot-name: Gperf Declarations. (line 63) * %define string-pool-name: Gperf Declarations. (line 152) * %define word-array-name: Gperf Declarations. (line 175) * %delimiters: Gperf Declarations. (line 24) * %enum: Gperf Declarations. (line 124) * %global-table: Gperf Declarations. (line 135) * %ignore-case: Gperf Declarations. (line 34) * %includes: Gperf Declarations. (line 130) * %language: Gperf Declarations. (line 39) * %null-strings: Gperf Declarations. (line 160) * %omit-struct-type: Gperf Declarations. (line 199) * %pic: Gperf Declarations. (line 140) * %readonly-tables: Gperf Declarations. (line 119) * %struct-type: Gperf Declarations. (line 30) * %switch: Gperf Declarations. (line 188) * Array name: Output Details. (line 137) * Array name <1>: Output Details. (line 143) * Bugs: Contributors. (line 6) * Class name: Output Details. (line 41) * Constants definition: Output Details. (line 82) * Constants prefix: Output Details. (line 128) * Copyright: Output Copyright. (line 6) * Declaration section: Input Format. (line 6) * Delimiters: Input Details. (line 11) * Duplicates: Algorithmic Details. (line 32) * Format: Input Format. (line 6) * Functions section: Input Format. (line 6) * hash: Output Format. (line 13) * hash table: Output Format. (line 6) * in_word_set: Output Format. (line 23) * Initializers: Output Details. (line 20) * Jump value: Algorithmic Details. (line 63) * Keywords section: Input Format. (line 6) * Minimal perfect hash functions: Search Structures. (line 30) * NUL: Binary Strings. (line 6) * Slot name: Output Details. (line 11) * Static search structure: Search Structures. (line 6) * switch: Output Format. (line 44) * switch <1>: Output Details. (line 151)  Tag Table: Node: Top1233 Node: Copying3504 Node: Contributors41042 Node: Motivation42253 Node: Search Structures43414 Node: Description47012 Node: Input Format49092 Node: Declarations50257 Node: User-supplied Struct50832 Node: Gperf Declarations52494 Node: C Code Inclusion62063 Node: Keywords62922 Node: Functions64918 Node: Controls for GNU indent65468 Node: Output Format66463 Node: Binary Strings69362 Node: Controlling Identifiers70597 Node: Output Copyright73490 Node: Options74457 Node: Output File75262 Node: Input Details75646 Node: Output Language77525 Node: Output Details79002 Node: Algorithmic Details87037 Node: Verbosity92429 Node: Bugs93172 Node: Projects94693 Node: Bibliography95841 Node: Concept Index97856  End Tag Table  Local Variables: coding: utf-8 End: gperf-3.2.1/doc/gperf_3.html0000664000000000000000000000377014776761154011262 Perfect Hash Function Generator - 2 Introduction Go to the first, previous, next, last section, table of contents.


2 Introduction

gperf is a perfect hash function generator written in C++. It transforms an n element user-specified keyword set W into a perfect hash function F. F uniquely maps keywords in W onto the range 0..k, where k >= n-1. If k = n-1 then F is a minimal perfect hash function. gperf generates a 0..k element static lookup table and a pair of C functions. These functions determine whether a given character string s occurs in W, using at most one probe into the lookup table.

gperf currently generates the reserved keyword recognizer for lexical analyzers in several production and research compilers and language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal, GNU Modula 3, and GNU indent. Complete C++ source code for gperf is available from https://ftp.gnu.org/pub/gnu/gperf/. A paper describing gperf's design and implementation in greater detail is available in the Second USENIX C++ Conference proceedings or from http://www.cs.wustl.edu/~schmidt/resume.html.


Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/configure0000775000000000000000000026420414774103074010744 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='' PACKAGE_TARNAME='' PACKAGE_VERSION='' PACKAGE_STRING='' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="gperf.texi" ac_subst_vars='LTLIBOBJS LIBOBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE PACKAGE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/../build-aux" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu PACKAGE=gperf { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gperf-3.2.1/doc/gperf.ps0000664000000000000000000206634414776761171010525 %!PS-Adobe-2.0 %%Creator: dvips(k) 2023.1 (TeX Live 2023) Copyright 2023 Radical Eye Software %%Title: gperf.dvi %%CreationDate: Sun Apr 13 16:12:41 2025 %%Pages: 37 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: CMBX12 CMTT12 CMR10 CMSY10 CMTT10 CMSLTT10 CMTT9 CMSL10 %%+ CMTI10 CMSS10 CMB10 CMR9 CMMI9 CMMI12 CMMI10 %%DocumentPaperSizes: Letter %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -D600 -o gperf.ps ./gperf.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2025.04.13:1812 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat {BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B /M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ 0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMMI10 %!PS-AdobeFont-1.0: CMMI10 003.002 %%Title: CMMI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup /UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI10 def /FontBBox {-32 -250 1048 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C 7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B 0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE 88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F 347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA 29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C 9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B 75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E 4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC 74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D 543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F 7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE 1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C 4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F 55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD 38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D 22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB 44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A 42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E 0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE 66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E 1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B 897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F 87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE 178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA 7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD 6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC 98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B 9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE 44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA 633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D 6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD 375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B 9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF 8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F 00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF 7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D 4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA 92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E 86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC 35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD 155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F 226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B 8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B 919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D 2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22 CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744 3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8 404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84 262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953 084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341 E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI12 %!PS-AdobeFont-1.0: CMMI12 003.002 %%Title: CMMI12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup /UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI12 def /FontBBox {-31 -250 1026 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE 882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A 7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC 182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A 1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D 3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F 68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D 10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA 7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A 46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD 754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF 88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A 7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D 7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D 2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D 639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F 90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E 1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E 8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D 203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F 2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D 244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B 724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF 01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA 287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C 192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE 084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF 92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A 9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E 38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F 3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D 806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C 172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A 31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A 2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD 207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A 1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B 97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF 94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED 66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C 224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D 5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FA96583CF3F1519CD CF08806F40ACD7BB5C960F21E9DA7FB3C72CBA0801ADE83DF738A4EC94F2977D 2B95A166BA4AE28CAD1E37FBBF49D342CDB4DF615E2C5F3076313AC517C350DE 710F5D52DE31DF69864D29DABF14234DF13904BA4333B0D714EEA55CDD79DE45 FF5D64259C877191547076B1C7684CD252C0337BD9DF66CDC5DBAA4F3102F2E8 FE48385C55727B80D11F3BE0B7568AA9356FB2B180A6B1392D620DED02F0B736 5F4399FB9D32DFBC8ED942AD311C82250DA8BFE98D65 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI9 %!PS-AdobeFont-1.0: CMMI9 003.002 %%Title: CMMI9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup /UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI9 def /FontBBox {-29 -250 1075 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI9.) readonly def /FullName (CMMI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB 7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67 7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8 BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365 82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74 91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E 540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112 7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8 93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756 972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A 6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149 796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94 DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80 E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D 0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83 F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9 ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97 72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9 4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1 692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109 4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1 CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59 41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A 9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20 5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292 2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5 8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B 33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28 03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1 749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE 3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F 64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F 90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05 DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8 F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D 4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF 49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4 E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117 58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE 88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3 B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE 7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776 01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46 19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41 194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55 53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3 F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4 412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6 C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108 4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831 E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81 AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF 00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91 C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8 2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980 F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50 0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023 28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4 E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42 20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B 7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE 5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4 74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4 90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55 3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621 98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066 54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7 93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC 19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A 9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84 A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB 107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA 5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08 22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95 B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D 403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789 D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6 20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6 943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33 AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70 B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA 2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84 2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F 8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642 87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4 2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842 D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC 512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4 4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559 6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9 9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A 0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040 9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1 430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8 56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE 718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3 F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE 95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE 6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7 6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867 630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111 6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA 89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475 3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2 90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47 38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34 EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9 B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376 9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9 1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF 1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C 62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5 84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2 AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618 D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196 BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6 4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6 531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24 FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2 43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256 D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6 0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4 E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53 DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358 99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD 8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1 8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73 A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5 362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3 C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79 E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2 07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F 0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6 190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4 5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50 005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8 6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9 F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087 F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE 2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752 F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0 0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD 73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2 62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79 5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98 F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F 6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7 DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109 EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222 E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107 536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18 36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3 F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0 431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900 5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C 074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78 E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77 2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600 324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR9 %!PS-AdobeFont-1.0: CMR9 003.002 %%Title: CMR9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup /UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR9 def /FontBBox {-39 -250 1036 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR9.) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 12 /fi put dup 39 /quoteright put dup 44 /comma put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 70 /F put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 83 /S put dup 85 /U put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340 15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4 B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029 85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955 F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D 2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5 B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7 78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7 E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3 41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277 B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072 55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA 700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9 8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4 FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4 3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15 B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2 AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013 461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85 CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C 4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F 291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223 D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181 C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115 D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9 9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405 2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380 A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB 2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E 2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6 AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577 9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67 0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D 9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B 42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0 C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35 623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6 B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4 E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97 CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D 07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7 53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350 EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9 52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88 F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3 81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6 B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A 31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293 846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733 46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E 44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08 A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5 1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4 D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344 6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E 24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E 75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51 C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0 5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034 099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281 7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE 53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84 7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F 7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933 CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD 866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826 ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64 FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B 40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643 D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8 2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787 39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2 1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4 F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9 253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B 14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085 6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B 9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339 FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F 289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3 A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5 5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46 5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652 152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE 67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3 BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59 3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88 713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF 2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5 D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143 6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9 F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95 26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970 350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700 70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5 F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95 F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8 9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2 DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473 F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D 064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF 1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325 A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF 01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C 40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C 72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645 24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1 EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775 D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311 83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483 5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448 1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69 AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC 4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3 7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9 65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063 B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6 FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6 4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490 8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6 1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3 10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4 8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0 7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F 852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C 3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997 648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD 855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE 1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C 1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0 B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7 D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99 24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C 552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733 6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0 800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8 6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659 E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4 5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2 00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4 82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7 6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3 128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D 744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507 84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86 5D22CE175F9E50FA2301ADBCFAAB2B89B8917307766C4D228198F718DBA1B2E4 BBB59748043483206B2C87D3A6A95880E47C868308F390EBB8A2F7925D14E782 6F40A532E02978A494F370A732947755C8CC6FDD9F7092778849B9887820EF5F 67871FAD992447F76CF16F85D0A04140B7A29CE125D733D197D58FD4186D335B DBD88456EC1A698AFBEE2418D715F0A4CFADC0E9D88F83AF8B6CA0AF8A510C59 E63798EB43CAD793E287BF3CAD7E8CAE1E9BB5F52171A78D4463B995CF637964 5825941C8B7E1B1408619FCA686B5792D720974ED9249ECE9FE8FCC567D66582 903C00361D3E72B158C3AD92707D0FA8D6ACE4E66AFD3916267CE37DAD4D1373 D818CE3F6952EAB0E1C9F7328D9A2C4EC787117853336A14E258D14211E2100A 636C28C34EF07F0E59BABCD25E48D57FC896D57DFFCF445C5F8015B05CBC1E06 3BBCEB0ED5F63317937B6E3D5ED2A177CAAC366A85E33B1D60649626A1EAC051 CAF959945AC0B31D21C930C20A2C4EB6B7D7B2A078E2140075279B962D6D0A0E E253AC638B9D0E758FCD57D9685EE33312C1A0A5CF1762F57C0C7236EF014B54 7DB1B8C3CE37A262AD69A31F5A1E4C2BCF7C4310523B30CCA645B8DA15419438 C2D541657DC32658E7F14C18F6048F3DFBBE365542B2411B2B72CF35172C6264 534AC64D3DEB13D303AF97D51A071EC797D611DC571CD4A5E4B308CFF0F78CF2 8A475ED04DCCE94CB6A54B5D27A8719A0B094E42D3B5FA1D967E96405E690437 6F9F1F155B7FA0873D8AF3D270825B0EF286176436B0B820176667500E587821 56ED77373459669911695E73E63BF4D510C4E7701979B23EF39FD99184A9408D 6E873189ADCE5797F05566E50997C9560E91F4B1C26ADE2DD3774D903024A13E DE0D58B50937201B2A09636706EE7EFA0BDED029524BDFCB30ECD32498B83D55 314EE0611726295A18202E78D9E7ABAA72B5E3CDB4AE7B8AEDDC17BD74DAB42B 89CD68290A966725CAEB2EFF9DA3263218CFB4EC471D3DFE4F9CEA08972754E1 D090E3889B56BFA096258B227B72C9CB2090624BB22393DDB90DF1D8545651EA 77691DFE4F53020E43047E47CCE033A0CB68F94B32AFC86BD139C0BDC8902200 3EC9E121319F4F865B7E3D72C20A2D1DCAFB9D44C614960653342BC5107092C8 EA35ECDD47A9271B9180E4E1A33128D8DF3399FC2A6724BCA2C10687988E16E5 DA34F0FF3FF5749CF06ECACA33F0D24FF6B79AC87440E2ED9816997A440C27F6 B3D4D33DE29E93C8C6AD6EA818107DD53FAC3C30B11F1580B25B85DA07E8B63C 78F552D411F741CB7D0DE2D273BEC502AAD3044ED708F1DCC78BD17C233F745D FC76B89F1C77E0F1D1BEC6F12524803A28E9035A73430A8474B95CA40F19FE0E EEAC8168A06BA336F89880CE4C5B00DF6EE0AF3E750ACAE7AAB59E1C9B83D7A1 41529B10FDAF94DF7FAAEF10A2A8A57A14B7F254F1A5D5100644C6D765B526A0 590D323A24996CFD04169C828CA18352CD22E77594549E5810ED4B2A01419CC2 450027931A723A236AEDFF5676ACDE6EE71DC9EEC113030FF5763FDEEB728CC5 B35F8096AD15238571A7DC68709DE1BE7AED9DAC1D16EA1F04077B139B5DBABB EE4AAE675BF9E906EE15EB4170E907E80E0BF4D5776474B672629FF215665967 7CBF68EEB3D747FBB628E9A425F2541111E93CD22984992215CA770150E93C1A CF83D795D880A41CF6312A5BBB3AD62139733DB76FB9CBEE259C492D0E9D6337 8B10A725C84E8055D15945B2E0163BEB75D212AAF2C9C5948BB49DD58A237889 2F1B4E476DBCFBA24AD136561BF06769F837D46937574C9A5B66DAAD0A64C189 FA465ABDAA278D2EFCE2BAE7E9D8816291EE7725531822DD7D23CB86E990AD1C 8A03B13D0AA844D07A61DC6C28CD6C568CF0997DFB2891C651227F79F997A08A 087D28C9FFD63C199A9C9A62946555795B192ACBFB111C5EFE83AB5351D0DA64 D360A49D0F9A5A63AA4C1F36A87F4647B0EA757156CB668812DAE47688F52328 AB1828F7208ACEF1C8D3D84C9892764ABEFD1414D05C55737E4CEBB1FC5C529A F8688CBB543A948B0FDE48EECD9D12094F14B222FE161C45AB766A1BE1093952 5FA2CD9E35988FD5B8584B58D2A96BA16BEEA8B04D46246C61C6E595467D8ED3 8CC649032124B4374636F2E5DB8CF80B65E415BDD44B433185E34F6CA67DEBA0 8DE74C2E4B5BF13F35352A1C0546077797E0273A98DCAD6E449A25B9F6BB17AC 338DB65FC4C76F9CD4E0D016BFAC206B28B3764B5E9ACB960DDD6625D499BFAB 2C401C23EDFB82C88901DD8BAD1DE6AF42F220B87F22913A4347A45223591945 2F9171FF52D9B99EFF6E2AC36895C02494F1D1E7FD184E7E876D3A2E7E499D9D 4104762FD19BA0526D38D5C91487CABA9CCE19ACBEE693C2479D8DC2C8799892 52BEFF0EA125B352FBF456C125CE8D33479809A74186AE3EB3F4594C15D29988 BB5CFB8F53714AE3BD5CCD6CDA4CA386BDE59EACF1EDB1894F57EFE3B4786E16 813E5940B3F440C5DC708211024E90CD228722C646FFEC71439DD8BD3FE070DC 880F5FBE14AB8415D6F47C31F07C9EFCDC396430848439F0573A2E85555F307E 397C57195B410F742849973F3F0510323FCBBAD44AEEECE6E2717A6B3D01A2FA D82AB91E29788EB7A1E04DCB10B8B0DC8A616244A23D145935F93AFF86FE7AA9 7144A531044925D2846AA0F669EDB5C728FE6BC0B380F547D5610B9050C00901 888198A2750B244B2E33A30BA10B2A07580654BAE945BEADC6A1571163E52C6E F0196ADDD32107263E8BE045865C79EDFAB83304781105416D0B1F9F23E251F6 58DC267BFCD569BFA62A5DACB7D6E914D2F71442B9EB72C54E8B7A012D0F9CE8 3E3524E2147F4F65994789713C2A23FD8FBE201200FC326DB598AC7BB505F061 4132984272CDE6322EA90C0F12B59C69CA3A8925FC1309AF70276D214AF7AADC 5C9B0CE2ADD378C019F29849A507BB36BC3182B0BE98ECB6C5BB717610AC2A3E 1DB3C6F6AE2F5DB222BAFBD5F48ECF6381F6886C391B2491C85049C0018FCCEC 08E7137230304AD8C649FFE8237D4C90B76219991D210BE37F93C4FDC81CA594 ACE14C3AA579C41E9EE7CF9F5E727C6D607604D045A79BD82CE6FF23544771B6 F089EBC3958FD27D38FCCD34A872CD28BED794766BB90CE10670A1040AA20DDA 8F14BBEEACBE2D711F4EB2AD8ECA691F382DFAD722D64DA658B72F398FDCFC05 EE7CBFEB50A2BDA1F2D6463539F4119882C450A7AF794D4639D1C1ADD38F5C6B 393B37454BED10CB742B92A2A0E8EA451D2A60C6AEBB037AF53D3FE2DFE2A4B5 B2E7D008F082F58754DF418E8884AA4DF92A25CFABD8A7C1323CAC694FD845EB 8A57654F628CDC2A8FB41FBFBDC4B9CD59E725641969FB89AE62314C9E95A676 6B129251DB6008C3C247BB42A23B258D8885DBF5083FFD641E14594DAAE2FA2F 72CD4958DEF0214750F806F3F40B02C2F09566E664D94C24A87831441514CC96 18E8E791D922266390172FC62EF9D7B16D22470B9F23CF003F1CC4E00C264EBC 180775AD1E1082B51DC6FEEEBBA0D9696E0F9BF6B7386835032995036080C9C9 3BCC12B391CCD3D1E080C1DCCFACCC429B7F3ED8FEF4A6E6AA2AD96C9B654DA2 7A4DD811C1BE1C78AD6DFEAD0D91E05F38E68466B09BD162D1B8827D422DEF54 0855CA36DAC73B2E0C8FC9A63492D7671A775A40188EA3221DF36AC30E093B93 7D2A1C319709BED17214D6A9200A72750F939F0BA64BFD28369E0B23A5A9F054 8B9C9E78AB5A87ECFBA34864CC26617BD32E1533A37D3DCE58F6A00A222B403B B2A72CC96FC6CACDC3C007C9D8FC83BCB2499BE9C8B2A60E54E92AAC58403E99 5BE7B63C81F9014053D77A03BD3163B93F14435834A6AEE090CC17F951DA91D8 90252AEBBCEEF7EE45069D7EF5BA2E6960A0E94B3DBBEC87237843E5753C5E81 4DC9105B2249057A21E4E83B0474FFAEAD76B6C608A9BE49BE8A8B0DDC08B490 4D982F5DF76D91944C4CF6754B381FE79B4C2FFEC6D53DF682BD7DF37C04031C F7EC2A4AB0DACF135E9B8D53BF8C0DBA9304226320E0A51ECEBB1EA95D453167 9A6F7C44E18A3EB1FC0D2D894860EAD726092B5AAF268FE621C4575B695266D3 F30F26C244F070CFA991EB0AF30D40E7C8841AD242FD5FE125687D54E8365A94 0074D110D11AD0F3749286036FAC6D7A90370C573084257B4D39F3FE0E97E778 6795D65D112C5A1ACBCF542B39AC0711C9601AC3C586763763D6B04F51BFFADE A9B9CA5D3853BBD4B5B82DF23B9DA1324D9D3FDF0A162F2C6A5B57130F5EE40D C3F99B72E2DA0E6C922333BFCBCD1624540A9E1741C06B322B3EA6D32ECF7FDE 143FCC61ED4F9C0A7F38D2F79DFBB9AC4A25C2A9E73FC6E4822049BF0E76C91E F01D72047F204579B9F6538DBBABE1E2FBE34676D0D4B5BE87575E2453047023 C2ED5757BBF99DED4260327C46458721C371A6CAFE5EB75C879AE2404C65C585 352351438EE9A0369D9D425DEC1A19958CBD921949AB9B848A1AC7F57C7CDC2C CA8E76782334080EB10D95217E1C733B4F34B13D99E42A652159E372DF28BB7D B8ACE2FAF02F9EC8259248DF2DEC362A207AC9958C871189F90F92F535891ABA ECE0C5BF4FE6AAB3C3ED5F129822F8936EDB6E34570F8DFB05A4CC6D2D8A22E0 30752FC63E65DD947AD71CAD4076DD5FB801EB61C32DC5FEC584C18FB104B975 CD26C2A6214FA4AFAC55075074DD7896BC92D30D57949D3234D19B99359591A1 F97B11CAE04C49E21AEC0F48BC7E27925D094EF342274BE8BF5ED1A7ED8287CE 82FE0A8AB4ED4565B530C2683C32A61BD7EE32D5366069FC68CDE6EF86648637 D9362BC73CF628390FE6E360B7166DE96868009112FEF99D87D4BB7339BDB006 91FF29E8EDE4EE96F7932B15FA39CAC1B617858F923C99CE7A87D42665D0FD5F FE9EC17CF65934B6382500E12B5C35FC29AE031ABFB34B1FFF88AE0EDF80660A 26092BCBE4F1426A1E8AE7F80170BD31A8F12DF2559B023B8453BF2F94ACDBD9 0AC685CD5DEEB27B3BAF5595AB7C2686C6D83CF422235C6A2E45EE48E711E776 D8638CB2E6BE585A23B0AED5740858A67432D9EE0B47435337C550CA93A28E43 D769816E791A1AF6626711181A3CFB306741B038B6DEC3B02A231ABCC93362AF 10691ED995ADE83237741AFB803C367E1A2455A00CDE3F4FBDA821CA325E07AA 90301A28BA4D14E75C4751F0855DAC5B72DBE69A3881473989EE11642AA15CE0 08F27DFF5865EE5FD1343360344F939DBCCB37787E9FFA00EE6EC07A0F31989F 65D7A5D07E55B73237BE8D23B4FB3A9D1E94B06ADF11C5866769AF2032544232 F7A6D4397ED1F4ABE43ED7445494F819939BDA9F90ED92E4D97F6B0BB1F85A06 9B244D635FCB88DE7A4BDDBFE96FFDEAE8C6FCF37DA514DA07C4127B99C37C2E DD16EF1FC4C0C01D6DBEECB2EE4B5ECAA53F48418F6E89B2B07234FC1CA12E7D D1F7FAA999110BC974CF69683C7BA05D8E0CD804CABA29994D931313DD218B2B A9D1134E117D38C827BBA5B0C370D039EC516D39B694ED9D0223DB11AD13DB2B 14FF9D0918354153F4BD8E81076E5D0F46E7046353649CC8657E0223747D5D93 F5E8D33E465C8787210464A6F4D21E28953E0DDCF091E2DF695BB1B86886CD79 D7430A63F188D825FA6C62E9C20661F95A65DE7F2AEF38C9482CD7EC24FB1E2F 653921BBC6BEEDE01EDDA7D5748CD1D5837918E4FE0D105245CFD6DED4067C2A 67336CEB928D704C424FB7E688D6BF9C5CDF922E30CADE68EDCFCA821439DB7D 862C502F5DC6B99D6F4F2E49C3B875582E51671F1A1F2E079EDCF305B6E93175 91889A399055AE3FD7547DF75CDED75CCA1BB081F5F839153635F070E730D929 9C54B4B6AB89A09FDE9955E399D8776770921C27BF5ACE76DC228E5000A11212 4D2848F732ACEF5D27A39683ED2F2FBA8576C66416F73B376DA9B76FCFA746ED 295206F62C4D173B8A4CE17D1DD86715142E5BC4247C614F1AB8371E03B12B8F CA89005232BAFDE1AAE63CB0C72CD6ED934C93577F8BE283B50E2E49A4F96422 52C5A96DDD3D6D5E9806B0D2121E7E7E39D95FF67B3A5A8A4143DB36EBF71A0C 8803C1D8B5C4700D6220F6063DD3A440C87680BEF9E7C125734D4CBFEF380DF2 6E49CD5BFFD0DF63ED0353D73EE82A0F68F12D0D6EC654EAE75CFD677F199C64 595805DC3D79A4B0A21E542454FB54A8B0CAC914AF48DD3DD8A259C71F489D40 FE493FD800C5A6F4A4DD1FE09E4C1A6D1EDB869C7FB98C6B7714E9FB3975DE44 00809D6C0ECFACE87B1E184B3831ED8620922FCCEFCDF2CDDEF480A728E017EE 1045BB8932D6C4F5E07EA3A173B8AA7C7DBEE62B2A64F2F989A6D70A7EC071D1 789F103CF78E4BD3E8F73854266C5C371E4C28CF8558AC1663ADE44FB0559482 D8C8B0DF341E35D625C74289B8790A4AA712F990FA485A8A3E6F4DC59DDF3AD3 79E25FFE4F2D87C37BE909798BEC64C4F2336796C969792A766299049E36FA25 8E0B5EF7C164F4CBFB0F60054773F4DCD3C16F4EBA8D3A73E0E25C950E5BE4E1 D8333FECC87E696DC33E1F9D68378291D27229537B4B1AC63B5ED86C5BF98E83 DA93D0ED5323E453D1494DBEA63C0156ACA5350C0BCD8BE0D61E4617D7346352 46FEB824E02185285C5D12A6E915F9FCBF17FC4FECE4A97C9F8B45FF61E9846C 7CE552579E9004DF81B18BE1E9F9E0A1CE4328888F8B51B2AA493D8C9FDDF03E 69E0D52C1B8026991A96856F4905909818851B2F9602C3A87B4737BE5AB9610D 357FF334E8B50C387BD9546ACAF5B919E118FCB6C1B33B247BC6500EDCC40844 358B9C5B54F0698EFD78A74E712A2F9D7A90E992F3A8489256D7E5C2BAE1E35E D2530715F11AC40605ABE7CC2995D5AA88139F90A0752A5B69B951CF98513038 3630FB1115C02A1783737E9466DF56BF9FD86C8CAED189B6DB8BFF27B05B75D6 AAD008D945DBFD8F0FCC548DB61E91B6B668E26CD750B875042FB38715B68ED7 9330241F000D9C64094F78E2DD6F5F96C9BD181DAE6618EA9E39652AB1C39F4E C8B5F069D07A03415BDEB30CBDB40E6DE918D06128729782FF0D8A6A2EB1CEA7 A48333B9DBFFD36D16DE8A9CF51457A984B72500A315F3806338CAD2EF51241A 627CF1AEFAC0C4F453BF157EC7D31606057601E78B1CBEC6D3AB78F86D73E16E C4FD3C1FADD996365AA58679E7EAC1F91D53ED4F4106F6446E072495428DC92C 36DF882415AB2686A68FF83E14D920FADCD19DA8E4C6296B1495352B1146185B C0B3D9BEA1951EEE0ECF5EB1C31869CDA6620758A06468C6E7200595E1B23A5F 4E9D20412779E9635A513E5DFEE90B0A30F95EB7560A0E7FC54361FFC664D4D0 0B9408E6BB93977DC140615204E7192B859C8F5966999757B5C9C2A2E7626362 4048631BAF9CD025143BC595934DE9EC7639C14186461E458C3F4BECC63F650D C54797DC29AE4C476225049183E48AC0E3AC3CD434FDE1329B52A5032794C88A 51B045BEC673174B6207326F618C4445DEBB052BF216A8B50980E35FFC10C8AF 58D8D1B5BF315C97C6A4B05A6F7DE8375D120061A44FD9E74CAA60D1BE623D63 3BCDD7EEE2893CF50ADB6029485AFBF3EA99FD4ADC7F732513A6F8AFBF073F12 FC07414661AEC5491550B2229C65F4956C9BB8C82DE7672009A19CF6B8731980 93591832EEC7BD87331727F784B7DD3A51FC0C4BEEABBB5DB6E9E4FD36EDD698 0AF1863FDD53C8F7B21EAF4D8B348E534426B496A724F31D9375036BE9B4DB74 47B2ED9F94332672C52C53D4425EF61CA02F9CE7198A43F9E4E8298E852A0C31 4A38FAD63EC234C03D8EF86BD5CBD90AAADA56709AA8B9E8EC6520DBEF16DF5B E469DFF374848F19EF7C190AA5E4B9A10DD8D3D6DAB4CF7DC447C53725516DCC 93006A6FC4DD7ADE71A5E4D4CAC8447B7415E659579CE6A8D368113C8EBADD3F 5E4B2B7CF46927D5D966CB3A50F2ACD6A63EA202D96591B17182EADB0CC4EB69 2B2E5FDE28CBB4F2B1A4EBB051A29B994BBB62852C211116D43D5AA682A33E54 1AB596EC67B3AFBB37E64A7E125B29FD6D4AB87998369EB624B128D63ABA7C6C 4EC74BA3E01C4F6B04CD62ACA5816E9D15DFA330651DD47453E77686A25CF463 86D69794973060D51A822047454E5EDB556CF353E57442E08BAF1091DFDFDDF4 00267C3A9395292AC9BC7E0B14302AEDC3F8841F159610A4A4E94F91F7D446AD 741C8E7FED6AA81FEE0BA08466766B2D1A9E5215E41DE3DDBF9ED224ED82056F 0040AABB1780A38C8A5493EEDF2725848FE1348D28B5C21B52A36671B1537C52 754289B107273F78EEAE466F9168F367975FB63E5D5A8BD83383A6D52E9871B3 3879AD4BC4B65FA3608F9189FFDFF3CD006A40B005AE27FCF8444ADA8E08339F 1ECAF48D687E2C2A095B398E6E1A23B58C98C381556B32D9C3C2634F5D721F29 376875AB466ECA94D933225A792C1F10A60C127D04A05CB5B072C26DD238C8BD 90353C41905F1BE04D6BA8C8722E37451C38E6C83220686E820BCCBCC39DC2A3 C25F2551074311F15B72EC0FEEDF8D7BEEDA8C8659BD238D4535719091684803 3553BE97EDFF9E81AE9FDDF9C96DFA16B1167A7C4F9383B12E2F9A8B52D23BE5 F3E56A81FA563E6D0D64CA5D68BFCEF86E3216BA85A25264DFB864A8A1D0EDB6 1E0A7910F1365452B4F895A46C9C43B5038509C44B0701321B19614236CA5DC5 9D38E62266525677BFDD1C6F934FE18CB6418DBC1F7B1B9B20021E88F8280BD3 7E35E469B706A183F6F48C34502D0364D400AA7E1A4E33216557A1C8886A9692 5DD7A492EF4E5F6C9FB9F2BF0DFF0F761013F13E71971A14D99DCB6C1AC77131 168A53DAD6042F9656C5717026B7B3AF8B0833413FCDBBF5BB73F10F22CC9FA3 EB3F36C842C66F448FFB2EACC663DA4A9E89BB89D2B793D641764925C7115E13 F8CECC05FE5C697F929EC3FE99C13DB90FDAFEFD3F15D2542D3DAE35C8D9D32D 00E2DFC6065934D35030BD21161944BDE5E74F96C827740D638508A37C15C27E 2512E83C44E925140E966C07DC49F534ED93C2400F6AB086FA905B60BA46B915 EC9C0027603FDF26F3CBB865F53D72EA8D97D98716C2E87C02F9637753043612 0CE24E6E2CE1CCE82F9480C5858828EFA51CBE630E3B658F991AC24622016D05 DCB1EC35866304061D9BFE9892805E1898A72D41C5219EF0D7FEB8A77BF0AF35 C45759E9D71E7EAB0128F33C03E0055591636C53EF6984CC7253BCBFBD27B44B CA924D59B001DE9C96D505588138E7C2B497F6E26F26791F5EF4D4828C78CBFA 84AA6B5AFDDC8E2F2B0FC96DED09E185D6218456C306274E39AE9367DE0128EC 8ABE5ECCE9089871585B0CA67CF636974E4D1958436C92BE9575A5E15FAFB1D8 A253BDAC2DA71DA188B31102453D12D17F0B3E0EBFFD5598B8C95ECC68DBEEEC 67E74298AA7E49FED1914882DF110D802EBB781CCA459457ABD0D01A6E447862 54ECD6655EEBCE77E899F809DB8083B924FA1B02366943B278D75DD726D4584A 0C9FFD32066428500DE1874E9FD96E68DEEC318ADA8A02E096469CC7105010B7 4DBE5F2342ED84FB2FE40F6E8D2DD856BF127DFA81BFD29B6D9288B151C69CC1 08773D18B9B3D339B31A923AB483601234A0840CD1B88E1A35845C4ACB612092 95CE26B5437C1A235F74B37C9AB7E48366BB1C6EDA15AB913D10FFD939E61FFE C543E37B1C106B65ECBF8BA5E02BAF28CE6B1A6A95C63E8C437D6DC255006EDB 44395C92B2DC637DADCFC92EEC3D7949693B544DE3AE49F5AEEE14FACB8BE4CB C8D57FC4F4563DE2468C9D9356756EF988D474833C4D084EC482733A4FB1C7D6 7E42130751913CDB6D13A83B2C55B8631057EBE9E5772008D0C80ACA0B5681BB 42624065BC3A7D4E28BFEC9AED7EE3CF00091D21C2AC09FA069B050AAAB580E7 6B9CA0EE7CD42BC5A4A8BFFD2CD9343268F264402B5E90254E8EE1F6DEB30517 8EA7BD6ED1B059DE45872CCE1D9AC46772A9B35F10BB442D6C35B5C6A17B2B4C 4577AC6B2EE3FF229E19B46DE09F5FCF13FD435B75BD90BB86AA9F0210FBA8DD 4FE20F1D8BCD6CB210938F4B858ADBEBD043FAB995CB242A7B977B45BC5CFE23 3F3467CAFE44A25C8BFAA40ED290107A2753DA59BAD7EC9E8F240159238C61E3 A042DAE24A74037A770318E15B62819D95A44E11FED7022143D28AFC55DCEC5A A108C77EE513E984FEF1DDC78F2CFF3A337D25C4BFD0B3CD710ECFF630A21931 3DD75B549C2F89EE7E2AA1AB75270F39AE8228C7B9E6B4DE03C37D2727C2DA73 2566116A96E79E179CB05715BFE72195A12019196FCEDF8E63BFCE937209E544 6B2A8C6FDC3A28ED73ECEBB8DDCF8668479C30472DF5FA5FBD131531C68E6C45 EF546CAE5488250596677F07B98402A7B77278CBDD6B3E9EC18D993ACC786CEF 675B0897ABEACCEF05AAA68BFD9BAE055FCF784D241E1820C2230692C380C682 A41394B227D0E3B78BDA27D13F0D95DCA826DA81B6220415F044969F623618E8 8A8857C05D6F3F9D1251ED87B7BADDE7EB5D6BCD97AA5657A113CF0ADC273834 EAC2D3DC90DA7EDF43A7537F34E9FCD7FD9A698107B70BFC48B070D2B3104233 B7FED4CE730CEA86E15B61A9A48174B081723386930DDC90D21F7C681DEC47F8 5C029501960184459AE9A1FBEF58B106CBD9555697223E9094A16CD43B3C247E BC526C2FC8B188CE27CF7CA2C8FED38B14F24177894D9995CBE67CE0F60806D6 754A2672B99B39DE9A40976F02B43ED25414E81096D67F7E8689E2C812A827D2 CC288A0A0EF061683EA07A787B5B5D2FB24EA97810EE986727E26DD3D64F0FFD C24681372B469FA86DBFA615F18DB7B8AF206CA7713D9A3B9D87CB8AFA9A3A39 BCB53FCA127E788C6D47FEF41B580918347C5B4F01ECE8BBB441C406B5E80D4E D7CBCB2B09360ECD6DDB52F3BCB3E3901ED5D0F72C6AF7500D82DA5740F52809 D24E6D73B6C54ED59FABFE00E93261D77EBFDF3CED905C160A6EC9C7257E113B CC1BD7E17F3EF0E63A5A33228763800559760771873DEDD2EE07CEF49B0DF0B4 2A2F5BA67859C2ECB2E2A425007D2684060F248E72E413B06E939A74D89C1C0F D6960D4AAB4E00D28E5CD7CE6AD04CC85A7242DB28F9D1C65252F18FC549549E 520521E6E90BC1C33D7C898682B6564F63EEDA0CA57D6527E35FF18E9873FC27 385D35ACBA307660D5E4A09761FC67AECAB6E73DB20BEED87B21B2E2BD15CF0D E3B69098F930C0E9FEC5256DFEDF5B4C6860CDF8C3744EB8D67A24EF20E4B827 BA7C7B83203D50AD53D410EB2AB3EC40D0E9786C14651082DB4009A5EDFBF19C 930E4CBFF2D85119131933B9AE695862ABA9EA7832BB8FF367EA6BFDF7D5B61A 0FCAAB1A424AFC21129BAED0CA2E274D22EDB99CFB83D065ADBC462E74E8B4B2 9548B8D55812954222002553788CF7D7AA4C30E8EECE8B21BE507F7E56122CF4 C876BFD3953C21CEDF11AFA121C35E0BBD9DA0A68C0027195898CD4BD16682E2 F94EC135AF804913BB7B1F9C6ED2932147DAADF2E0D0254AFCF71E843D04B35F 405530C3057E99B1617D2D03418270075CF7C419DD8B4A25F0D8FBC23850424E 7C9627F184AA9EA4983228109CECDDC654C5B47EC43227CFB7978276DAFD81E7 2585FEBB82E640EF9E9D1350392341D8A667D9FDA7862D473D59FD44044B247D 7A78841F4C7EFA5F4F14CBA66C7F068B89E1600759EB4F213EF33EC9CD6C3BBD CAF87FE252FE19269F922A4995E0836288DD07A949763932543B757063565B0B 2A4BB368E2E1475C76BD9C465AE2B7D6E3E81403E1AC71D315EDBCA35FFF7CC2 DE402187F110886E0B52462416A7CEB36F4289DDE27EDDD99A03A383AE6C1707 331AE21C1A2779DB51D9D4BDC01134CE98FA01E09400E63F73BD14A23FBFD679 94DC07A7570D96C67AC817952CF74294FB777078BA7AA4A7DBEB783C9284EDBC 1D34A478AC5E166AD46111A5BC0248E605B3091847B8AA8C7AA1C328D7360551 8970E14D43B3C92DB45E737AC76A7DA3B423330143BECABBA1FAE984EB786682 143A01ABF04BED0F85CD89AFB81DE98E44B7391668525F1CCD6F588725EB4D9A A4079BE81DCFCF9D73B4907A3CA64C5C2D00BDFFC19ADCA124C1EDF0D73B3B33 1256D1D9300C1D1CF86D0719DC392E560092D192482B8780B4AEA395BFF01FB5 C81D7206664BFF2D0467FE223F21AE36D2950DE44CD7479956E8B42DB54555C3 8A3FD15AC9002124CC177B9DD06658BDFAB432E12410C168F52E5510BE82F2A9 B22128CB34E58CB7BB3BF8C767B5581C9DEFF8EB9122FBBBFFDCBBF94EFB5146 4C59EA9C7242E00C6723DC9E7E0D0C6C8007BFBF914B4BC95F31E1A80C89FD9B A28EBF18BF9E94F346E404746B51567471930A5815DC0751A926109819EC8824 BB1952C8A828F3B596CD5CF548F94C5CFEAC1D5144879880F44667700BCF35EE 1BC4D2A8ED8C6D7797127A3C1928AC5CB215551FB31BCA22356F9E8F3ACB70B4 BE389BCAEAC22E0840179F2DB13C8DC0DE35C9EA2F397AD6198BF006EC978B29 428A8BA2DAF0336F79E9922D1381E3D5EFD0EEC41D4C677BFF7CAAE5892FD0AC BB29B8188850DF0A8E9A23F85D8974E4C72123052FAB021AC5789219A698C0D3 91627D6D461B1AB939C54C27E51E524619CC093005A862181B3BBF07F2512142 5645BC6C90A3CD9FB4346124B044ADA85EB6FC705B89B0AD4B5416E6FD332D9E ED5E928304CA24B54929923C7E26B0CAF9ABC2B07799B0F316C9D6918A4DDC48 DBC10050DB6CF11B92AC24EC2A4574A2B2172AACA82CA7DD8F80BDBC775EF8E7 B7796748CF65468579E06CCBDFED6AB6BDC83741DEC5C25CD5026E8F40D5A924 E0604B51CBDC9E04009CD8D83893E768D98349BF44526054165E830A96486BCA C6635BC94E3D1EAA79A4B7E5D6CCC6E430311FF24EBC76DB51D028A8C1A06B18 3501D2B1C38CE87C4E93EF194822DDA21EB1823DBC9CA32B23859A4CDFB5B89D 6289A22B8D2234A4311B4BC97783E07C6CD516052F4D920ED9B5F6FCDEC057B7 14925BAF351A733E335C594B58F204AF5F5EE9B39BA94FAD354700423E0F0D27 A3CA737250201B80E14C2EDB0BDFB24F33E6D11C334FC1AE4DA1D5F5442F9B71 49FFC30A16AD0772FDC56338F17076CE80B8D86B0839937F2E30174C63B87AD9 04329AD17C943F7BC24A59FE1351FD56AB4D3ADDD939901B17C2B368EC751447 F95A889CC72409F63208A011871D14B861BDBE547E87EC7F59ACB1B62E4C1F05 AEE2FDB9D0A5B7C5A4AA6136C9D5A20776762E980EBF09AE07B5D2C324E130A3 084DDEA0D8DA768443B60F6315B2B6D05D83DFBBFBFD9F8CF08F9E02F6DB970D 0BD220987A6E0C1951C91533FD28123D5D4F76F0D0586DE0E9F5AAB96FAF20E1 029599B7FF3FF29230909C61763AE1F5E2B22AD55AF7B294471F068619E02A96 95D785CAEC38C2140C8055035449445169876BE576E2AEF68D910279EA409418 00C78A535908E2030C4C1948B75869B20224A1E1CFFD3B7355E7CBFCBDA1A5D3 E6FEBF8D5A6F66D07C45D8C287CAA057BA1CA998B46A0DD4B92CF76F669D1849 63DEA7FCDB33BD0128A03797D3BB0163C013BDEE3A29453360655FBB13DA2259 8A22D7F7B74E91151C819CCD38E236E6E62F5CAF9C55AFFD94137969B01C8A0D CCFFC22B831D971EE7E561A6F9CFC2C7ED1F4743A881502C867F75B1D4D644BF 03C6D46DC77ECDBFE341C491C8447587C250E64EFC17B4F1216139EBA93C3DDB 3716EEFA6578EBE544B023A76058E6D581E0535137D40C45C2A6AAEC85D27EBF A5D9B11786D81D60716EF63D532BDB787E1E49E7CAAC3A50407EAE6277715A55 0D8ECBE0EAD1792D3EAF17351B4733A292119693ADEF71021D27B85DDA5EDF93 0B5371AE34AB5CA49E9DEF5215FA973E74AE534B50D4E8C4FFA331872A749B10 9BC0404FD9628E2451CEAA1E2490EEFC8C35C85F5138A35D4D1D9E0BD728B137 F16C454C87B40110F58C436A3D7F172C82C0152152D47C18CB1253F0C1E0F1BD FBA9390B2EF0862221653B0E22219DCF9A21B4259C9C3E0368B8A63D7C631AB8 678C11A6E95A058345F32D707D3596FE2514FBE7647482EF2EECEFB3E4C1593A D71E6B2EB11FF4FEB89845A4C19AF5F297971D1F6162C2A859421A3351407878 98BB29064509413579FCDE4B8511534BAA7122A675C9CBC74E41E679E5D6B6E1 045D57945A929B283D0E92B8D08B6DCA388B86CB166181FE2ACAC1A896CE7E3C 5FC0B76254E71E216FA50A2793C3A2AC2C4EFD0B14F5466D09AAF09D7976F2CE 135881EBF2617F654A3543421FF86177448AA7C176D6C9D1E604EFA6F37ABA27 8A0E5051031B787DC496A997CA1CF5A3EA69E3F83D6D13B6FE908F2785064210 8D9533CDA1D7787E166421CD7498EF248C92C0938C36793E8C6D211AE8ACE05E 3A4BDFF9318CB1ABFC1AB96A86CD8EF550FCB6A8D1E8AE07B17767C0FCF9009B E5DCA63F230E3C1EA2C9A71FCB21BC8F9ADB38DE40A3EB2306640945484695D4 057CD19389B29AC46CA9135E2FC2D65E76C3D5400158C2D18A58A1127A259B78 630FEB3D17BB7A700589FC063619AB69E57520DEC385BBD5C6F58068C2BF0629 83C3B0CB76DF6F55609B0B66F5DEA00238254C23C4CF7159DFEE5896542F1E07 8755D7BD125AB7AF415659BB392C9FE81CEFE23FEB8481122C766A3F21D98BD9 D9C696F2170E82C9A2C310FA942EC47EE891C0B35D25F75ADF81AF6D0BD69813 203E556F0E5B7837BD64102E370DC97EBB13225F2E418F5F54F1C747919CDDE4 A7B4EBA1C6CA3DBC06F19BBE38ADDA9C0479EE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMB10 %!PS-AdobeFont-1.0: CMB10 003.002 %%Title: CMB10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMB10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMB10 known{/CMB10 findfont dup/UniqueID known{dup /UniqueID get 5000761 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMB10 def /FontBBox {-62 -250 1011 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMB10.) readonly def /FullName (CMB10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 97 /a put dup 108 /l put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D432E1428FB6D5BDAF 3F02C975AA4E0072BE5F8CC7D3D59BA3FD04709FC9E52189F55C7747056EDBF5 F85CCBDB1DDE9F9163AC7158EE8DBFBE8D94A46510118ECE6A280C4872F448F2 E6A6B36AE3224FA448DAF204D1C998D010C6BF52DDCC45831DF1EC22528B00C7 70525CAC9F6BAD892E7D5C81295A2AEFA8A5E4B6BA2C4EF61FD3FECFA2A8551B DC84DAC597222341E762620D3D3C1A4AFF2F6D68C4813004318FDBBDE23AE224 617F7BC1F3846943E915624D6BBFC555E2EDD013F190492F03CB64E5F2403723 7A2D4652BFFAD1FAA1DBA4538F2C3E608367BF95E09B853A2BBF9930D9B3BE46 0BFBEF05DA75DF3D8E11A09D472A9E45C626428A1A599C111ADDEC7A4E70407A 014F792395A2A12303EF51698D487854EA15000AB08BCCA8B2E35A5018F5460C 9B223315D7B838BFEB224E8D1DC9A0C1077DA31F5FCE0D9D499EB0507B90E9A0 1F92FB5FBB8D40568C1E8B8CD6E1DD27CAE6E107AEAC5696CFEB19091B40FD77 7A4B4F0F261702BFF5E2320C62EB5C6E9DDE142E9FC7DEAB99D90297AE0F15A7 04C0E3B39FBC85CB6B92BDA7917698230B5374D9159807ED1D07947D95802693 A856C84812ABD3EBA336B88CC8F37288CAB59790B0882A4ED6815FF6D7A1BB35 5C7B7437D2ED76E806813478007886ED1009A1E73CCE210FFA69A20D6E05A713 F6EFAB133D146B0EBD547CD29FFE7870973C1E71854C1C643BADC69974BE360A 4CF84FAB098EA3DCD2DD8B2FAAD19429B0ACC7C312B03E6446F1C1D51E6AB45F 72F11FFA078DF3196EA970B24B1BE607571795A2FDC2EE7194E9422C483799EE 23E16A737951BB935EE2C2BF008B6190E0138D551E75C9E6D0EA48E64E9750C4 BAAE32B894BE25D092CFAE894230430E43C585D0F06636C8D56BB80A4597A0AA 547FBCF12821C20F0E62369E1A9CD2343B8A8647B2FBB1F4C86CAB1F7A14669B 69DC857F9BC7538A864E523C2DF7C830315E0907CB17C8FB6E412A2A9E88317C 0026A6A402B36BDC433015AEBAD775835E5ADB4EE75FD8CA06C199E000CEDF93 00692F29C5394DEE45DFF2D42872B1370C8D4A14E144FF36163C849F9339AB97 EA87BD445733162A34E609BA1E92DC92F9AC892E7A0B39AB0FFE517856491695 56155FF0C2B231EF1314CD4A146EDB1CA9AF7DD546CACDE1E6B49BF0D4ACBC09 55C85E2D38DF84E0B779642F7E9C26CE19EDBF328104B9E803D1B03F3FC24C4C 9EF0D27C8E5AFA420A63981C000A0C1F0B3D3F853FF300EEC524C586376AF998 DF4ED5AA16D8E298C159C2A3E33048D4EF192A11287F69B11BE24D49A033B334 83CB8783383F92EFB9E3BE84CEF37796BA4211E534B0360970B9C57EA7CB54FB F582789A83113ADD2415B3F84AC4ECA15DC70878A32559198DAE67B083B0EE6D 68A92511FA8FD6BA88A42769E3FBBBBDFDAD61F99A6C274B48CB044D16FD5953 44F1503D8D1D6DBAC41C1246A71EBCEE5B1F0DCE3EE7E3A99792DD8FFBD94DD4 3A5ED347A62D301B6739AD2BCCC7C57378C29FA5A83759E7AC6F1505DF6C0E16 71587914F698608AD93ABEC43611DE709ABC3F1C0A1343CBED5F09DDB4FACE0A 8BBA9DE5B85FE9B4365358DFE877BBFD9AF08BC60BAD7C41433BBDBA17EA9A7B 92F76358612FE44F43A85588DAACCF7846ECF5C58B22F18120F895317609AFA1 06E88CA1D73C4CD5098CF44093207C31F46977B6D22665AACAD5A169906640F6 3DFFEB3937BD6CE1501C52783743F8F6110DF43ECF512D49A55379432CAB1C33 7C38B7A38DDB91F0683A052378CBED8BDE4E6DC32FFF6D723A4D1469D32AEDA9 FBF89B9604656DD0D44ADFAC39BA893808676E1E08444CE56F6CAFF3E93D8D41 F164049193BA11AF94B43515BC79D6A538C00B08FB518EB67C27E73380A651DC 4B244E8A2E4ED405EA5C7EEDDB09D44C458A883C839B98D9D6A2209516E0310C AD777536190ED06F47EB2ED61C53A2E0AD0CA4E4035324DE75F272B1CA6BC1FB B912807B7331D932DADA30F1975A1C9A8B55604EEE8A0CB514C6CAEECAF9C46B 5D5563E8934B421EA1CCE3B96412D78DBEEABA59FC603CC6ECF65BDB5B66EAF9 14B852CC04286EBEDD560713090BC417A10BB834944E007F45B61AD6E6150B9C 10A6FBA56C1B45EA5F9A5379B1A0788513DD4100B82BD61D89E6841A26B362B1 D4762EAF4FF3BEABD882700BE9832115405728C5292BE942F871661EB0E6B29D 430CB271A090B6F5399184F21ED6728171B1783C982E61DB7C0BF90CBC1482CE C6982B4F0AA39076B64CCA5A71BE73CA65F2CB60B89AFACA957EF8E6429F2182 CA36220F80EEC5D01AD7061DF45CC5109D9F0B7E2B6DB9D6C6326A45DC6C05D1 E81B636A82592D99C7B7ADA0E958A0D7570BFF1830017A6241AD62C53D4CB36C 583672FBA265142DCE545F4855CA3D9E528143AAC66EBC9527B76EE43B4F4E2B B209BD265D6AEF18D168CA7BA2CEC40DF86FF352029597A5A3B2941D467DF229 50C788D4276C5B400F360AB596E35983262A215047C9714912B2E69CABC0DBDF BF6925E19EDF3A6638CF5794722C8B92C6DCF5853DF288B9DA52A2152F98227C FC04D3C318E7D942E9D33582A490888F0C1CC1A8C4474091B4956222DE467632 33CF5DB7DA165B59A648AC6945687B0ADB83EF5B286CC469B2C9E4AE92ACAE8E 86E4C62A092B8F6C05EB2ED346DAA7C573A03760ADB3CD55B6C794FF4463BAC4 2F4A738F9C4237107C503A7EBF4F4BB4380DBB64F5F5C9B268111752FD2204CF F25085683D071FB4149A64426859D407936A3D1E2C627652C126D8F9264E2919 960ACB9DD61BDF973492CDB1FD20EA81E06BECF5E164A8ABAC12926DE1CBC0FC 6693737B4875F465B5623C899FE129B3A52A2BDF104F8B8429890AC870580C7D B078A9E26C322D1A8AC1C6B2BF340813D989EE8D054882B965905D33EC3F4278 DC41BE055E0E5F73B5A1F45E9E69718F5E155B4EA30B28BD28C52C6C322F2E84 674CE600D699CEE1D2CFB7212BD8168B45824890273A0AAE4757D112980DF2DC C3026300B4BBC9B081817AC7F4D48B309E66CC7455708C772A08EF6FAC829363 E27AEBC3E7D0A91984C05935B16E102E81D6AAAC347E38EBA40125543263BCA6 9C6F4AD6BF8C3A90279FCA4A99D9290C3B8E0DEBB4B2DF932F66FD47AAC3094B 7582FF8265CFF8BBC7F79C8C74B1FF94B26F3817A39B5FFC6BB562BF6DBF9CEC 31CC3BE4D7E431D41D55D96C4F020486F993781828E9E8850192F9F6BA350AAA 5E292210B0EFA4061EC8BD6EE15E3FAA4AB2F54110D17D29BA32C0D28559FF32 D164DCC98EAC78822D6D6AC6F4871D47290A11C83670374F072A9DC723096C89 EA584D43BBB13584D9B8B1820C415DA2E0DCA1B50655E81B47B9AC8343DD8FAF 95F4771ABF81361EBFA9259EE8901F31C21E95DD22FE04BDB77D23DA561FFCE5 A7708647AAF65FBA2FD95E843D839E5734D4C08A215180C7244924E002A965D8 AB29470A1B86065B4133A9A6EBA05EF1AC67DFB5ED8DD8C11450233D2624EFEF 3E6D3DCA7E23ADF174BC83AF25A1D7529E52D39C27DA86A2DF4BE4F8A96361CE 7025BC1954C75A765ABC95B4AFE0AF5474653E6808F85893BE6ECA1A37F8B666 05A9E9FBAADB0DD86848D6FC48A1000FAB396F756513798E09D29ED6DBCC8466 40181BB71C92CAAF8E240E16304DB9F4B0FB6880004A0F9AF6228E60646647D1 669577DA709B4FDB8721B95B07B4599652A303FFCEBF858A41F08BF3B83EBD31 74EFA947A8ABFC7467D6CC544B655A7BD4B6A4F5EA9BF11CFC9CDCE14FEEDEC5 9116A3FEF962932F8B105BC4C51744916E8976815AC286B1E682D83091E9C533 839223A68B9D977C41107F597E05C3D8C1C3E79542A990B0E8E22F34BBDD8E47 B6C2CAF54B72E8F0E8A41DB343934FD2C33B6D77AF2E9061C4E76BF258CFD615 30AEAECE9D04569D358541C346C922A01D017BCE85D4F083AA9B6939D85EEF29 335D1BDCC9E6D5F7F58EC2BA2D8CE50CCB38AE6A2DE2F695B76831F8F591BEC4 EC6391563D18E4169151F552B5E1601B1DDA6F93E5C8B5F4FE63F5E002AA3C15 E0C8DE2C735EE00E9A2A01530FF37B7FEB0FB182A4E381CF1BBC80D743209814 F99002980CEBCBE3E677005766CE1D0AF4DCC9F103499D1961771FFBF01B833F 1701EF6EB1A381A287F73E519C01084241335905661B2E8B86B398C88F39BBC5 09FACC1344E15CC7685708BCB3F43EAD4E24A84AA0687FCE0A2178D9BA84EBB9 68E8A727DAF9A0B28A7CA3B119798603F9BBC6728C5A6B4BFC84C95DC4F36839 C2649E364CEA39A4EDBBA4C0E27C61648D38CA46B64E8CE797CA3464C80214EE 28A1E58B387AE0A663A39F04F57899ED62FB0E542EA108AC32490B4B2BC068F6 2087BE9C9C3CBFDD80F2E632BC4C971A79A0A3C3A5607B997223A9F6373EE51F C58EBEE7756A391C91758A1F6567F532A5EB762A2927F57CF9F0E845E4F66B3D 8100D1795B706FD32944CEF24A054650EC911A54A22F4F35E3034AC70F07C98B 8DD43BE9F7D68C50D6449791F5331A189706D9CD18417348B9F296D8D01368E3 2523FCC0EF33B998FE925B4CC7BE329B32D6AF791BFFACB60E4874412C8C8676 34914A453A592C7614AEE5001DF3E5E8D9335A155C65174B940E1AE61ACBCBD8 A41D7E1C6FC0680E094ECF65C60CE714E6EB2A1897D8A3F39FF58D64EF7E9A41 4CD8E55BE32CE8CA29239A9BE3FD6B1DD5CA5A035AB1FE57CAFACB8A39B6A877 C853BE6BAAEF5714982FBFA414EC128B61326B60D83076E690FDCBE3D2AD256B FA7A15B804402826684AAD933E94853CD0CDEA3CCA7DC833E486F431EC4764DB F3FB244DB99FA0CA2FA14DFA75A326385B3AF92AF8E4C6D437DC3DCC07FAF25B 6C0F270333ED377B08E498BC3004C25C7A991DAC9A3E0D1FC43E2EB6996C7269 7A864CEF35FE312DD8F87E37AC69490299CEF9B059EC7E7492D1D6E5640E0AC6 35B97F7A629B6B7CDF3BF86D2B518EA807B03E4F79DEA59C84D98E4C94102EE3 71A29649ED75F5ED02EFEED8064E2D54E8F9CA0C4284B987B81B7F41FD7DCAC4 FB9C3ED70774F9FD09F3321CE1D0319C1129F5868DABBD183045984748C8A3E4 53E085818729A1353B13C78E63E837DE483E9E2ABFDAD16534420BE4D7976D35 F56B86EEB90F663E9778A6E0CD698E6324EC2D19901972B74EDAB8F4073E4F37 89082F08735E8345BA167B2B76C77703C586CA5DAF41C0DD0E231184DECD8A9C DE8FD239B6CC636507A5BE6EE5283C06A1D8D59E98A31AA76F4D358DBC641DE2 ECE3D9F2D262FE2E878E909A950A7642A3F59995519D541B96D459F24F12682A 9AE61FC08CF436D9DF060DAAA90884A1281B370A2F824704B5347FEC65E14E7E 3D212E29723427BBB12C1CB91B28CA47D6FA8259A875EDAE4B49C33B2F73938A 784C1E7A7F21873CAD55A868A1451B070A3F259A983293289B131E07C903D7A6 3CC66CEF8C4D2B6736282896A2683EEB944B67240CAC5FBD8A1392A875245A9E 2611B511909A041846063E465473D41958104E92519C0F86706AD640FC6CEA10 620C9718C4589D9D562D8810CF6F461B776D5A1B040F8272D43C029C2A695D2E 86CF508C4AB11104E575E13C2EF56914E241279BE0558CD3D59D25BF13CE8212 3D7AD1F25FA5A9155AA06306C7CD0F49E3498856318B0ADF279731E1769839EF 98657EE73CF07B0585EECB67F5FF609E0E3DA1B78F6A8FBE2F2E0C051237AB4B 1587DD72BBFD962E865EAE0CAF1A5C592F5019C7533BAF297C0F78F3287838D6 CEBFC8B5969486A5134DA76B4961C8056E1EF1F2AD17F19D7998175D66B3149A 2CF21CCABA281EA0345EF50C1EBE7004ED495C6D03963B639A66638A43C049C6 DCD311B5F86EBC814BE42D432EEC87B861FCBA9C8729FA5AE87E20C5B30B8E5A BB41189A42B9853CA408BA01A559CAB722AAC3DA28E70AD79E1BBC8B6FCC937C 180B5C2E20B03D3FBAC60C83F765CDCDB3146FE5C0B02911F6E120D63EDFB0B0 86CCF83C2AB62922450206D3701588B54A8B232126BE120432E6BB2E25C50B13 708D742A44E20176C54FF89F4589B10D5396C94625AEA1914AC168899FE7AE9A 7D90DA67A5EF3DDA25CCBB18DBAC3AF4AB889528A381542185821B96CCFB4302 987611DD5B5B8514FDD7F5148D1BAC9C34567F75EDAB317E0B8A7A76604A42F3 1D46332C4791006DD1AB657308CDBBC7314592707EB163326E345C2C5EA05B33 01FEA5B7A346E6B1B6EF58B692150C6116B149B6A26B493674337A9C1CB4F42B A7A80AC587F9BBD7A487F407EBBF9978840A01B5E7E772DF7EF28481E7AD14F2 424816AAA958320A0E6F318C757A474F7B05AC0F570094372CDE877B479AE3F4 90C257A2B3F443DE43D8A58594BE8D4B5C7E5E075ACFB1AFAD4C06415266E168 FB38C1CA256287953EDAB1D40537A3633CB52FECF3D35BEB8C2C6CBEECB54BBA CD6E043EEF68A21D7639FAB8D1006B1119CF92350D9773502F7554B4B3036EA3 D747596506FC674DC01ADEA9B45ADC43B9E6947235E9BA30FF462252038D91D1 D908E9132A946FD03B86A08885AC44CEE72F0E27AA63A901F2DCCB86D87702D9 A66F35F06D6640115B075B0260FB116E24E795E24DAE988CD48A95FFD3116E92 63D02221D272531186E2AAB74496FB78A4064C9C9772608C49D46E40FE28088E B5109171E7AF69599BD8BC1186C196EB11FB4132F5C9FC1395220392E17B66E2 32215E54E9483196341D6DC691FCCEFBD00DFF4C095FA8AB36A374BD5E1F5082 730A698AAB7B57A5399196ABCF7B7963E2970CCAC5E9A5EC552CDBE1E2EE1968 B81CF5BDDFF9D385C9C1FFD726A0C52A4CB0C8121E77AEA16157C1EDCD1AEFF5 5607E8F5C44072DC54332B95AF28417E2D45B4685F270821EB6C455AC147F938 50CC9F7F2006D933D0664AADBF5D7E3E6DAD57527AB59DDD13BCA392B059FAD2 E7833AD00F62EB89CD7BECA9DD479F7CD7C981859EF43CBB1EC1681081B58A39 2CEC9FEC039082771E1BF48968431F72817C8156D0D6B65DD33D472BCC49496D 1F5FB1796892C6A45BCC65BECF41D8604B811824739647D87A7B28FDB3574478 9807DA2557F411E0BA7479F31B9E3BBE6F3CAAA653883A9D2BEF2073F47F057A CFD20BE1371F17F5B6F0A9520F2EFCC3C04A24EC272C43E1F587ACDAFEAD7076 6139D04FD9A50F67301D7765109C76D6270D2DECC94017A877EF386AC7F625C0 ABCA9A6D15D71AF7A5889403DDB83EDE87EF5A69EEA97995CC1601160B296750 32AD8D65A456F5471AD4536F1AF41A4D370203F897686CAE7C89577D3A843E90 9C08CF3E3D489625256DA5E0984BF971E0D8D251AE5B09C17883CE07750051DF 770B920AABB2E80A4944EF613891B4EC3F9E214339AEDFDD5DD15240933DC82C D878BCB743ACBB562A41BBD86191E1129718826681FD12981D4159C7432DC3D9 AD4C6C478EEEA0A34030BDD0B9122E8AE5F0B473AC5A48346D56C2DE42815D19 FE378D252960D3F56654B31C58CBBBE0D634FF6EB81295809AF12222C58345C0 45955C840C96068514CFC3E1A07E48E9FDDD79FBCC7A4425EDDA2286E4537DD0 A2B8BCFA8DBD688BD6EECE4FE32BF72BFFDDC287D5849A4428D02B20B2071D9B 11BF19F5E6E440FBFDDDC3E32466F9F8F2C07814865F71EF4FB9E7BC9FCA2027 7639390ACBCB6F9C5C70E555DF8BAB1B81DAE0E04A60F4B0EBE19E2BC155A410 2F56E395698842249966D3C8D342E3814D72D5A30B7D1BAEC441BE309D285BCC 91A04B5E38B507094A02969B8A9817D64BEE718C131F9DFA65C5A183BB8E2065 94B6917376D728658C404439EA121D34E5C3C2650A466A19B82148E2DC940313 852DE9CF0034A906C45E74F2CCE973E82F7A3223F10BD6F6798F291D0D83DF38 2B2FEB1689D6E57F8F2ECD3E7CE6EA6E00FC498609A67B5B5B6D517228C99F5C EF351EF7FFA5A4B28488414B8F845D1B8E31325691FBE64BBE8D1E2E9830B08B 8CB283CE8856A38C69ADFF97C54FF4682391890975A8AE751AE9564A9D3E0710 6ED246890040ABD5404AA127458EDE3CB7CF7F859191A80C104E8BFF0AE8BE3C F441190A40A8EA41DFB3CC020CEB2DE963C18E8DDA085853C69324884AE20A6D E0336FEB47F9918E639106C36A0E74E214C7202547268A88F273BE77876E0D82 61F475A46F1C3B31122857F3B90A36A46846077331C2992A6DF899FE64C1CFD8 D6A0F72A71C73CA98B450F9E688FAFED442B90E6DB26D5FF27023B0412682B5A 1EB5FB91B20FAD0FE622B15ACD2FA23EEC646D35E8FF 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSLTT10 %!PS-AdobeFont-1.0: CMSLTT10 003.002 %%Title: CMSLTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSLTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup /UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSLTT10 def /FontBBox {-20 -233 617 696 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def /FullName (CMSLTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /quotesingle put dup 45 /hyphen put dup 46 /period put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA 3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC 6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F 3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C 4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D 107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C 2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F 55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB 69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE 67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD 802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E 20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC 4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B 4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D 45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA 997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A 2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D 4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E 425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F 2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA 22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D 200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA 9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB 57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B 2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC 39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F 79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA 1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA 0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F 9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F 7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D 78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC 7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC 6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE 5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB 42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F 14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A 6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C 9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE 7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D 4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA 19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D 465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE 078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6525 EE62456392E5DCAD0A0157A4A033E440AA014D5682606312F72248E13C43EC3F BBC9B4A2CF19A4AC6ED7F561EC37127BD0D3662E05BA4DE5509060B1D607170F C8460BF557910870B904BFFD042752C0B839FF9E5E90361BBA35589BACDEAAFE C68C5831BD0F19419A684DD99D772D60BFF26CF80783E4368C5C13299DD502FE D5C4F8531E38EF4CDB97BC705E96485E6D35BC2603CD9EE98FCF9B0FDA17BB84 3142E3FF4FFC6659855C63098409C680B968E62B3C844B47A888865DFA5ED6E4 C1FA4A0FB50571B5D725646B993DEB64F9AA318A94A53411F262768EAB080BC1 8EC80E647DF4A85B70851D0AE4183A1B00377476E6290AE6C8C101B35C3AF644 8B402F65AB66E40A2C6AB493D43969EF9E387BB3BE9EF5C7288F4F2BEB4ACA96 A00C2197C99362A23F03D98051383FE9B7ABB47BEF91BAC8B1410D2A64B36F34 48370E0589F4F92EB773E2BD7043EFF9904A1D3970F475C08A2CB54E1BD34E86 C0ACB8FBDA3FF2AE638CFDFC3458CF4416295643E8E6BC9C254DB1505BC54375 53B7E4E681AAA6033342C9FC75F522C4FAE45E4E08B48CE0AE814EA8DF644BB7 ED27AB1B6E9276138036DCAA91C0BBFB04AAAA21C7DA4112EB39200D36A59AEF D5EB2CCBA5245E583F165663AC1C496E5D901851078D43755F18DB94F1E27438 E9859E663948CC5DBAEDC7E2D4E91A964119CB8044A10FCDFD3571A6A44B0BFA 3586466B3A331B102CC7FCBFF7BD7765BC119F05AA8DC7A0F5BB1D7B3C8A873B 71218AAC56E0E245EB6C1EB5973149B1E11269C4FBA96AD636A32BF9BE6691ED ADE2305747FA6F8C457C8456F5A47CFC4FBE2F70FE56B13A532787B25D1E3043 8C88FCA0BA51C86D4569A8D26D3029FEBFC9502F9759086DCEDF935DE1160DF9 8B6AE50B5D8C9BB33B838CD5119120AEFD250BEAB31EA32BDE7E437B552846F7 0FE19F28BAAE343DA04F88A1A600161F36B6EC9A624728B9F9805EDB74303AEC 6E7FF7175613DBDD4A35BCECF4DDB987A23BD725DB1FAA0F424E9E72FBA4975C 436EC706922EA51BAEF90D12C4C60E7AE81C1618ECC54BDC19A27194AC944BEF CC3CFA7EA64E31CC629005E0524A4203A4D9597C856252C2816D93702F663723 0CE6FF15F9921F6F95E26D2C2A607365C13321333820143797C074C355F9A51E 6D0A34E01526E4D68E4573C92CC976AF06D7103AB3BEF4C45CB63717E0C7D40E 4EDCD8F78B39F80161344448C5D93198E12EF17A18C8F5B65807392AE36BB3FF D8230DD0705D8DFF08990401273F18CD867ECFBAAF9CD214AAF8F973A51E7B66 3ECEC9FD1874821B6A61D3AB4855CB9B24789E4F31B96E72B5590C35069AF1CF 67413E03DE47CFD88B742642C65D37BC66607BD6C38AA68B839138D99DB5D9D5 ED6127325A2E921F889FCCE057007626E9D2EFFD0095D7B41C9690906CEBB9DC 42402FE3F906F1F60579A74C62BB1DB6D4F38FD56B7B2376ED38B2C6210023F0 08FF9B9364BE25F0F519822820EA656ADC34DF4F3B31DF1B993B2F83193E2531 DF97C9436115694F9D1482D11C3CB88C42977979F5B86C0BB5AC89D324E4DE60 72CF8A7636C91CADC9B68FF00456C6FA92367F53A7A9A28313CB082D4A10D848 A412A2861B3EDA19AD4CDCD51C6A59F6BD165EB664C3F21F16BFF06BF7A0E0C6 D2CC571650D45720866CE2F3F49586542EE4CF04DB2EACABA7CDF1AC57059F1E A3679C05BBAA55246B8765550EBD3629D711528CD016B0BB99253E3ECC2E274E BBEB202ABF32C2C3BB4D66BBE4C7E17AB5859569FD95965B328F1CE213A6A080 646636ABF7B0F136F391106BEE2FA6126EAAF3D01CE0540EB13561AD52A94D35 DA9322A15BC5C9A6835DFCD9989E0F13CB3B256ADFCFF5CDBFA44F26C3A941E4 EE22A54097B968A6C75D1A25AB84B1368AB975141535D4048A5F4D2A186192DF 32EF02C4DDFBDE2B88CE703E4C2A9DC6BB531884A927813C5268BDF51A9C1F37 9BAAE69D579D33BB4B2B1519204C6FCED8233490EDF4B72E5BD377EADB07DB1D B53D6FCA1E73E674C612E1EC34116B42EAEEB60B1194822067F3C5BFA438D695 6E43B9840E3FDF4766DC84D76513638A0C814C87923F9979F009D71F43BB595D 27CC9C81F3AD60541D5F5E5344853F40736B4F1BCE96F5EDDB4CE1B08F977B82 A1FCF22DCB39E8F67B58D592CF64BE9ED5C8198F50748FE09D5B68D0CEF8006A CAD3BCFCEA8C440BA3FD2B7BAB05B878494DF8B361FDAC6D403902EAD9ED80B6 352F396BAD5726F37BC402D8829409EFF34A5AA32FE52E13CC75DBCE0A0C90A1 1BBBD3BCEAAE31AF233C6DA5BEF9444E7FB2B9E8DC0C5FFC3EEF6CF29CEA690F 83AFA8C71941A14F718F3F2443EADCF7799A96D70720D4814171CC46AAA23F7C AB91D295A8D77C30FB52A523A6EB13996D0C9F118F9515884647CB97EAE2F3E8 2746AD1A40CD4AAD23867F0FEA63639125FC3AB2221A8A2C4B31010137335D43 A27BE52BB774054792C3BF48EFF30299ECBFF7A12AA7DDAB6019D7C39D48B723 A65BC20F2EAEA80489924F23AB8E3BD74FCB387538EF65C34E60CBE9C5AEB395 AE27D91094DA6EA3B83E04C15FD9CE570825FE7CE57113EDD852125066A96D67 539AFAD5315AAE4243F3AA56AE0447D6F6BA94C0C76BCD8AF0B95B8547834555 AC79C765032645E9ABC5543D09ED87D5FF368D339181F183FD64DDB73D6A5A84 CA393CA4C625682D94F7854BB8E3FA270D0E73EF76EA4D43A002DE033D1A69F4 292A1838D8AC2ABC213F81757F62AD2B09512BAC86F9F30A76D978200076E462 5B71F1B64099402BE30642DC1298DC4AFC559117B80982FD7409D770CAC73A51 81FB7917948FE6129E68369D86650CF9919F6438D9AA18F03C9B7AB1D5C7FEA7 70C6047095934818D58E718C043C0A714627D4623B52AFF2B81A0F8756F2726B 0D41181FBF82D7A3C9128AFB4688706DEF7B9DA78A17DD39A2F5AFE4F7D7EFB8 32BA07E5EBA9D58A98CB9EF14A11ABAC4527D39AF2BEEBA0BFA5111A578AFFB2 7CBC339B327E0E52E0FB2795FACAB41A476A314AA83CC8FB94F48C9B96C0449B B912B17219E931DF29E691BC5E459EA9538650085D517879F796D3AE7F4E00C5 F03C552C3AB5F2D7F3BCB872DC791AED2F3C766AB881B08FE6C44899633FD2E4 86EEF95EECCC6F8C999CCE6C524CDB2A89F7AAA01E6AFB1D9E749345C73E2666 D07377524774D2B7EEAE72257052812ECC1AE059EC2B31576E1662CABA3ECAC0 689DD52C80D26FA478395492F427BB3E81458CB8990B9F905F7B9C0AC9FBFADC 63D23E4EE46BA32E7F72C6DBC1EB8FD124CE9257C41545904C8D204C77CEEA19 E17127789925B71E1233E84731D16A7E3B522FB39F970DDE3425363E7A1F8DA2 D4C7180FBB4A9B8B30CEEEDC06AD3E92492B4A85563BF583A5457D419C94619F 8DFF3DA466FBB390D18A0B042B29C3FEFF704D9316782BF13554584BE1F7AE89 0D3803E98BEA00524D93F2ED5F948053D5EC8DE11255201F8CE1E3EE7B15D6E7 51815C5631D053002718EE4CD35CDFFFFA4FB0BBF81003600859A616769FF7ED 7403CDB95093A3BD20073A2D7121D6335C8AFF410B3CD79C054C181907B872AB BE76A61F4C80D6CDB675A89843FB82EA74D98372DAF08CA45571FC6B10F55E85 CC9D65F7FA84162DC89ED0FF51678BD457E5C717836E60068D20F0F952E20B3C E29D4759E6FC5069F16F458083B6084071F165DAA84A5FC3E9E5CFA067627DFF 70429F75F3F3EDE233692B77E12A0F321BAA283AD3955A8A65B5319FD9BCD083 3E0461B7CF6A8C96224C751330A918C4A8766874721ED3A9A245DB276B7B109C E5A155D33C9599E5EBE5D96FF84F3C5238A6CCC8502EF8CD3983BDECB2C7ADF6 D780B2ABA954BF55F5DF905DE3B073BF605F37047FA18056585461E23E1A8A60 A2B4AA52B52DE80337A39D347E97623E89A04483AA2C541B114B7E43F9A41A70 93F3A138611F877E662EB1F4DB91117779854B5D49E57A38ADC42AE8DAF0B2B2 EB8EAEB43BEE59CBC13372D4D7AA13FDD13235C6759D07902ED300B4BF32A8C9 80A8C24DAD3BFB671B78E192CE4184CD2CB64403BED2859F6B90206D559BEA15 2A5B8F102B1A5CD2916FF1E256D249FA16537B9FCCFF577E5C23D5F8A8F43122 888F4FDCCE764EB833185662999EF986C38B97A6A39767C89B2C1B77E5949EC2 6431B1FFFA4A8593471D5087439EF62CE27FB27CEEEA3A1363514248FC760E62 50836BE9B50A9EE3B5CB804291CECBFA6B29F109A9D2BD6DD874DCFC9ACCA15D 1551B94C78C2CC2E44315526FD0F215DAE46855DEAE959207333274A204E4D71 CC2F7A6F4C5686B0C009153C01AD2725E5899B9A24CCF23F6C98CF724BCC8860 8DE1921414017396838A4B364F3004C4C46C5B70EA874EDE7083FD1183D7A7DC 63BD3D121B507705773F2CF3A90FF0387394EB20A7F0A4B3923A95BA7C125541 ECDF280FCB1226077874B50183642441C980265570A421FE21933C310059429F 89898186E136F82A6CFE7468EEDC4249BBB5C2FCD5154121580866E4C7BFCFC6 F3C4429F68296290D9ED72295D1C8D34D48EA9E8EB26D16DBBB1C5A6FAC87365 ACA3D23B00179C32C291DCEAA132571810AD26463A846EFE819417C60E7CD5BF C440BB645CF11528A0B0417D1347ED607A109A9497F0B0797C37C9E55E4E2A6E 0BDD599598EACA3E7EA4F5ED923592CE5C80C76E3628E4DA242A94FD1A2D59B0 DFA1E5FF7CBDE4CD9E2E91867F89BE25BD48F9D9A854CB66A59CC5BAB5808E1A 155795233204A0FBF8DB9ECD515EBE920FCAC1F5D277AD6C23B14891463F9C35 AF7E5ECC129B73D7834C2C3F735E3DBDAF0F6E2D6C3C64FF3C5231FA947E1FB5 CED8E1359E5FDED5AB4BABA23860E3BF0A7CD291B10A301CF347BF1C57EC44E2 C2652471374E8FA951C932B7DEB35B3939A3CF732F443D1B30C9C48115423AE9 DAB69E4706CD3A4456E37AF63AF5DF3453B9A51E247DEF3878906045ADA193E5 EBB590BEBA54E2A5301E978A68431EB150C05B8EA486E3E83C6E339184E9FCBE 9EC75901342304FF92E93D04CA9EB04FE5537610FA93940EC685FCE4EF3DA260 F8DFEFE2655A3643E27DE92FBC4AF56FE215987A5BEAB5FE3321FEA2CC81B709 47B34EEC826FA9396693610BC8C5D774B22E83DFFA9E091C0BB28CB3820ECCFF 23F9122FB173289ED4B860E3DA58855C83C71BCD41FADC8AB50A0BE913013EC9 292791F2AFC4DF1F04CEA677C4FF19AED29E36C9F8798B5D28B3EE0DC92D12E6 81B37D99996AEB2E585A131F7DC122919E7D3739F3560E77DE9D29B2635A036B 8EB11A39BC6724019A2EF45C65780F2FD47E8639BFFB4B7B6507634CB1E38CD6 99D45E84D09CEECAF993CB6B2B7FFAF5425A9121EB3B57FB8486794E8C2F8C82 F13706B080240D6C361BBB0E8336690BB1C59B638E677AEF7CD3FFE0A7C5750F FD0C362FCE62B479E563C071A7D0EB42E11BA6D5DFAB070C4D17FF30CB7F5740 CD9D50E07F8BFECCCB2C921EAEB80EE5FD4B5DB58C0578279B66A084C58F929D 4CF3F1ABB43132976D3F7DD5334E8968B21CDCDF1DF3C831481D1BA924CE870D F9256768654DA226B3DAD3C79E5A9849033F51FA09CB81009E1E60FCBFAB5EC1 A48CAE0CC9C10E3AA1A8AF3BBB86C5EBBE617AC0C67D552DDE51292EAFDD9C0F C922174CA18A812E88C97D7D05171FEA75316B8424B9961B3D6FF8147B40765D 4D67A7C17CA447B9D37F03AF2D9A5E9D53452CE3A3E23490748D0D880FCA7A23 2DE974D9850F6ECBFF524D02F01DB4CC96CDDAE81B668BF61801A061D6B1A708 B47FB6CC80DD47C22E4863E9B6E8581FFDF69B5332EC68F8072549EE3789A116 944CFF0112E18DE979DBB173A061CED004FCA34A45FC99DAF89F8692F0931B64 538966E5A01EC6C49433EB5A6C1EA709A7CCDB16F50720528D74E80D8092FB40 65153443688DEA911DA30BDE50AA3E446673F13EAD93CA1E95D13D4B2783E44B 54F61C781EE8AC62622A4761F805EC790B098201B5D50526540DF2DC6CE54E45 75B3A12E322A9B7A3CE27802A8E6CE36B08F6DD9873A7D19A82766A4145766F9 2556ECA0A6A4F69FE6DF3A9EE5ACD79A50E5F8EC231463C897573AD3553E274C 67BE917B9F76625FD59C4CC97774104A3857CA0320CC8B8FA07CF7F8BC6C9052 16FF5F9056C96DCF636B2445ADF05A1256F8977F59 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSS10 %!PS-AdobeFont-1.0: CMSS10 003.002 %%Title: CMSS10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSS10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSS10 known{/CMSS10 findfont dup/UniqueID known{dup /UniqueID get 5000803 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSS10 def /FontBBox {-61 -250 999 759 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSS10.) readonly def /FullName (CMSS10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C295470093CA270C4488BB4EB864B48 63941B9739638D2E6F3CC778582B46AEB4E466D89D1C211225274356A4BC90F3 274C6AA56E200249B7D0949A3FD4185DCB3E5286910EFD7CA72D5D8E8052C96F 388D12094B87D3705CE64459558CF024667C0FE96CBB32B0BC9E51037D7BD62B E4B05FF99384E71D78441A79B0B1DBA1CAE02434A9FAE46596FB86B873B1670D AE0BAF516445A0DDC127F8FF3ADA0B10EC30A9CC1F7E9248828B5E8AB46C3FE4 154B80A54128A08777F5F9B8C519C7E3B632B3476F007FA156E9F39FBE57638B 4214CD2BA79BA9DDA0F4C073AED814ABCCC2F7906C57A872C00E67FF03AC1200 29DAB92376422FA21C67CA98BCEB8C431CA2D3EDDC16972F84BF6DB2F705BAB5 CAB39C82D139FB1304B9E7BF1F6FF447596081D5690B1519E468D6BE49C329C5 C9C809023EDEB9DCE4A6D52A8049E0CC134E8B41BFC6558CFCAD3D9D2773EA16 131567AE6231B3235869767A1E7C1FA6C8D6FC1B276CBB1CAD14D376188C9682 302836A9290E587D4225EB8BB1DBA2C4580A81FACFDA197174FE948CE757C575 F23070FD84DE121955D7D9307BF986C5E739FFFB6CB76822C341FBD9FC2E3378 AC9332B40C07D5B8745D74E30F1D719EAFAEDBF5FBC40D0546F69A66072D8A49 28D2CC2E76B9B1EFD191E0BC7510C2C8761BD92EFCFDAC263342A01398A56D18 121A591FF5CD4AD8B25699A7897E60BA940336BC17B9EC9F97C2464D031F958A A3548D0C97C50C580B6EEFD0FE8330EE2BB0D2E7FD1DAE33448953544A4B1C5D 8EB57798D0ED4B22909FEA78ECDBC4D8A124DA05B9999242D68681017285A0C7 69041C1F79442279FBE328733EA0A6694D68BA89739FDB9297BE0CF1808C07F7 BBF6F1538DFE084EC8C0EC24D883F6CC08A51DFEA23EE920F44BA55FFF58E960 C7BEE551FCD2D5814DE7E3F835608073C2CB80EC57100CFD484C837881674E92 B217F4D11165427DACCC29C129005874C05CDE5FBB2D912368EA2B98C45AEDD8 8A0D2493F60EF36809C8C6EBBC7856F6656E8D398BCB29DAACD4F7D4300A0B01 161CEF51195D2C58DDFBCAFC1C03F49304ADF02789889826F1E20BCC14827565 F2A45CA57DCC61B52E33638A0C6C5A59B145E82B82571DF1806EC40FC0E8634E A34A791B1325571E19F3AC2EF6FE68A14B0ABEF7EBE0EDA3942E85E5AE967A14 0C5AEBFF2A36DCA8866700CB7082D2ABE470864C44AEE1F6D180D511304C8674 D02FAB12A7079ABF96E1CA3CDF9D75532123E87663B1D524265AEF63EB5C2169 B67A651A101E1C7EDB008D3DB06DB1FC1A81B41B291D6C4A58FB57989FFCA434 DA84B3914D1D80B17AA3A55A70BBC06C49DD5F7DDD03FEB0055088558FA192A5 261477899857CF598DB740E82D035E84CF17B33048CFED2DCBEBC2B75CCAEBEA B6C5AA1C6978FBB36ED98D9047028360ED430A0AA69AC85A8F83825EA649E1B2 64B260197B06A24A1DD969CEEEE136FB046D713D0630B246BD41CA285F076038 F7F8431913BB9A3E70311844D4C22AA446E3CA217A9DFD75A898997130269B29 AD4AB7D9662856E677FB2DAED7078639CF31C6E6637C74DE2B5D0ACB88BD61F3 CE3C5D56D3D4B3EC1ACB33EACBE05E53A133EBFE93CE6A0CBC8F24BDC5B31BBF 5B3E55D6B40B1CED389076014667E28BBBD60145A06BDECEE8011A2C6F06D091 73767A8045CEF2A110B614149FEE783A2351FB2938A9F73CA406538EAD82ACC5 A3DFD3DE00221E1B4EA977AF8C89661357FF7D2F1FCEAD6CFC9D6AD81F95100D EA1F328249AD84AE849220E6593D45015B4D7C9527F3063E9F6DB6E572092A1F 1F460696227D5F0FA5A5484B1F0D8B4A35066451663BE448D924DBBFD388B6D6 D7CFC87C9E75B7CF79A4C9207E29E0BAAAD7FDF529B860F7731EA978E335334C 13CB2F0A4250F5957B44CAA0674AE8356F586A24FD137103973B9A1FC31090C7 C84DC5D380404BCDF3FE20C6F74FFDD8BD1DE845E99DC6FE09931F003834ECC8 08C5D962070B6C44F901A787CCEF048A2C584A2285506B4D4E82B1BF130E2220 B6C8B3240A4CBBCE16AD3676B23A50B75F82CD88D1B8F21D30A12716426112B3 23DFDE5A348DC9DCCCE5BB5DB5433A5AC125DE1229FFAAE0D8319B2929986EEA 56A93BA1FBDBE617F30852A3DC8C712DF674169C6D656F75E252187A085B2788 2467CC4DB08D48EE6A98C61BC55E6EFB1938FAA718802B7587B94C8F1477E9BB DCF6E02B5E67FE3AD9D87C321CD9BC0CCD36B9C4BC601E6BD552EAB8E1C940CE 3A22F3C2501C3C939CB4F17CE97566F0A04602D2A22A05CECDF4A49CAFD6332D 5870E1F31AAA5F86867F71610CDB83E473B9D20BA00D8986D7148E0EED03865D 9622864B52B09D12E0C5FCDD023D29D5AB1CACFA92B6FC14FC84E95F407861D5 2BEE3301AF399FD7ED04DFDE6679A345A282E7FC08D47E3FC8969D3B00ACD7B7 F8769647D6D4F4106340EF739583374D023C2702C48FAC1B643B5897D2D7DBCB 73257712A0FDEEEB98A021D218CDDEBBA34687E23C4828D7F96D1ADDFAED7EA5 B279322E6D55FB486AD8F3A8E7B2C67915564FE56F0C9277A06B29C47FB7D007 11AFDDB3FC1B173B4E449CC6B198041CCA0624D81B4840FE5B63BE72157AC6E7 03E5E95D2E2CE2E40BCE8044A8F2AA45F855484A891B9F0F8F70188AC66A8DEE F4D656CBE216E6D9AC33BA8DD0685D480833E1226784469A221D9FA3CA600AC7 5574B5226649A9C48CCB43339942FC9010F86BAA2D181AEB487A92A96BF2EDF1 60F3B93FDFF4137A25A8AEC5ADF8613019CDB103DC4367EF3D8AEB4FED0E6BF7 622AE0CD3CAA0321D26CA4280CFB60D08D9560AB8AA5698231171B881BE9A27F BDCF3162134126212C523738D221AA05E31CEE73D9D40F73C450B6AE2C1E70D5 C37162BDF55943069923A290A6C720042566E55A21CD81C460818883AB016C16 8FCCD1255A66977DC1C110261D7642199D466DD3D2493A2D47694F842241C474 1752B00DA03E69CD16A8A14BEB8A431A315D19A39BA978E46EB1189089FEF647 F9DBB58AAE6B3FBD475E4DCAD241A051DD100ABE81D40ADF18A4C50F53BF749F D6F7C8E02A5665B4AD18DDAE79096DD447F8BD32C68F9F97F05E0071D9E9AFEE 257B96D48ABD9920418E17C8F027E9E975E4A08DFB1988E7104CBBC1CAF356EA 7750AA7110BE116AF1BA69A94776E4356573B38472A8A1292C63701543B0F315 611A0E0595B30424A1137478BA6F990AC7C3AB4DB69E75C222B617F373C521D4 246E954E9857AF59D1E6C36412B643733CF5E1C90389EF0E5E0DA55D3AD12E97 E7630C315F72A03CAF22E0ACE3AAAFC1D496CF4E5ABC49C2DD5E264BE7EB2698 AFF36089B5DD2C53DB1C1FCFBE1E89D41A95DDD278CEB29DC85FD1DB8B83CAB1 EB37C531E9BB8466ED6B8B60258D3C355626CDA43A32834DC89DFB11E5FC6D68 0F78CFA871113DB81A1690250A6F842ADA15734CB6DF7C6ACED6D8D586BC4E1A 94EF3052FB0F8B9454390B882CBB6E135AF1F9C777AC362C2A758C3A98117120 73C6E2FAFB580716D4B2889A4331CC658AAE996245685B973D9C184541385680 AEC2956107DAB00230FB39BE98D3CA898D917E5F2088F26CBA4F8B5B115B6443 8753331233B10852702FC26D9DD4C990C13CE4D0DCEA23D62A826A4B4FD16070 5F3638C0A50A3373A33FCAA6F3644975AFD0560EE5F2D1CDF08820373468E4FE 6679A229D6955CFDF7ACAA92A87E6D8571AD18CF59F84F88A674B2946FF20A28 B9798EAA22442415EB46B9498DDC0F4BA6ADD347AB43E9293CAABEAE80127378 129D5DC69F6DFFBDAFA5D65580239E8EDF6833D0DE6DF75F0FD090A83CE0974B AC947BABBD1B1C7194DDAEA37B0CAB477ABF9433FCE0243C8D308409427D1DCB 8EE4FC36C7E5CEE104904B520B3F6E677A5B92F694BDBC2C799991667E0EC14C B95EAE7DE1854BF4542F05B4AF401CF67FC3E46EA5A0DC362F3CF177B1796DA6 753AA803E724D1721DDD1BCB0C12CE0859E172D2A370C3697286F80D9E138AFD A0EE016805F847BD30D11D8B891E54C77AB51A7CABF76BB14B06153C7F811FE4 93FC4B7CF161051A458EDF767DF94F487DB939A2740B4242BFEE234F75084DDE 207E84533004B933D43C712F0C71DA4A00FFD6D721EBC93AFDC4200E3B8DE433 3ED3E1DB799BAA27548ADC853AFF5D9D6BD92D644E3CF394789C99D9DC054A26 7770AF5DC5BD6563929AE11BE341F036584DD573D3F43D9D975201EF77BEEF80 D1EEDD1D4AD5D4D4DAF6D5B9D4C1736CB111D6FC74C236779C0ADA430323A825 09EA8D0CB1772220AF28B93098BDB36913159208D1B2D7ED45808BF7B686419C 5C0E3DAB5BC9830FDF3B494D624EE8068BF6F5212BD69EF466B9A213047BD105 B848F056DC544A8CE66C546B1A4DCB4BA29CF0EB4DCD9C2452F22172AFF33B29 E97E12D8F0D312B03BD9E5377BF0C81D884F1E79DB66E8144F106DFD2579AD26 C693C5B68F3AC46BF0D6281032D4D4BAEB2243151AB1AC0BDA2ACDDD4D590C90 F29B335DF8F57DC593DCC081FB56924028E3161AC4865B49D1B0F63F5EE866D9 7A71171C09B09A44B0E32F03494D9EA63F3C89F5E772BE25A6557F119299E989 99BA041694ED805AA4F3BBDF00D88171C9D43A9085A287A36A1F0F9386F2A98A 96815CA51F06E1CDF20B757983C5FDF4003F5438232159F325C6335B734FD982 1423BA77D0EFD044381AFBD0704E3DE95D23A70E2428E9AA355A9A8A25C6C74B 48488C14DEC93A766E112D74C83576ED355F17A809E8D3F9C65C4E3E14EF484F 4658DFB57597E2A4461D8044E95844391C1275D63F282B37888C842A5151937A 45007547263D70195ACC018A373D498B88C5A028BC66ED96A343EEE74D61EEB3 D9472B6A549CEB8699F4B35154A0E2ED22867E4F9E4A76311EB2C9F9078FBA81 838EA49C2966BA64C165434DA3093206B70186BE80600B891D9979F730FDC794 5DD6D8B2090CC67A634B719F441092A10C447A86ADB78DAE45823ECED5FCEADA ECA52E363D913D9EFC0ED98A5A1F823DDA3350EE27F09C14E4C7298CC0FB6200 DEBC640C68C82D70AFB7A7BA668F1D7948686206884736CD03D9F6E6CF9702BF E3C932CEF3CE07FBBFCEC0476EA6E8D5D4C5C6450C8FB236B89BB82D51886240 5BA7462F50A88F69228DCBDF26B7250E90B3DF8E94ACA1CADD9EFB5C73EF9DD5 46052314D445CC92512BA231F79A09A2F0D91976B160B8C9BA055DA4AAC1300D 491193EC66A6DE12BE01EEEDBC3A2291DA1F27AB76596A236B75E19FC5F1FB6A DA1AD835CA08B6CD03B97B4CA1BFCBDD2500BB09F1A1B0438E4A759370EFA318 F062BA9F3D352572CE232E6FBADDAA5363807D0DC5320B807FE5485C8CB09B6B 0BED9F5B1300FF370252DEBAC9DB25CE2EC494E8EEA45FC6604B3C104E81B287 EDD49F3D7430EC9176A16B4FCEC5DF68DCC11ADF90BD5337E2E4B59BEFAC8298 E5ED2C7FC5928635420FB1955251932713236DCE28012C86F63D12AF1DB634D0 0B8CB8992B8723548177BD6822A808FF221A9E38B0DCCBC1F3430A9BAEDA89CD ACEBBDD8CCA5E17F1CC37E35A01E058BAAAB6BE7124314DA19962BADB74EE73D 8FB13FF6AFB6FFF97926CA045B62B98BAA753AB0FC78B881D3FAFF9EE2FE918C 8EDBEF87637F1530E3E13AC090FF81F4136E08D5F3734327E643CDF621278741 A17AEBC56E21217888A6C8B5ED4269731910E7E25693CFBDD4EB4A32698F2447 4C45D73E810B627D8719E4E34D8FF378F9B68BFB149AC67B3B1E55F20D097FC1 AF74D46F5A3923C63DFEBFCA210F6B257F5FF3F2AC34CE41C15C9977634E473C 2235295C05C3DF6B3009C7854BF11CC87471CBE085793AF9C5D05C5479B9E780 14A5A6F3F6DDE5A18243DA15732CCF26ADE40C566DBC3C62B71D46DE87A12C6A 647CAC923254E2E74AF882DBD5C9E108A9160393C5CD12566AF7C824EFEAC56E 6F05B92C73A76824C5ED1735BCBAC61B98D509250C854CF1500C212F574D18D6 4426B8510FE9785B814A70E75C9234D42483E736D0689D3561E8EE5650F33A36 D50127589401D267BA6442E8616E2CDB1F6691D3FC4A2A377E5E154972E890DD 60CB463E9EA9A6EA61087DF452FA5646F69BE879337EAA0F5DA4438FF0365627 4E3B16851C2F08E976FDA27AF451CCEFED00376FC3D6E0C160F0BC19544DE289 BECEEF9A067FD71D54DA3A4F73F06E2F522BA07551296214DDA47B1BBB1212E0 1100ACB5F65FD30C655A3402C83058F8ECFE48FA60B6A3DC86C4996414130194 6676EC7F37454023AB53E9D9EE60249ABF6953E76DCE3123DD268BBD492412BE 65D7C3E5A5E483C381182A8F19B506F0AF6DCD55532B89852D1D96021B22E9DF D9D072BD7DD4450577E658B433A84F92752B260AFA2EC4A118747CBFE36AB7D7 6D5DD96A119AA1BDD0FDCBC3AFDAE5FF72713EB46759A06CD09B5CFABCDAB0E9 85599506AC07AA525978AB157496163AAB387F079EC9FA1F9E91B9C2FBCDC9EC 7027D77016760539AC03F1C1DB242D28D6EE946C42DD2262D82ED48C3A839853 BA977046F0EF373AFF884AC3112D2FB319421C3165DFA5710BFB9AB9595A10F4 9D05704B9E22137CF27F4B2DA9CEF6D8801D5F792969B2E58FB539B8038DF440 6DE20C0313A7BCD16F279290AD6859B0E657CC3041C7928CAE35B9D3A681F2A3 2D40F8EDAF1127E754276556C95E1282514B6EB6E43FF4F0FAFF28C715E3F39A 374415B62C1F5F8E31E006D6ABC736057910A3729AC60360CEE1B2C8D9F77336 39CAC45329A372205FD551B9E9EA5082411207473D9D90E76136AA70180172E6 AF6EF3EF6B38B1906B904BE9BD5251EF067738840C28877659B649C6C4CA328F 1BEF8A9CEC2CB062702F58CC0B8D2D097FBC278F9FD894E10ACE1DEC4530CBF8 E4E467B6DB9C596DF0C3D43E6AD70F30B733EEE692C2EBD68756D0C16E1F00B6 AD011B5DA073A769B53C2DA2E7C9B7ADC6F551BF4DF4C39C66443692C3DC62CD B1E094013F364D04BE2FBFCD1C7B2836180E9022E0434421FFA4317A50096684 CF0B8740EF680F27F4A84AAF2AA92C64883BAF57BDC60C6467A8D4E09E6316FF 9BE73053045E5F3586DA3BD1298DC15D751913FB1E72EF80047F6B33591B97D3 DFAD34EB224D64EF60F5B4ACC6EB42E1BE0CB2812FF2F3C264AD2E44F5EBA441 670CA0A60E73176ACDC4E42E74F8F489C73481EB5D46A61FDA1C0FF9F8844DBD 99CECAFE2A72833E4522981FA13713AAFAF8F121E60FAA6F379B2C8874CFF23B 8FECE70654E5855E525A403700A96CF7F8111BF2B58386E29640D82F1DD86900 E0E203F3ED554209CBDA2A61A5641D4B39D98C5C43D4575648D06BB82B6C4D4A F043EC61B17C208CE8B4F43A7BCBBE588A3D13A183D79A47404223037FCFA4F1 DD237344E589F161BB9BBF3FAD2E28749350DB9A74C09E894BBCA85B82E704E2 99788B24642A7D0F0FD96601CF1AE4819EBECAB89824A0DC1C03BA4B546ED36E DABC8D49CFAA53D2A9A5DD6B3431E364C99ED0323513476CDCEE49BC413E50BF 51EB93563DC03B62F84C5F96ED713F288D109C79179AEC41424822772032035A 40E84014F5BF40948F05E8562C9CA9DDD71F89021BE238E74781A92D64E5F9E5 AD6C0D954C6686C714BF189E78EE47F1530CDB8376E52631A1A26E3021FAB977 DBF01167266AD68A779C0180E034A90CB77B86747395BE885E484BE4028B4093 8BE191D58D0BF85308C72E6384292A2E1CD06130A091F8AF9DC6C3E12B1E4BA2 BB2C37AB4AAFC0CCC7964C06B9EC1C7E3BDCB6BA265288D9C8625EBA35BD2A49 BC50472D7AE262237FF1EA8D9DEA3C0DBCF7C3B2DF5AFB1F31E46B48E096517A 0CEDD60F43DDB684BC6E4C3F6F3D70BD58AAB5052936EC4ED7140EDE795223D0 4E3B95161D16B0402EB45FE97ADAFA0433FCAF55E22BD7E4AD2030D9DC86F55A 8D7EA00901EB1351EE8A0F1BFE75CE46DA4165D78043F8F0741D4D9DE0CCA00E 5F7D89A849AD0F0CEBBCB948613028CFC39617FE9184753372C375A9896F5F1C 7E24255FD49D2109CFF9ADD9A118CA47CF58975A9CD3A960A8A08A078B98A50E 4DE619C8B2D3E15938C879D785539445AC468AABD6A6576AF0E8ED368A9350EC 717B7D3BB55AF58941B47FF639CA2946028CDDFDB84FF0060D330DCDEDF13BE1 FB1F743317C15C7A9F34408F5FF7CD9745217D9B809DACDDF7DAF9D821C06B37 25738F0D20F4A86A079EDF71583A9640173B3EC529B98899601F0EBDFE45BEF0 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.0: CMTT10 003.002 %%Title: CMTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup /UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT10 def /FontBBox {-4 -233 537 696 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /quotesingle put dup 34 /quotedbl put dup 35 /numbersign put dup 36 /dollar put dup 37 /percent put dup 38 /ampersand put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 64 /at put dup 65 /A put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 92 /backslash put dup 95 /underscore put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 125 /braceright put dup 126 /asciitilde put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB 556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F 8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC 56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F 15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD 04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA 4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D 69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A 0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C 550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A 9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F 7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A 2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE 49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE 484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C 6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F 5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C 1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F 52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B 0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC 2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F 0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D 67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC 60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F 1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D 55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C 7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E 75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB 8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA 6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD 4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD 2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE 97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF 639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A 5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE 5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A 288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E 7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F 759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E 03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A 6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D 906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE 251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 7329622828B2785C1A8B26351BC74237A6BF99216652ACBD4CCF54CFC8AC72A6 46342F1E32D4318E7E27C7B2DAC943B3E72C472FC6F1DDA8684AA922516A672C E969C047E318B5E3B1270C1BEB1C4071A15BC81B29B268C679B41FC5E381BE33 DD95F0D68118CBB60C521E5CB2BA46A10E50E9238163713290DF6DD8A594210F B5200157C0F02340FDD61392BE9B0D9C46C1A0C4A3AB05918672D6D6020D3A88 8C18A08AFA6BBD8A513A3C06A29A0FE923ADB6F9996F3516967E5066FAEDE5F2 8317AA4F40CE23799373B747829904DF9040ACBB8C3F1F444865AAEA85F7B91A C0DFED8DFC14579771303207BE44379760DFA62661A505B9D7EE626DDF66EC81 DAB29ED969A22B385AA46773CFDEA40371B01D28A4713820D615BA8AE4E63D53 09E361BCFDFC60A29D8900A5570DCC154CB3B3B4C114A198A8AC748A436DA85C A0B7C26E6872AAA76CD3E50A9DFB413BC19EA844F79489880C120B5EEE3FAB3E 8E69689DF8AB95889BB3FCB88DB5553252CD8F6A76E622BA62907353425D855A A2225AF9855F7FECE560A28F1819655CA1B88E1EA0D64F3BF02C62D0497A8F45 0B102F89D7429C99663336E2DFA0AB68D12BB1C155658822947A2038D350F86F A32836B68FB7078FAE07C07ED488B6EF06D5CBF919831D0A982AB1C0D4999123 FFBEAC65B6998158F01376993BE0BEFFF76907B58BFEC47E3B56BC839E4D8C98 0DB119518F8915D1A6BBB918BD5558F69C9F1850B2F22C6239EC18490F137C07 4D7C9C058457FF0757E1E1B9D9BA4B060E183C5342F4A0C6AC4E4E9ECF831631 D050FB71391F336190F7B8BA9B73DABF8ABB73228AB47F0DF36C97338FE0EA59 71F7D55DB8D30F7BD7E2CE2A7FA39B32471240DF4B1D7A95AB5E44EB877C6B70 F9C9E1EE446E7F17182D269F9498F5ED9B057611A51DB53ED4D4715EBC1AF905 87A45AE742EAA91AB177DC120969CAAF54CDAFD4BD944D95597EE88D30C3F6E8 077E2CCD1CF46CF2748A3D63695B67819159F7D3AA4123426FD4AB3FCF34FB77 81FBE0356382226C92B9537DF8C4F37383902B4E166714BC4240CDC4A30790A9 8F2ED8F648FE2285E3198B08CBBC0BF0A4DD2CB038B8843685BFEAE15514C345 AC3F565EE76BDCEBA951B61B2480654AF4908C8923D39726092686FD1E3A18CF 67FD1E502D832AE53000DBB44F3EA1568FDBFFE3E6B0DCB5AF093F96AA5097E4 66C48233DDC9133B0048B8C0B0C66DE76D416DE431823060F050671DE9512F87 AEE0411C16286CBC16BBF2DB16ECA9F17F7BE735110A0730772FCD47587C9B9B 56E1317F3671A4F3E45ECDB7329F90BB8D0999EA3BDADA184F7AA5FED2148276 A9DF5619F19A86071309DE0BB4DCAE774318A81303EBADC6FB78732E01F9784D D977E8DED911D30E9E5AEDB3C38D3B5C767E8C17CE566457B61F8E7641F58AC1 9BF6B6C54B39062E819D547840CBF824303534894DF0C0EF517C13C5DE5F7368 872666989F36E5021855C7699D52A0F3B69DF5739B4A10424837F85E1D2287C1 CCCCC90435E278340FF0C0DBC0C3F6AD7B57B980E74A6A34570FF811AFF97366 C69A43226F8D1542A2084BB2D35E0683672EFE0717246D4C8C41D27CD4A09F08 571E2F429E8CEC01224AF53A2D270100AE45CBF205E99FFE74D9C86DBE2FB8BF 4BA63A363DFACA9038C35332DFE2B00CEADA8189E7F3C0DA352B51BFA5ADD0CB 449622D8891FF5C525ACE7CC2C15B60476EA77FD4B311D6C3785E1E7D676E3FF D674A2FBDB9521F08F67B13DCE27A3A718D977F90957FB77168C28BD3BDCACE2 D5AD88DAC3800309E7958B4702CB36A73FCE9A400CC929CDF9447D83A5B3E3D6 119222779410AF291A7CE2C1A45C61E05D8D1ACFA0B426F197CAF8E4E6B8D9C4 7C95CC117D0A9BB561FBBF4148A6E247D706BDF393ABD5FDB40D18CBFFBAEEB9 D547D6C40C95A6BB6C3B4B0EF76E7FDC276DAAE162BDA21D0F909C5A822B0D3F C51F9FA087F96A5647ADCFA4048533CBF78D0F01FCC5E17EF47639E678B2E295 75DA1E3357EAB649B15B905E41347B8B8095BB8B9CF54391FA8AC4F5723DB70E 113C92688F8ECAF17D809C4266E65DE1A3A41810CAFEB93C4335521A55B69A27 12286F33186BA7FDF190DBC423710363405302E9000029A07BA8C9298B27B324 66605A5D91F2192C7A488C3EB5DC770443807638D112A0FAEED7893FF0CE4557 E2E185C935413DCA4E4F709B4A882E9F34A1B13D815955AEB9C37A0696DD0BF1 3E9C46C1426F4FF72AF45A5799330E134077AC03926F8C5451658CEE9842B22F 0BDACDB845811D45F08A25B6B242E36D2A6256537D647B6A0ABEC35CED7380F5 C9E5BB07EEE8B9372E0FA57AAD0A5D2E23697DC55F5A66339D3AB56EC7AC3286 B16C5AC14C4F16926330A6CBE67A25CF925B98CC9178F1C6B4D62B046D2D658F 2F7B698A6993670B485BAB35111AC7B52C4C2234F83C16CF30E00C41B9413108 03E516CE388C1EA4A60BB22903A1449E18C92DEF3A983B84C7B062CCF0B23B68 7C952B12E664666226C3027E1D9A6BA5FC950A1CC0C06A248F9C43DD7BF7665D 5BD50841A4FECAC1191EEE5356E2C8BEAA69AF7B6798D14F84C3A83574A636A6 A3152DEA4670612959C63FD626CC47D247CCEFFCA67FC05DAE62D3526AA3C888 69BEE134388BB171D095689F4A3309A4B36CA6CB9A4F1F1361679A5B4EB64EA2 085D08D714BA158724AC4352EBBA385323726704C9659A6F1EE109FF4F7F0C37 0D2500950D98B97CD94B861D3766A24140007A4E96ECEF638B210931772BA71E 3AA79AC29A51A2B5356E77135010D0DD754C5FD1B4EE704911B17BEE0C2D6870 958396A10E0EB8C5DE69D48B0C749667BA42C25D0D6F49D45ACF7B0FE5FA1932 38B26A7DC6479AAFACAD614BC067C6B07CAF6A9A61F64F1805FF4CC811CA17B7 7504C032D70E116BC5EB64FDFC41E2E2F40487D51DC24E7DEF45FC44FF5F719D FBB7A1BF23FA4C6E847250FDBA59F6B0B132392D317A0E2BBF2F653BBEB6A997 25AFB06E7F85567CA46666F36B298753CBC45CB2C9CC963F31BB23981B38A614 FB66C30E2B9AE16498540AC8170AA04A2A9CC2A0B53B3735112B87A9C9DEE25C BB8E26CEFC4BA8129575F45562C3083A6CA3B313E985F3C7D89B8803AF5BF7CE 2F470FAE63059AE5A0D91152408359BE7FDBB3678E311CAF30776AD2BDC61525 BC992F2BB949CB051B8509620BB404DE55A12ADBC7EC1D6A37C06C395A94A27C F34DAF71DC71F7526840EF5367946FB82578EE06E1D032EA51AEC9DE000551BF AB7D9C40339969EFBBD63AD2738E9178A2F1819DC2B4F825D7F307096BF58937 7808FAA8E3548403038D68D19C0DB464E1E6B0BA27E9D1FBAC89C6B356A4B9B4 E1E86D6F0ACC65AA9240834E46C308D4687822ACFBDDCE3136515F89AE5E98EF 293CE532A3A0B8F548526E34657D9B295240AB8F4F994450D387A3B5596D0912 9E99510856D8F609E378E0273677FD196AC223F003C14C7BEC31103FB0C65542 EF7E99638173A4543C6D27D267C89B89F96486CC198B508997E4E003FB629C91 C5CB343C21E274982FC4AF874A477E3EF5C514C967BEB4F0A5CA8518385DA237 58EA6E69D67D73BBAF110C296686725C09DFC8B0C58F651350717046640F377E EBADE34D396FF87FE298511336119C487AB4A715E0EF65C6402828228F073F5B B11F44ECE88EC27665F93392FB18BB7B712D5EF2353390BD3BA359EF4B46F8B8 8034C04E66D4DF3ACFDE56E7FA7FDC22867EB2A32BB549077A292B73ECCF6569 D89273C1804FC5FDB5AC59F67EF51E4DBE0691314C20B700E9A98BAB089F632B 9B009E81C26A144F2C2CF762C0E0EEFFD986E23C2F8115C6700817DDC19E925B 6B8FA69BE799237D997746646F23567C8940969D579AF405A55DBE51AB118266 30625F9B55068B5F4DD8319E57F8AE3DAC7E5E984BA88B3FD85F8B7DA1E2E4F3 D50DAB9DEFC78CB606563A8942CD83A286F374D46871AE056A9A3137A88F781D A6A49109745A64FDDCC43A4889F77FDA138546FBE8C9CB3C43F998EED6218917 7922218F70B47B7F642551E40191A40E85A585910F464678859A0307C9E62359 4519566BF7F81FE8013A2413694A33802E967FA5D1F6584A24FC9E0758E5AAF4 A52393FC9DA51FF3236E5AD5EEBA0C18EDA75644E45CB7B747AA177C063DA8AD 9CC7AE1B99D9B40EA37AF2256DA07EE4B57C93825491174049FF0321633E12D0 47AEF5BAF6B9F841DF8DC5AD497D6A0A11C8F766B61B57AD1126837980E13132 437179ACB2600FB5091EF3646D86DC7DB5DAF532AB68F05DCB3B3A2C874B47F1 165295314DB943CAE69DA94A86082A87AC73C24B226EF251DD0B65FD69DA2677 17CEF731EF1073BC902817AC4E228CC173BE9510C83C157F847A25DFE18B7D98 3BB096D3E969B397B393D3CC8281DE19D634BFC520F837A93E06D80B4B3C9C38 5C4A2012476356120B846A67E415FD5D56AD92FAF798E1AF9D520B7C6224D7AD 4C317FE096CC2C5991D1DE1E8B37311A19C0D6E369EAC7E557A535E6E1BB444C 773246BE27E77F8A632575E02B6F29900B6B4B0402F218C2CF71D406FDA718B4 F98E16C60FD78B45B7397C233AD7A84787365A3B45D59F25E86850A45B1A18D3 5A1D892A7F29C08499BA5D4171892C085596B5ED007BFA2F130478C2A09A26A6 96451BA6632A15DDB5E1529FBD0932842F34A940C7F772C63AD6C6C6F202CF9C F28F401CF68D0D475A83FACF5244B672C5703BE85532BA35BF373D44DA91EC20 D8665FEE524B5D8DB32AADEB6443A7A602D2D02AD24FA8DAD843274553A383ED 28F8DA2AE485EA69EFA36FABBF93F2F49F1F94F32A8D56EBF13D45D58EC96A75 C90884730D01B24E9ADE96EDC64F8D52291341B8361F2913921EE4652C904158 A43D533ABC3F02370D6DEE6394D8B0F9D3FA2905B67FADFD099BEBDC499F0599 E6AB5E0260E2135B6BFC48433CDD7150AE2D489AEC3BAB021D0F3A40CB855E32 1052EA7ACEE8EE3262B2214F45452FAEA3280A0896D9F0D19BCEA47C4021A78B 5183E8E4433C1C4A1B0ADB7748E9D32470FB079446C68AD25D611CA2C640CEEF E50A8FD12A028A682014C845B61A1443EFDEB56CC91E7B837BF21DADEBD84B8E 329A2B9015BADD72789C5B8728768CBAA533A955FE9EE67A215C814462197A17 896CEB4AA2FA61A214FD1EAC827EDBDDA678FACC074C922F66AB6AA7C72D3644 468022D9E11680FF95101FA8C71FBB5CCA353C59BFF2B316E3EDC33252B7C38D 17284DBCB706778E62BB122BC258AF3E26142CBDBB93FD3CD68B7CB1F54F498C F239C6CDD1CBF25ED3E6003264DA88CDC86A4EA8C978A7DB9DFAF223F67EF198 70CEC16E972EAAD2F2DE6B609AE41BBE307AF31D541B805C5B1B97CA875602BD 639A67BA0EACE6BC66B4CB2AA95B7F4BA6600B5B454DEFD3E22BDE76AE0B7186 E51E687DCA5D15C2A1AB1177A6317B98CF7533A5B948D017C3DAC42B80DCC0C6 E4E6002EE2508C931F54C9D049E2698F90C8A6E2AFE6741ABFA4EB722658148B 517D99DE8F0B5A8B25E716E5CFA0E33700854E538B007A0F30CC13121F9FA06B 7ED1BF728F9875716391322BE397858B90DF545E359F2932DB9D37767E151856 B69B2E1C32FEDA0C61135938430A4E5FC905C6C2933D9666AACE263EA15628BE 2E344595BF92DEF1239B8E4519C85A14A025B1889AEC0BA03C26B25D8EC4D617 F926E44960078D358FE82E079630788395E4F82BBCBB467BC7AB0AC4752F52F8 B85D78805A69F21A4FB1672DE7206523F4B5901FA239E715D02AA45F02EE5FDA B86389694CE325AD416F2EF481B6662AA6D4C2908C0C4B88F56A3C3579838218 53DEDAAA9D64EDE4A70F93C12C1F008288087B11D68689AA2DAA28EEF398DF05 D3716E6D69C8A76BB6E52085378D96202B75B54C323DE3E6868BC760F2F70D42 995875B3947F6CD5B740B3CBE322A25322F5A96FB81071ED8EF6DEA2084D7CC9 975A0D2688EC21591399A18819CFAB3F77FF5688B76E28291200BB953B3387A0 77C0E7CFE9E1A064C6EE9C92D2183CE238AEA7F971DD727A102A77BB3049FC87 D392CF6375AA2EAD67074430AE9E72FF3A1C43E450A045A04BE41F18B2CD191C C2421DB50D8D60FDE9B081062856DFA56D8CBF14260D23B7746E03AC2AD1BB53 6D4B92E55D7FFB8C707544F11FCE8D40A03EA6997A2C253226586B5C3C5D6FE0 2B33DC7EEE8E37BE8CDB35A8305095D0423CD6CD54B2886083A345D2AEBEBE2E 982A9F76CF920B7BEC2E3675B7A1558731D70F46DF7290EDD3A2125667C1500B 453D865A40F06F25D72EBCEE694DCE4CAAE684F98896EA19640DC0428ECEBD2E 04459BA3AB684539944795E76497039C151C7C0B0BA594F2F5A6B0556582A9A5 1711A3938C7156AA311976EC67DAEAB14E5870EF2AC0EB3A7C3D929494DB1D5B 92A3FF8C121C54D831E41AF6E5B96456113C650C244FCFC31F8C6D44E29D8D0C 00CD6E5A63CB1D2E13D91D456D2B0F4DE56558647054A89A19FF0CE9AAE08677 E259808ED3E2BBFE2CF2D1CB517E8151F2BE2431DEBE63447FAA8865703D8E15 A2BE9DD908694FB849D443A46EDB039944851D675AD7120A2EA032282768E96C FE22D022D98DDD5269E773AE0A66A5F24551B05625247D4EF940C6E9845DA6F8 18E9C779F4C2216F48587A773ED69170D8C657965108E67776AC3744F4DEE74C 7CB559E79A06A0277924232C777E5719E3D426BAA7ECB8C54316E842676A57CF F196C49ECB7BD886095B3A2504AF8D8B09C0179CBDC716FABFDE9CD02827561D 39C8FC37A7B54061A4F1826B12F454941C24F888603D8BBE888720E3D7A05DAB DD361B2A4788B3B6ACB46A11E053A0ECEFC2D2E76DDF55ED9FC97058834DFEEB F5BC5C3079EE3C20E1398CEFB6D25BF78D71811D6F4CBF4F0055712F2FA8F640 316BA0F951C60DA65F11B2BD200F308C5F5F7B4A59100FA738C3825520014AF8 B74A16AB7F06C8AF223283811687D07A554CBCDE49EC933BD989F2F1646D6D71 AD1D971823AAB4DBBB7520B9EB369FFFA4138B5CA9F452E68BB320E6345BBA21 3B3DF67CF518904D5889E061793F7757DE087256F2B1EB744CE93FD453CDAA6C B033D843FEED880C86DCB2D95999446093AA9E9B6863DF68607C585D77092A18 D1B887A307677841E276442A79F8CD40AF4C88547188E84D41BABC4211FF4B27 D732CFC28FC54F3E3A20D7CA67BA15FDDA50AC7D849B2F99AFA1D396C618B85F 1D9A1D0655E4AA575F52A20912D6D273EB6C5E74C8B14ADC2A9A0DB69D4C454C F4545246D4782475C0EE917ED0A09AC94117244A49A6B43586C86B2A7B1CB5F5 D672D776CDA4A9CA7032B34C5F65443AA7F0E1001FA33ED4451E7D855C885B01 5428C40C39F8AA4C28470DA47193A64976CD6D1032164D6B4732AEC8BF479FD6 E9D212E4A2CD9038641CEFF40FD0C2C610FB8FDA379F581BC66450FDAB70CB4B 63731B4BE0EE665C9A7CA8000DA68BADFFC7655D225A95D2F5CCCA9391AB1DEB C144F43501777E2D7A8FF001F3B7488DD249C91C5DFF695671892552007011BC 1ACA20008DB0610AF864322CDFF063533BEC228C2C6FE15465724E3EFE80C954 732A01CA8C9B7EECF6CE22478FF00C24BAB0B08C3C145DEEDFABCB494C488BA5 EE9C98F011E7B14C6567762F38233340D1F75F058A4977C171B73F6D37125422 6CF4255F48E637ABE5E517DB3D3C578C86CDBB60944045CE72A945A2B366746C 317FC935F52FC8C8CFC838DAC4E9C78C65C441330A856E96AE77BECB099B11C3 1DD9769C6FFF5E20EB0B281B291D2A6EAF25B44775CA89CD90C5DAC46F8BCECE 44EE7C1216FD7C77A1D1F7C08B36D1B0F782B6394427D9BD60B4D56BA077E30A 3B2FE5D8E03AC2B8F96448CDE2D8AB1BEC9B0D65E271CC036BA1DC8D789B4D03 1CEE2A0927F02C6BE646DDD08189F3E0A524064D833C9E22C938BF0C12756C91 B6DC683B3DD84D7037A7A55EB1521AB407EC7D263C22777F338931442D03A6E5 A58B43CDC738FD79095E38E2713D690CE895DF30CEE3423BC5A318998CF01CD1 69F0DFE299DF0D4D39B1AD447611746EB95DF0B61BE3F12CC5747A3C2156E9A1 D00D4FACFBE9890DE9EB75113677469B87BCC63B1C84362644F84723738E1B94 C302697EE6A0E6106FB7D4471D63EEB594C8E7164D32784CCB3E7B41AC7A94A9 DFD88F18FED147AA93B9C03D4BC1BEB658255167231B9F444D420D6C496D3C79 A51B79AC14AD401C75154B82688678B0798F03AA06D2B94C2FAD52EBB973075D 692923C256BABD30FB73C981832AA802FA265CADF25A6260A83D06830C62D458 E3A31E5C2C5C5F344D5B9B46B1D522FED95E16B538D446750B73CBDEADA25914 99D21886117F8C05421FCD91A5696788F9CBAFEA052DAEB327B18CA9CE99B9E9 C2E9C25BB0CEBF51AC50914ACAA55187730CD372A95BF9C2384B68B03E42E94C 14B5977720916D8354A71CDCB88DC960E09FBB475719114C0DA6D1B0172DCC46 AAFFD570AB8F28D66EBE3559E44E1A4A2474711CD7DCA24EEF1F0AFE8E19D482 FCE27F7D4A088DC03BCBA96469E0B9C9707BCF287421A21C82C745199A0236FC 411858ED08A120853118832FCA60E37A68002D86C128E86C72A3EF8A138EBEE7 E873A375D35BC9331F3652D54C2FB7048769B75A0416326FC6F4F62D58F0F748 1F4AA88FD1EBDA47B94B5308DD96E57AAE65BBA5980E6ADEFBA39AE2DE37FAEB 88A8EE7DCC3D7177CD7D8599AD5979F349D3E57228AF45404266820957C1B57D 7FA8CAB2EA569D3FDBFD52EFFEED3F53F5940D119687304F7D509CBCAD5D7105 8469E7C3FD173634A01961F7107223CD9D1EFF17C2014563E33BE55387AD4619 33731809856A27302DCBB93A0227DB209D2231DD56299740DEAA39469406FE28 7C9C95F27A2658497CA8F290FC918FADF43304533BB8D4343DC9C3017B354B5B 67536405572286E320D6DC80BA2C6188BC863734738A08F3E52D00AFB41D21FC FDF2E0DC9DAF1972B4C7202D2222A9A665D56A05FE6A27068871D47D2112063F DED663018BD566562D67586B348EA0C87C855817547A792CE8656C3DE7A9B255 AAD9AE1E5DF23A785E6501B445D053455A4238854D80550BECF290ADF40FC66F A6F147B2E645AEAC6A4C1B55B732C2D96CA36AEBDAE49D8DC785536836FF9AA8 7A49D93C5EDD290821FCC7A4972E6EC05CCD0C655083AC6013A32BAAA9F77AF4 DC2F401152B61D83AF76F0EB2AA79A1C0608C0602D70064795F2530CD2C6BE39 FF3FAB1EB8BF702FB429C467AD92C60275C933914ACEE5311966B52A6D215393 623A7F4343AE964672730228C0906984BACE1E952058F7C621B05E8CB0536AB1 2BADFD80EB0E19D2B15A9188E19CC248C1B9738AE0A0F65512441C528AA48EA8 6CA44FAF29A82CD5A4E2F20D53B49B3CC01F5D8A45B29C60DCC64CA9840C1967 297128499B63D72888234B8B23560D955211137FC4698EF366588887CE2A9CB8 EC55B0E33EE777CA71E54912C856A491DCD681E9E760BFBB191C0BE6DDDE957E 95FA2EDCF9C969993805DC81554B5AC6A911B7AEBB801920557ADC092B1B3AD2 9A9CDC62A4291FE1DFC7E967F6DECADCEEE9C25188A1C3DEFC5D75E1F48E1014 DCB521938D1F4F49802AE9D44BAD3893CA7998BC3502B9CDCFCF343578EDABCC 4C9802A91BCBDE642040CA61533F593750D3DA267DDEC93D1CEA273C8937A4A3 5B048D8660E3974EB5A84F5BE6B5169A92D1A317C0E04FEDD6C3CB76F23C8485 EE0C71CDC9CEEC0BB0764DC455ACAA4C901EE933448E0B8CCD3C4D76F808B4B1 4B042D343B91C46117684EF11790CC849F6C45FCDD9A16B2994C6137C616ED2D D7E4C711CE483B85E9C0B7B4E819B7B794FE49D2954DA7FF75781C5633550B78 62306F1EF3C8D486571F08E0134DD52FAFB07D031C7DBEC2ADFEB32501D04375 4928636554733E013A856DA93B5FDF05E1331318806FF987F7E06D8750A31200 BC9443B3FFE715BBF55A6C5E200BE986BD4E7B03C68CBA9FD5227BEF07FB5876 3E6106D6591CBEB7BAACA1149706294227268CEE5F33AC492A9B7D2C9D295015 6F04B9C9F2A10E7C15FABC4699B985D8C498234800BA5AE844C726EC04D1C7CF EC8F7CBF2DB2D401A5054A157AF13B9897FA38949B0C3483D3FE42AFEDCC9026 51BA4661F432629F0DC764F4C1F335702413040B7CB5ED28A5B5D3FDB8500AD3 0DA4DE1F386E7210D99F16B7D5F83A4C86FD1D4E42D1749CCE4DA44A8E0F5877 8C6DF02A161C5ACDCF1DA268C260B4F8486EA685762DBA00BCDA4720A4918E5F EE6A882AB82C246DD983F47B565DDB247FF8758AD36E28A7B38BD9C05EC9653D 5917EB42474488B65DADD384CE0657C7E9FB354CEB5F16AB730687AA728FAA61 EB9F206EC1B8B2A81B62BA364965F9917BBEEB2162B7EC66AF430758A5DED082 7812A0E990FF04953D84CED7EBD1E5EFAA339D1641409189C3889C75F3860563 B2676327EC212D6F3C42A92BCCCB0BC4D0931D93F11EC1C005C40DC1F4D69592 459198370378581D30280ADF4205EF35E93EF2B4A6FA63BE261FE616F71A9277 4CB47DA50E790ADBE8C1D3E99B1A22ACE0DFE03A6B7BAE7A997BDAC1BD2F24D1 06146CAA92CBCA5E1285AA10C9C7A0A7715BAFAECC70DF0F63D737C451C79BCC 9ACAFD1A524AB288B3E043EDA5EFF3BB9B11415873C8862D75910A48E740D254 FCA218414010F125C746386B76D6D7969F564B926ADE28419CC267149A11CC68 558FC5F937499CC279F6936448B96BEC5559612005EA12E7D5241A20BA2EDFD8 60EDA79A5602BAE64B5C89E8D5D8E68424E03088F5C27D86BA6C3F772A031977 88B5910686628A3C5605B82788C7A1AEE0A56BE808FDC02FD7C773AB2B3FA589 DF19A2327AA783401ED6A5B57584D5334CBB529CDCD3308948E5BE8F31540DD8 0E7AF674F0759E2E3BE8DE108C0782373D67FEFBEB5D08F0E3B75EC243CFBED1 63E4F3D41AAD3201D17DA0734454E6D84D87E73A0B681734D128B348205C8CC0 8AF2F6CA3FBCD06D9E4F3B82C785D095842FE3C20A84D90E54C50DC36E2D03EF 29EA42887FFF0319F247C82BFF6E637F2813E77F3EF652A8647AC26980838D4C 645715EA135BC60A124C470367761A015547C947BFC05866746A93C08CB5E9E7 6E16138666116024555BD7E1AD75A9786DA48676B45080273F30E8B86497A874 A2A0FD2C3CF4AC280094C2196C7EE0244A095F26B8BD1759FD74C5045F70C976 49A11F7CC0C779EF2176233831386A282D35E11503D699DE98B09956D6C2B355 253BDF86FC1BB235B2AD07769219D6C43C595D467B5DEF8A263204E6F5A73E29 35AB6B8B73646718C06FD86C4E3C7AC6CCF340AAB3777A0C2BC481B77136AA8F F376E870F2745FE8B9D9C39F04E5A4B74FCBBE97B9E157A4CB7412085A38555A FEB904649942935D2486FA0186F9FC2F2CA41A03DB1801CDF51DF00650D98DB0 74A000E73931215DCFC86803C4797E5ECFCE93A0D32BCFC2F206CD43F2B82202 19CFF602256D490E1E9683E331A1486D173634D5274D17C677C4A15CBC462D40 5B09DAE155F68F2780E833655FAF9E2AB66B70228EC84D56D366B11C4B893728 2A399142B2F13B509DBB1D01B174BB4E2148EFE03BA1D9C92DF363756304B125 5A49782F144DD9F5B8EC7D0ADE0CB39903A164890171122CB7A4349B74A7227F E3A5F9EEB2F9D545DD36F0BD277A3C4045A1E30F407853F4DCE2295B2E7C6FD4 E76340696E959E969A563098D456AB04C6983494089698FE4788327B3FCD8593 0DB2C8B14533BFC18B5540A0A1399E69CBA1602ABE891BD0EBA28BC85214824E 939267229A6736A32D6286C7FB2BCAB366485D33D6D5983EC8961A4B1111EC1F F9D460E2DE1A3A0CE546897680B234D355848584DEDA9A8D74E81AD31E37A358 714651FE1E1760138ABEECBECEF9DE4EBD7C0CFCC572117475C8094380C53F0E ACF9D3231B77C99079E0DA6EBD6486F950DD7653B47AA79E2A87CDD5763C365A 08DC8EC3728D141F3F60D28BCE475B28C148E3636F0BA7024C4B0CF22697FB98 9F6F4C614D7878C9C67ADC057F55A4AF21C194C404FE4357D825769A7B2D3936 FCCE813F1CF7E5D90503360F1941FAC5C1FBC45AA88C9DE9B0D6FE0F354B0A27 99DFA558E561FAF5E4819D66EB8695A1FFF1F29AA01E86C276A2495019BAC61D A48A8113456164FBC33620206DAE974B8FD72BCF1EB78806D65E68F662647D96 CEC16BD5F1681AEB0B74BA40F58C3D8E548750A9DDCB7EBB267438FCD5CAD62E 818B8C5BC4BF8A0E60E5DDB624CD6E1E4911E7FCDB90B9366A74BBFB6C0CEBF2 0CA6269BB13C2D7C57A171F3AAE4DEC34FAB811C9C7B23194C44A708633A0C62 E941D8F96A9307BF3FAEF5C54C139281E12428E25C2DB824D65A2355A9EF6471 51F5ABAE0CC085E28B7091ACAA3F03F71374EBF3E2E7F15CADEF5B8857EF0D1B 122E93A33B514ADAA93A94963CD662BA1A3AE4A9E532199B13EA476BA320AB46 EBA4CCDFF11A6255521B793E207D2556F424C5D48FAAC87B6A796910F6BA7E45 70487DC0CE0A23E3A674C19CA6F815C2C7AF8DBDC0FC15656C597A9B5744D520 5A6923C7081B086CDDFC875609995161ACCF071648863820D68933314748792A 7FBA3423190D9F9702E3D942063EA44A1D032383ADC9FA899CA2C2DB2B7BF7DB 6088CC8DB8295DB89B503FEA37C02DE4465470F00F78826D969AEC3B267F2BE4 6CD6DE403D95B4249AA3435151554AC5FF69451429614DC0961C915D71A75774 5F5FA680D3FA356FECD7CA31881722EBE6CF27FE8145082AD8D36A1CFFD7B92C 29C424B94677EA2E352A12B3A0D5C0F7B5DE3EB15B1079CEB03DF3DF5B533E45 351EEB4F3A7D551C09A451446BC9C02F4FC1662FE7D3EEA1DE48D1358E551F98 C937FCE29D6951B2C56CEB4F7A2F35FB2A9791B329BD08B1A6C476E84C149D61 04508C373A7AAE702EF2D3A4EB9528C418FE7D468AAAB6FB66D0F948A59017DC 4B064D77BF335721FF66E92763B61E61E2275C351E2D2B2E9A8124AA655E1945 823A8D797B6D3C03E13BEF6BE366FCFFE146E5AFA70084B2A23DE8967B8E96F3 E0548EFC23B0A82E8551D7425F36F78B4CF5FF3DF3C3F81FCAA9304BDAB25288 BF9C29A67A015538C061948222C7822D379C79B1306FA0968AFCB4091FE0D0ED A711B9921D0CAF085ED66BE9E44886D751230279E6DF3D49EA95E1D62FA23DED 59DDB06BF2DD7C7850ABE18A85A5D7F270FFA225655EA6E758155477E1185812 08F1AF1FC01C399F1FE5AAD0C27B860831F78BEB1A108486D15942E601C1D553 7D0AA121618AD33AD9EFC7130AAE96B06487C129E5B3D1AE6DFC66C26B1DE16A 0C70BEB32DEF6980DAFEFEA33FDB19DFBE869790AF9D7B9858FED98A5DFAC419 D520EB832F90FEBEF6A6E6F9A97C3FF643EB8FB296E50053343A0AA94467563F A8E453261AFCF74840ABC1CEDF20EEE3312DDDE0901666F2ED0F74476476CF42 B7AF40BA4BCF18F8CCBCC181F79717DEA54C7F37D97D22AF356B58C2097D97B8 080DD5AB138F809115B951E9C44A65FBF0E2533EB712562B9ABF43813C9B98D5 67ADE56DB514649C3C5E87C8F166C1017DA823294445952FD4800CF5D3812BA6 A0A50F909B6C1BEAEA099442948FC8DBA1BBCF92179C9C5A5D2C2B62F65F23F3 D684A98C41BC038AA6924A7D19DEF3ED97D1393377DCFF3B5FB4E452124FAD88 8414280209E35F0B8FB9CDF4692E4A09DD3AD64FE16DCD4F46D410892070D5F3 CDE469B1F5F5248B95FCA1BB35324C5A54C2A60A999680D14044DC5215D8D414 67A2CE6480B4F0E9A383ED1D9A25E5F222773CC4117943639F56175362574C4B A5E40392EAD985C9C300F2B0A0B2C46F5C089972BDBA399D9AB39C5F269B7B23 1F5D9BD1C9F866BCF2C7D387856FBB43D9B33C9D39E9AC646F8833667099A74F 55CDDCABBAF774ADE7D21225AC6D93564FAD7C59C06F2B3FB6049F83763AF2C4 2403A0B608C3A0FBED318A6C73DA14C975EBC7A6989E24D38A620464A77CEAF4 E7B003DDABB647349DB4F1C309C9FB034223DD1DC4680557C2B85964255F7346 DC4526A342A67C52B01E31E7AFFF206030BF5BC33C611AC0C66C717A1D613B41 FB56253FFD33B38E05D4B46DF97FA359A5B596CD120345A93DEA9F154189B221 60DE19F862137FA656891B1F1605C83C80B4171D03C7B1E38B0444849B27EF7B 5BD9BC7D55B6223946FC0D1DBE3196179FD9E16F9A92D695479967C07094DC8E 6A3E94C425EE47E2B7F93F6FED2B71D7E12C3AECEEFE1EDE6DED04EF134D2709 B24E8C2487A82009AE629E34B6E7CBBD7B6710220DEBD9F3A384CFCE3F520DF4 D72DCF6FDEC5C069375094F2C2252E72AE05C6EF442A989956751B52D3777342 D54AAE069AE1AE4C32781DF977446720301240DB9A851B54795E61E4A5A95235 EA8714615C1BEED0927FF255D6CBC7C67A19E8202A19BF8F9C19FA150199EB87 3EEA6FD74FEB8F6B65C2DEAABA9A6D8E17AAA35FD1A1C4152CBB6E50D049EAEB 278C96F5DD68017A9915F18737F7529F729148AD2BF12BB74E90CED2C815E950 2C8D5B1C02892F29227DDA41D8FD38C5A294F96E1A0B5637A903849A39595023 17140604164A16E33A02AA4D8B86B6A05134D14DAFC8FE61EBA24C01572C1C1A 624109A48CCF8A5694598767B60A266326E078BA01617C58961D25E7BEA6615E 8A44E5A961241E7121AE3AF66D8FF2E8F5128C3978C17AFBD9452DBB2B98BBEB A8BE463FF329B94A06AE3C66251E0979F142925114DDBB3E0482B9D9A1B8AF17 0E436A9C1070CE988E6B1094BDE78CAEA9F3FF2646E94179D30E74510D936D45 311EA7338AF4DC1D86DC28A57E1908DEC5EB6571CFE1B14D943AFEBF22664A8E 15952A258A6ED53A40A074F7D12A948B4F9CC32256D2A03B1EDDCD76138A3ECB 853F69B00170D13A799F3FCCE184FEED6AB4F3FE81E5C061BF7D4766F2EFA3DD 0BC11F39ACC10F9E719AB950495DDF23DD01D9790B8349151F59D51C4911847C 6753230C572481BB9B7514B319BD1F2C0CABB2607832BC89693179E6D8C10911 3238E395EEB0A8A6610389062745DC1CE92321560C76DFE2757F41BEAFD9D912 D75905CD2723CF03931DCB11B15983A74B751FC2DF7DBFACAD134159D07E61A2 8F59B7FF8301C9D7C6984246EEB543BEE47D846505C3981D3904F85D8EECE122 08F075B643F76404D52463672D43BA395E6412B5F8113AD1BE2519F15756078E 84C9C08D13E84DDAD41BC192364A0D597D8549D7F5BD857211704C435D6750A1 9FD4465D09530CDFB055B4F082627D44842E18C6507458DC3C29BC199976E765 3C0FCE7C69AF9FD6DC3A3573A5C252E4E059F47B8DB9C212EEBD998FE1FFE74F F62F8B433EE04265CE9C2328EDEDE3C96EEF3C2F44837C5230444CB6FB715BF5 DE4C2A8C29F781BEC062CB9792399921493B6CA50E7D8BD673CDCB5D9DDCF6A1 933E85F169BFDA7D62570FFD9F9A5D38CFA31E133566BE011977C00DEC8CD390 AC387155C5F63768047B4C03A37A689158BEF4BBCC02D1C7604BF97101179F3A B692F09CB13B2F270402C6B7286B8A8C8B86E2231B0034E85023FF524E872C62 623B033C9C0208FDAB1552ECA0E1426F5B851A033662A9BE25627608B9B861F8 B4EE0BFB94C537AE969DE7AC3E4ACBD3785EF0AD266ACB1CE18C2B56104FC97D 0598855BFA54C1A122E8E83AFDE8AEECF52E5C4D4CF4FCB40C7676190F6497C4 1FA4A5AF7A016DEE6DB014F7D62C828DF437F4C3829C4428209BCBA68F7F2568 E8A3776ECBF89ABD448FDFA6E376B94E0678637DDF54494E1A630A9EB9BE547C 0EF45FD11AA5734AA30D312663D6A192C41FD7DFBA480BAC4CF4F472251336F8 7AE0196B8D62DC862509709202C54904023257481AA0C35A69846FBF7F433DF5 F47F0DFC7154906C434807A7E32DDCAD1CA2B0167B11FC255404C5BE7A7C57E7 2852E9C116873F88BD310FE55A886588E1FD6F2D8FB3FA3E9F8B39839872B8B5 A3463D9CF4639A6F261556528277DCB351452D67994091CB3D4681347B1CCA9E D24C9A1D2C96FFB108BA0954690088AF71BE22F32FBC2AC1925E792B908A9AAF 5C7C1D50C1636516DFE04EFCB5B01650B6305D691D84684F67633C1BB0E5267E 48EAF6243630B94ED8DED15D4D9955EE13FE7A24E6097A1D75ED898EEDCE45B4 FF4C9A5C1038DFDCD6F7708F6987336CE4DF976B87AF047756C8082E45F43DE8 CB1D767651C8C0537DC1A2E627A88F6AD4DD0012088F0E102EAFDAFF889D4A32 1C58659F59360318EF0294D2FD7F0787634B9EBA4FBEEEFC01026A8C550354B4 ED32E39E222F463563578404A1ABCA03DE86EC2C24E76B49017BEF0EFED1C020 D9C1BB88E18180CF026AA614703F6CE6CFDDAAD903B1D9880F75E429CB66F001 808AD10E7003051F1EBEB2A4B491780084C28E1DEE1B94828553A15DC91D7866 E8D18B86FCE311C763FBB11B36C091CC97E266BEA49D45DCDD67EA30F783FDFD EF4B1783E949E05F0E4EE06BD63A896770D63EE47A50D427A7B92F3A455736E9 ACE00F70B1D8AE3157A0F737A686AD94426BFDB7E5D203EC7C38B3CCF66EB3CB 4E03E4D420BC4DED8B7B60A13BB5D9B76C1EFC7362C743C1D7599B1885255D3F 1DE83323604D2BE1893B7754C5EA67D71AD4042C524CA5E4BC1A6A05C7158E3A A61465DFA97CD17FDE151B38A191C064EF5051A19108ED22D7FAF7ECBBBECC43 C05B266CA317D428F5244F2CD55386942A1A351131E6F4396D700A8016F00A0E DA6C5063BFB69132EB3F561F2B1DBF2AE81C583E5B2564A230B76B55E7FF5CF8 180F3E81371CBBAD2B2832C661968B61ECCD367BFEA1BE0285FDC47FC76D90EA FD01BD99A52B9505E3F936965B66792A4264E0F29FEBF2A258A325A81E21B894 D6E1EC9E1738C2EE72296F95A7F19EC8ACF8802A85C35BBC31BD01BD6439E92C 790F40DE875EBB5718648C13D17FC5A6E0B587E958F6281727D90A25BA8AA2D7 D65F0A52F5CB2C5EDA062C703A602B22331BE8CBE72FBCDF10EAAA7FAE8C5F39 B52850AC2A9E3D190BF4B54B3EA144EEC07B0E7D033D81B09C6CBC015B2B0AC7 CA4EF39B40BB037B5E28CC190E724A9C9E428388E9247B3AA1D5437C767A0199 2454A51A3E7778D79B29507960CD14105F661F1F70ADB75EFD1AE62591AA891B BCF4ED4F5D91A6468EDDB2A5EB2B07596BA35126C95BDFD114B61E16561E38BB BE613F2280D65873DFEC62EC1EE8B142902C54C2A95E69D21714B8895D945A0D 965B918CFE98EC4D363121D2EC4689760E44AEBDA9584AF8A7BD24C40354858D 98E723894A7FB8E86618DDD38783749F3E7547022E5D5D0C59AEEF9A49CA53F6 2404EFE0F0F95E81DBAAA0EEFA6152761F22EDD947EB9976439E1D5766DF7DD4 DF660F3A87114D236F3366E0EBB801F01459540E1B15B61C7D0B299EE0D2599A E446D7C13BD231D72E1654575BF2611088335FE8C33E244432B01B813EE9EA57 AB3CEE238A0F8DEB44BAF4587CFF6EBAA0DBD66CA6F29BD5AE6203B437BB720C 7456969E8BE4C0D24EDD1F9DD2EFE71D515E9A88EAB7DA864F64FD14FAF56A81 8CB62E3D170639CFD831F90C6AB8025660CA3EAAE0A148810AAC2FFC2349BEC4 CC8C82E739F814F211156D5B2A0AEBE8F49EC99BAE4D90DD07102A609BE8CF62 67AD6CC08C4A063CD57400567E4C3926DEB55E40FB1AF16CD83A03616A2E99CB C73B35BAEE2CEE0731C355A6B5FBEFCA18CC09FFDC2F24565126AD4659F3D3BA 9F151A42D36C134AC6E150752F837D57187F0828675AFA984D6C7728BAEE460F 4B57B9F992224EFFFBA3F228810FBB10D03A9E94A38CBEC148191C1B735E45D4 F8271C562C3A063953951E002F535CE2ECE2FF7D69AA4110BC755E3A06F7ABDA 8F9F043C1868CF837BF612B4FB4F72737A53B5B4FCA851316E3750A475D0FDF1 3134A2AF36E5617E4AD65D4404D032344547C29C7108769D762B6AC42545AC16 70DF9906F9785D14B6F122318FAE191ED9720BE537D26DD09FC42439B3CC9228 749C5585324AC80DC8E1541605A6E18B13C38666A55C8C62A344446C32A30058 9705D1447C7411C7A5DF229E03E25ECEDFCEE48EA267495FD4CC10BE35C3EDF1 6FF2EE489F508B976F1AB832ECEC78EFCA858AEBAF02083FDFEC6C387D869606 5F391E29954F37A3F1EFAB1AD27CA01DAD0F8F3FCC51521A1EFAEE1F7CF1F614 8630CBBBBEE85F2CE3CE2D21B3527A7BDC5A51A08DA5D12D99657B5855B8D229 96612830DAA9223577183D20543C4E051CE41EA6A44EB8DA8A2199971ABD20EB 354400F588F8304F65C9B043642E060CFFC3C5FA714F946CD6184B722AC23FBD D7E5CE3160DB852B3AE8FAF75040B45E8C3946A9218F350F7E9FB161832C01B8 AD1B9B0B171BA4EEE142FF57738EE3FB0250EE26869A4D2C5BB170A93CE033AC 23D6A2177CC06E4ECDA91C55B507A6B130EEFC99D1DCA8B0484A807643E7D87D 284109DF65C669BD22837BE155CC898B58B593E071315CD49C759DF178D26AFF A4AFBF13E532A6D0FC6905C5B1F1A8F06A0701DA2F7FF80D81789ECF4F43B746 11369FC10B2E87EF9FE90999C4E32F0CAAD6D19DA6E64979B961520489DE5B3D 8D9516BD1DA9D24EBD45AA589C4FA293C4E80646F3FC2609144F54DD5C8A4218 A974AD4B86A598BAE117371979B1E501D6E83F6BCB459DC84F19E3179C158DA9 FD7366ADC4463E4E0063080218022D0CDC57F3EB7DB18453AEE8B30480E525C4 7E5AAD065CB0C3354C86DFCFD5D567D0CF6A6E6117C97AD598694BE57B1B1901 3970B0254511A0709299943B41EF9EE9FEE72A7C7DC432EA55053646A23CF587 B3A7EEAD85065B5212A826D30C5CAD1A173FBF469A528E0107BF16186C25737D 3DC6DD65063CA989DF15906C70D2A3F979890881A52BF9DA3385ABC9FBCF2AC8 5318FFE16C7DACEC6532C83F54523A2A18B687A1D67F665DE56723660A9CAE99 71349EFBF78D0DA64D7850E1548709F75C47DC53873ABB750804D059DBD2BEE3 35E271745D2A8431E0426AAE29DDFCDFA8CA0A33C9279CA563715E33B35DB8B4 06A57AB97648BFA4D337B5E286CC024145CB350F033E38817C4B46BCCEFD5970 1206EB88F0081728A03B571568EFE5210979A18FAA5972942874A72DE632101B 5A152D2C28F34F7B9234A8036418E869F4F95A62F34468C5DE6468156E2C75A1 CF31225AB2A97A5D8C47922A8AFBB8D6E5F0875CEE35D1F1FAE5793959424860 BDDC919DEE05FCC8640BD209AA05F4469213185793F34AF787B2D2BFC320A01B 18926F53EE902FE7849FF719F845AA35A2D74B275A48B53F09ED78EAA0ABCB1D 58A2A6A4B0B8AC3026C619BFEB960638AD6605B1FD18925BE9ED8D0F033FB461 27274EF5F41B48F21A527110009CDADCC139C4C3C70BC04AF4672B94EA6FCDC8 4E72E8FC4D98333A48A9FC72ED0A725E9027A254F680850EB2BF7BEAC61BA93D E04F4EF60B58C4AC7428D82D06BF43E71ED1D3F5EAEFE84B37D4ABD8B19D7958 B65462E0E23BBF1DC8A64CAC255968633D87993B74F1C79A37DB06B09E86F978 1FCC76935EA7B8F8D9A3E6FDB391F754EF78F25E810BAE014E3DFAEDC5AD4392 68F9A8E65FA0F3221455035EB467E0415E97FC5C13ABA9E957813AAC816A4632 C80DDC22F1740E1C 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT12 %!PS-AdobeFont-1.0: CMTT12 003.002 %%Title: CMTT12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT12 known{/CMTT12 findfont dup/UniqueID known{dup /UniqueID get 5000833 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT12 def /FontBBox {-1 -234 524 695 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT12.) readonly def /FullName (CMTT12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 105 /i put dup 110 /n put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57D05DA0555DF933BB0 7B42D264831116C06C79335D519461E7B0E870A6715E3D74A08D1BCF86E3BCC3 A43FC6BAD1C68BD9D4AFCC06D845FD1F1E70D7A47F0BBCAECE8396E04591E5E3 4797F646AFEEB7DB548183F0B74C9BB6BA2AA04E7F5950EC8AE97C741D4B2C5C A8E7A8DF5A36A30B5A7592D95E1DBC63EF33C92FE459792CED29E2B8B6919251 75EF62089BD7D44A6E1F9B62EC802FBE62B821DA1C3B2DDED45D27964AD29ED0 9FB7868F3A8FEADA87A8E42D52C1EB7229D7C79B60BDA263F2BDB025AE14A507 098FA274206BACFB4A0A7257D5998EE8F0FDCA79CB61DD1FC59DADD11E16BF02 ECDFD706CDA1E72054D4EB55AF7BA9F19955886BC0BD6E0E3FE3769C94AF3581 DFB2BCD67FE2892AF07E858A01280194D8DD7332B3D0A585C87FAB056C2EAA9B 5AD48D1C9F00CEF8EF0D1408DBE1C03D04B231D7B8D5D998FE0CD7EE19828EF2 F988EBF6DDBFEE00F04A4A1F4E1A55DED7EF3AACEAB5005F1962C724A017C914 2936E2E0DF26A55ACD7DD836C6035CBF07981C1BCE3615064F0540A1034C69B4 E3908E76EF8925D486DF0B4A8E1F02D8AA99585A7C31847AB9382F83880C1C21 C496AB2DF8E7BD4643B28B704B5F6B53429D3EE940A79135F5BF0396E5B46F23 42AF406C26D12BEA7A41F332AEB75DF43C15334CF4651A99F602036946B1B91D 4BB0D2E51C20216D892C8173241AC8FD15A37C3CDD8AB4FB67D8565AFA61C068 95E3D6E46D7C09BBD09428207D506AD43C693F3C3D787F6A5C39084AE45E81C9 830900DB50DAD10A17E118FB5E9680B5194716A788FF7514A1167DD1A305FBE3 FC1F39A39F5613D50934419B95A4A2FE1B6C18912CECB86726926F6B77B5C3AF F38F85F974A2D2145BE010EBB4A390B842BC222AD4A0B7FDD882668C04C51F19 13FF91E7CFA0A0F4E99A1944B272E0291BBF3F9ADFCF3F625B87377AFEBD9F11 6385726E908BAB7D1357504048C0F5B26251A1FA52F08BAE1D64B9FC32A684AE 896F3DD0AAE9624050D4DFDA25E581FB2630E8840AC5322D38B92F3E77B55CE2 91ACB8321BE53A2C7D274D63CF0C68AC833BAF4B22B26EFC197D4A893A5AE492 660D995DA9294C16BED1113CBCC18AFCB5968175EE2FB374B1AA261F22CD75F6 6E7295A254FEFC41A66EA6833A6A4EE0E75EF6B6FAF292DC5D2AFB61D5203DB5 4BAEAABAF39E9F98B45F22F2E37F337A7BA412807D539C91F3FD1AFB8E35446E DAB21346AF2FEF98F772992C5637092710177BA2E331993DF752B5FC6B2B7CA6 66F6E1078F7B9F3446848D0B4D5FB3F33718D737A59B72D9A0132631B9F56CD1 FF4DCE95CB6B8D3ED065F69EC61453CE5F7720300867F43A34FEB02E9F6B54C9 BFC57C80370B54234DBC9D5DF6B4DDC0A6477D195E9FF7C422AE38DAE2C9106F 57FCD13C06ECC232025926B3A529D41264A039D4B85CD22CC2EF413E8C47AF50 FB5EE1A6FB825B16E400225E5B24AA99D409C32DD74B6CF2A58842FC03E2B1CB B87C8318670B44A47FDBEBD9E6EBF11772262ECD81C53830B14D8FDB9D2F5B54 76684A7D3CF1E535B15B1DD66C7F2549714E0A275A694024AC842338145E52C3 2E1F3CB5109065989A2DF30569D86C3FA13E2502C8B56A4A4840399D7720D27A 479653F35391EEA42B79F7E34BA6ED387761F5F76B30CD8671052A248356011E 63CF978E2291EB9158862FBC2CFC3201C904058C52D48629D33FCA6C3CB769DA 5932EA0129C802C05ED53E239CDCD84058D8599088B626E840EDF5EC5A4CBFE2 42E7DCED49A6171F4AE5E761B7C27DB3CEB1D597E9B5572C25A6E64C52D7B9D6 229292AA3FA1758CE57450B5ECA85C832B82BDD2CF33DD920BB565A099FDD380 67CAADAFE0F6D0B69FB7063FAD117950B19400DFD40023B3F1E0E28FDB4910C6 F8684820A16AC4388DE5059B9675246C9846CC218314BCD77710B047F18DEBC6 5E0402A70B419875A31E892DA72210ECB8507B874D48127F8CBFA171F379F6EC B43E74A5E9AD9105F2ED1FE98E2FB01F69A1FAC4C28D207932EB0BD7958F1385 6898EBD8086C15CE8057BB1148562858273382CCF752C50225AF136A995096D8 ECA7680E219C2BE74B1F0DB988D782A1F842BDF75CA2A947B89E0B60C543B029 FC8B3E6C9B2FDA2E563A6FEBB9B015E74DC4AE299D3FB5C93DDAAC4A2EC5C445 91BF85D1461D80566FA488A3879FCAA2863ECAB59EBF7E7B177F52C33D9918C8 F674B46A02EC4589438427374BD083AE797BD9233F43317A35FEC4DD61E96FDD 49AD4164E5ADA4977ACDDAF03B1391A248D059578E90652D835AB3E3744EB3C5 CD29AE190CF667463CF59D0DA4439838E4C5A6D6A24AC1D57A7824FE56AB4F3E 4AAC6BEEE73DAF3D8291416702BDB9356D4DAC4FD53B56794F07C8485EB061EE 921807FFD8EF0153F16E53112E2165482804745A91F068438D9535678ED00583 B42E1D5CC168D77018B421DFD8A19A270D2DFD134D7BD948EF588332B3281DD7 D4CCB63ECF535EC546A8CD489848D7480BABB53C63FE0BF7705F3D8580B3C8A0 57343ABFFD8378BA86AAA8CB42BF785914B706A66FC0F045916FD19C83BBBA13 7F03A333C63AE62456E2C43E0B1487E226EC562A8EA4C5DB4E40C5486DA633B5 AF8FFBF32A5232C51E7B18772218EE82442495036596BDFCA79D4F4482366004 6F94F79FFC8E0C6468749D05794E3094400CCC0BF6566F2C45FF26129D0E00C2 E0443BE3E2B88A3D3AA37A3E9501074A3B0B0865D19AE6D9424D0E57DD643011 8C0B71DCBE1C62519D264B7DBAC15D2F3A7B8E0ECC4C418BEDA80D07B7B9A0A3 B1987F1D8EA3BC901A1B8EF4D4774B428FF8374684813154DA3739A93C906F22 B71C52C983205D87B355D7FB321467D8067C6B8FC7DB0A9DAC964CBB62241D5D 791B8D786DAC34FFF608FD28A3D481AC4CAE7A156FB38E7CB4ADC75870161010 B8E53E3C0B053B34460BF297F053618FC4804D7B66B4F9E09462152C3B972310 8A564499C1A86DD6BF5FA40DBE87CDD0E144640763A3AD4C6DDD339A041C6BF0 D15CEBFDE038E7FAB77B9AE44197750A52665548128E78F303C2AB156D2C39F1 6B8F5D307BC0B5138D4A02684CC27D3F0AFE83E84C37285BDD2B76467EAF7A4D 5CE61F5DA45D1AD0AF8375E52E5324D98CAECCFE422A6138FCD7FA5F823BC930 5E84DD42222C4B6BA608D34FBAAE92CEC143ECE0FCF20A9F4AA7ACC9CE601D2D D8232E2BB8D40EE2C6E27F808568C1DFF41F6406BB0AFB57D4FD29CD08EA191A 22E0292E1F417EF56C7FE04250F299443D75F3203EC598D1B3A720ECEA58F503 37BABFBAE9ADFDCEE7407ED2EADCA490ECA32794DDE75A73DAA05321ADB10393 B65679AC2CAD6FF1E988D1514E5D402A9D0F1CF6F8F0EE7776F6FDD083877167 6298D120232702BB1344C6F9B1E79EA05BE8CF0BCF2C970D6DF2F10DD8E34698 D001A97FD8A50F1627F43696637590B3F263C774E52449124706A968D52BABCE ED7E1A892A98C17CB313A1AEACF68A4B5068A91ADFCAA3091F39ECBFEF40EA8B 4F48E66189C75202C22274E200AA461532781940E32FE6D137B0B24EF69FE633 F9A204FD490747DB4BDE14DFD9FD6FC47CB3DAB8F9F60BDB06D9969F0C0F3860 849DAC57FA3168856F1BB23A0099A0BA353CB0F8C088F35F2C27E47AEBEE52A1 F2622751FF7129926F6F0FE6F59F158148B462F0AA06E3E4AF6AF0D1206DADEB 14F604D4F2719971C89B24991974B9D263073689F205542736B7F4B5CC17C2A2 FE30D987B0BF38C286D4F4C0E7C7B6681A5D82797613853CC1B686B36BE82123 D203E32A070441EAC445D9BD9C90C8390D3A1926FCFE1E869246DC06212CC36A 2EAE83ABBEAF7A5B2C785277195B1D02DBDE515AB54B4ACBED19B735DEE5F56F 2E2C2136ABF430FEF364D6BEC542DCF3A45FC30981F92877E03D651E8932C6D6 F28A6CF3B29BAA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.0: CMBX12 003.002 %%Title: CMBX12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMBX12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup /UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMBX12 def /FontBBox {-53 -251 1139 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 37 /percent put dup 39 /quoteright put dup 45 /hyphen put dup 46 /period put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 89 /Y put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE 0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D 2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C 42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE 78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D 9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC 5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF 9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE 2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE 947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B 0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D 419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B 70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE 0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC 9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D 1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F 3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B 57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC 8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC 21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F 07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E 8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E 8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD 595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB 313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B 82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D 9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A 31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E 5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E 94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE 0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E 7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE 4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F 744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D 67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA 054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA 6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B 8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB 77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B 72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D 99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD 8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C 82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A 59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C 403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E 0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC 9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 0693AFFEF215D00BFCAD02E45496D7C8F5E99EB9096FC4300D038C1AFD31EC4C 5ACA6B72C1BE7204E37A4CBBCB1EC26AB87F2FF82DE20601025169A5FBD2D060 62B5B2DBC288C79C33B596832AA18D730AD572C6EDFABCBD36DEA87C0F323C3D 6E537AD3B43C6F3A905597570A8C6B0B4A5E08C08EAFF9731E745F2BA8ED0C0E 1ADF7821CFCD4E38F3F4C243CAD31D9F8FC68B9043740852B4CCBDD37BF728E5 648215961FA82A0C847ADCC5187331D0863A4573BE520C02CAE14AED4F06B3F1 FB4A318AB54CD86DEC824707B29F858FD726A167F2333855C0575EAF4EBEA0B6 754B1775F967140641FC06F82B191244186FF347A351FBD8FA62E8C978B21F6A E124929876488AFA97FAD1A68A0C3496BCA768F4AF8016D7A65BBA3AAFD7F5FE E75FE714FFF3D54D09C9747ACA01CEFD260985C6E87477C9C7843343C7E9E3F4 0537D461EF019E046DB8A6F08DC7B007337B688E610C55A35496196C01E6F8C3 C7ACEA49F6AFA7FD9CC809E9916813F64BB5704664DD21422F8F32477EB874E4 D86593B4D4050C116B8861EFDC6BE1AC81BA86DC8B9DFDD6E445DFF8E71FF385 DE6DB9F4651EE2D23360ACFCA0B0E990C4B95EF9D81C6294337BD93783CBF613 47F594AE5FEF80B2DF11BF3F198290E1F85ECDE5A52A19CB73CFC35EDE7E613E DEF7D7B44BFE1FD496C0309A4568EBE216916A189B690A718EC1FD9B6F93A71D 7321D81C296C13D6A82DE8C00F3F67124BC399EC569003472161936C62599BB8 D026F3F5039015B5DFB06B864AAB496F08E222C049040C5C7CAFB03C20D7FC19 2F8D9906381D72B2DF1A0A46165FBE6540655CE299FDE6AB27E187CB12D54B71 EF672E78689F63FDD190A47B4DBF3D50DEEDD36D840C1BBE90958EBA875D47AF EE0C9EA031D26FF6FF1FBC5F596F51E92F313BA93A9976238F302347A96E9A74 E6C6CA4416A6C238FD20331F81B62166ECE9872DFE55CB8D2E0AC0276EED37BF 17B3BEF9738D1B731A835C03EEA93F0BC437E766BF549A8F93DB08960FE8F442 2B95CF6687514AF2CA33CF5F4DB0BE971351245E773808A40DFCF2DD135AD92F B899721502C15CAFFE5B91E3B15CFB19350416696CE86654159C79304338CCD3 F0CC00DA9C70B22ACF06121E249770B05193CC1282911E0E7608B8FD97C915F6 10AF2FF9E797FE0DAE99349BE362A352EEAB5981BC87E284CEAF0443F6961286 CC5654A34363BC35D052DABEB8F85D2124590B78944CF5A4E6EAC11FD8135A76 49024416A623567554C5EA2A8686DC92FE3FFD422C5FDF9626097C8D17419607 D88310C1E83DE614CCCEC0BF52EC6067D1B6031E268968DB0A272620920BB494 F860B2C64A6316774B17A52A5FEE82D4E77BED5701F0B3E0A215960FE40033F2 4ED371472B1E1B9A45D167FED7E4F3804E79EF1CB41B496B1F9795C2509398EF F22A334C76275908A145880A0A88F52D059D284C6DFAAD928A7AB875D378B2DA D1FAC58D1CA262943B806CCED791CEBEB02AE2C072E86EA15898F7E22A252A4D 798F51BEF115D3A9278822499354D473DCE2A22FDAF5E261C77D41307C2F9738 7EF9E2301911BD92AC59A176F4219E9DDD8FD878761609CD689A7145D38D8B78 358755AF9FD35CB2B58ADEEA6B4C45E58C4B2C7068E92BD9ABA1A164805291EA C6B3BA7239C46C341F3646F6DCCAC614F8544CA97E3DBFD8DC2FA0A55D8E4DA2 1F4A9791971DD17D84FC4DF954533FE1DFBBCFB59FD02508FC987298D1A97299 52CFCD2DEAC6C2BEB6DD5F748FCA9BF2A40B3DB5AAB25469C7ADE62764375DB7 040C9C9DE6780122C5EA88E1ECE70C5AEE6DDDC35DF12F3C6C955067A5E7BEBA FDFDB14C9227C4DCAE6A4B4FFBA1C9F662A35F3B3FD61CEEAFFFC6BB3066B9E9 E435BFA8C8FAE1A3D4E3012DDDDA4F016E07A5C898C7E3970143AF554A620FFF 220994AC9D77B84222B49A568E5D34B0B7FB9FE062991DC09E9D0B94D8415FB1 2869FA3532ADBE2BB894EA141BC2C3D736DE4A33C01E4AF11146AAB4082AA8AE DCB1261C3442A71914BAA1CFD548B9D38371EF4E1CB8B5682A25ACEC5976CC2C 95D483D9811BEE04327D341DF9BE6BE4C11934C8B3514E24BBCB0E8113B28D55 B47A3CF3D21AF72BC2895ECFACAF00585AD4FFFBACF443152781F5A197610011 F50E2EB244C371045022AF7416E8603C21913CC21FF4F04744867B1E733F4960 05F1951A50186DB773E3B295948B3C06F1086EA20848A82DBFD4BEC301B058B8 1F1FBF65CB26263BA834001A10B93AEE1196AA0F9F203DB26318E27CE7CF06DC 2DDFA7E4FDF80398B9BCF04EFE67598131E5BCFDC3076C08F704C18AA1983476 2DAA92FB545472511E2E67854924795E2078B2D6B64825EA833CE77DE5C954F7 04AED8BF2303551EECBB13B02E3B64570B0E9D058667EBAAC37D3C8CBA8A53E9 7F45ACC0706125A72FF8E2656F5EF06079D7C43C969293090E660B1DF4CD47F5 910864DEA40258D4B94B93FED1F4C9279C6807D8F6CC168B7F1B71F5EF5C229B FB7BDC77AB462E472437D90D9BE2B0C5591485D6D47DE3CC2C03AC7C314AFE2D AADF4B2C80D3325871E3BDC0D488495B286F45C24178B585CD96EBE8A6B4527A 236C1D44D140C5070F6FE1D6E7978BD994781A8DE55E3744968F64C3874B7BFC 97C8ACA183989ED1FAF3A08C40A9259B4E17C774245EE44EA76BEC469BB35ECC FF673325CB8D4DA8826261607892F1DBD843E6E80330277DB1893838A6D14613 1FDFEC126263D0D2BB2B25A46C565461EA6CB44127783CAA783202464EB16072 71A72724E495C2B74616DC18CF6096ECF594C232711AE4A2AB3D693C23F7CD1C 807025152B9F3D3CAF1CE7905C8DEAE88FCC008E23D14A29B91E2A1DB0F041D8 DBE44E9B6DE32A3949997BEED0C1134537536B3A7290EF0F3872485108FA9B57 54D10B2F0AEBD3348B4369F180D60E0EEEC0270DC68C1464E22B35BC90EE9483 E4E90A902576A861840E64BA9902360A56D181510918CAF1BFB880EB7A999A3F E7B33A8ADF457E4D03E1D7B50E4294ED827BACEB45A963D3FB6D5D8FB626669F 467A45B4BB135AEC96A1A436D70221D7AB999F6DD68F3AB0BE702D88AC1092B9 D5320F052A6E64DF47B46859CC17399E9EBD2B1D059CE3A1F475F50A149D6665 4B616A0E353549B4E851E860FAA2D966B73718CB524A02E3296F89CD64894E90 95FABC811A30DDF5514DE569E39372E34E3FF51CEE672F45F9B03334E8571004 985D9155F375B2267E73F203AFC811B277581352B359D54DD88DB0FBC9DFA8B5 F15DA19F56206CBBC774EAF3FEDC1DE2D09E1074ED94E8447E63F318FA218285 22E7FC12A32685285D411FDBB8243326F614EB9142EE614B2B38BCDAF62E029C CC469462DE4EF5180A37F9543CBDC6EA8C4DBD43247E26F11CCF70EEF76F8EAA D59C7656E686DC168CAF59392FDFCA0C964DD40C2947DBA49E4D26EC72F19AFC B47A5035E2F160F43AE6323C4D09992BAE35161C4D1798D908E5148AB0B2570C 183D41A6E8C70AD3884D5BCAF073CD11A48960E9DAEC850654F4FDC9D5217185 0148D8CBD30FF4E161C7A0863299E38F19D39AEA507F555CBD29D8CC9D688537 4E160F92CD43B7C0957B64AF8318565799809A82708531AB5457AA511A810D47 8BD17EBA7AC5A09403556AEB40B432F735EE65BB2DE2848C1DCC320ED7149153 65B66C8623509F1D5F79697068595A3242A9A95F7529B6EBAD801774F53EDF40 BCEC7417D63BA9DF43CA088C42D9198F7E8E84BA7A4BF59FDB98925778E0A4A8 F572AD22F6D0AFFC41766D73C3F28102A1ABA87320D0856F4D57C93F44ADA668 BCA2158677B0DDA9F308BDA56BEDC6FF0487BD9EC8C158CAEAAA144424E66B78 5F5265A360D8EEC0069538F3DBA8E0EEDAF8107D7557951A8BA4678A77BF34D2 519DC11C487E492FA6C3F7BFC6A107CDA8612699A9ECA24496156E5D483BC815 5E7DAD9D3CE3B52E44CB0E6BFF948247660F9BA438A91F301DA9356FD2A61D3A A4A56F1243417E45590CB4795B6DBB54A0A0B807B9389D6B118B63F19424D22F 18D868C6C09B936D2B5A39273E5789AD20897F175912807BE76F2A67C6AFF143 68F3C4FBABD6B06A4839BFC15F4B56BBB95303B23F79954561F67DBD2B769569 284D725C44745A0B2E51B1B780CC0D35FA2DC1D5DB25027ABC49B1B13FACD245 A818F65F685E0B4EC6AA1CBA2A5A01334938C30F595E2EA0071401CA79007E21 8E922E95B6644D8EF8579B91DBC3A54475344296E572E543AD5B376E416FFF14 4F5FDC7CE2D86E1CC7195EB7DC54D65A2D7CF3E44932BCDEFB0F9E77ED91FCCF 2605ED69AF523544639809EAE88E022FD091C401B50B5A5A0CD305613B5BFC3E 01E09753823D6DC651F426100094B97CED7D682AE375206A1BCFCFD2294A44EE AF81A24C23558B08A9176F29CB529CE798A12119F6851D73361FA0404E0EEAA9 180BDAD1595560FAA601D70287C6A41293AEDCF04D6019088AFB3ED03ABAC12A 2E73E13C76E332C4396CCA0566048DAED40921AF0D1419344E83AA1A77D2E622 B194E71A7521A7A05A63F4E56CB6F3F8D5D615A5E668D629EC3B847ACF736665 39C86A7A5AEFEAF5784586B76EC44DB0CBCCF331D5F540E243232466CC560D0B A8F9B7F6BEB5855CFA9D5B064FB691D5439C00851D798EF9BE73AA694F19DC66 5FA03ADC5CBE8E338735D3017506B6B3315EBBBD4EAF958922E373738EB12DA1 90F7B7EAC37F70B56DF7520F5E3093A374B65A96CDDA82D8481F05B9F9DEC52A AD7D12F58085C26B9B5EBAEB4FF96BBDF1A7C289F7E5F94C025D094C9C7A2639 2BCBD6DEFBE5AE0EE317F57FD99D23D758FBE4AEF2C5F5014695E0C85993A2C9 031CCAF19C65655D5C684A47A5D9A91F91E9838B64555A83B386440FDC049A76 48F48AD45A6EBFB92DFADF39CA4266D1E98D294F5C945E6ADB0C8D23AF6127CF E91FF1DDACDD7F929DA793BD338A9FD95437DE078B31B39E89CC2C3A6889A453 C2D637AFDA478F7C12C562CDBDE07116F8035A617828D7167BB5439EFA48373F 20C69BFB79776B19D7D9FC84E3FDA2F17E0E1A9E7F49FDC8106A2C4A087D8D28 8952FE26E6206AED9FBD4A482B4202DFDF7FECF3FC23488EA1CE3C0F3ADFF669 F131CAC6D54E7B15670A1156009861D1011AC42A034BE4F76E8E30F381B322C8 541691831ABC432A2C7E1D98EF6C0A753F44DED33445367AB3CAC63214F52CE7 CF376BCF8D450B73216C5AC8A05F4ED8B4E8709C6B1A74DD4546756FF8D72755 545AAA71A1603F08778567C271CB976D44EB9423A362CCA709D905818AFCB475 5B190EBEAB03D5D6AE1DD887A49A0BFB7ACAB60F0A3379C623A852ED681D8D94 FBDC484079DA9B6DE72B9002B545B711CC689960E68A4F679565B6B692140C1F 20349771D5F423553FD29E630E63B7E064BFEC3BB0F0E89E5DB85DA3FE92A855 C847C4245F8D47DF40B514A50C917E67A8A1DF07CA978352B94FD00A44795D4A 08E2C30F11B8A83C051CE1C3E98E21F747D5C5D10EC79BB9266E07D2700DE4D8 9201CDA4ACC264F3F8FC60FC083D3DB9ACE3EA5B425C5141D31F50C63E0329F5 C6EF19A457706CBF0C8989911B1E430EEBDCF04EEACB2222D795EE8A0E0F01E3 D33121478FF19350403FFE9AFEA7A23424A59C6AAD10E16FE5663C396CE4379D 5B02017A5A63F6354AFDA10A58933E56D0919992D62559FB85188AF550FF3D84 E18A2E9B0E8958AB86FE3B2F9648DC9814C34E8220388176E667856B2D645DF7 A10C36F553D5D9A9BAED0E223EA6CB93158CBECA11441017AE3888A370AF37CD B50C9C122F8A73001BADE53C1E51FFF14DE8A24D20B3121971E122E4BA2F5461 D0A045ED7F7C64AD31C9DF1E57E1B738ADF6FDE897572FC6A43D16743C705F63 A6C7032013E3EBB90FD46E866DAB471DDB63B8F4C67ED2F7E5720FD6A3B99342 A2F3BD8B0D1BDF8952B850AA943C0A317E779E3839EB3A2DE1AD78D823773ED5 8AE5178AC391562F7AADDC9CB49CA37E84763A7FB6C423360DD10F22759A613C 41AEFCE11BE2295B4450E2FFB195CBE319A18CED82D624949692992458225DDC F67A39EEF57345DE6615C07B1BAB0B92828DD37762226E17E96851B1593EE7F0 4BCF190585C8284FB3A503409B1B6A7B7DC6937C542C7DC8B26D5321A035C10A EC132A45B2543CF7DCE71B935ADB0903093BE025ADD53AEB026C75EBEF72E0EE 7B20C292D5DC60FAAB5E16D70D577DCFE65985443C5A9FFB695371E1F076CE53 839A61DF12E2773280F91BF265F20BF6AF20B496D5E17E6052693320BBC6A948 5AF33F4947CCD572AECB62A5E2376C411E42AB0723BF9AD55908CF416AEC69B2 D2D2695D06E1D396D505D2FCCBC0015ED9DAEB9D595CBE54B56BE92509768EA1 D526AC49CA69EA9323E8C706931894E172494588812CCE011DF3502CBED53183 7D7ED267B9A7183C332FFAF61EFF2A54986A5785C9FDA46085D75456BF27C32D E099F5DF51181B9CF8B92FF6B24C3B4A00012814BBABA742ECE8F4E2602B4315 AB9F5C91C29FB96F5175AB024352797A7EA2DAC05B6FA89A895E82E8581ECBCD 8B4EAB31F8607ACD4FB87200CD1997A87D330750AD2F04CE242FA5BE188C7C01 FC24B2C58825EF5EB2744389A42C8BDC29985F7579282F1ABE697A030141C8A9 6659DA5C6A7624845FB74C6F7CAD4242AE6C636FDA1A3D1C86B24578FB4FD3DD 0DCC4A96EEB7CB250061286CF90CE50E3337ADF627CE008F6B60907CAE5DF5AE 97A75959D027CD21DEA62D1F5DB06042C2BFA631496ED276F7515C9D7DBEA504 5D59D6A0F4648618E154AE38345934853725977655C7A56A61197E48208B6AEA 4197818E5CBA59E3B93C57A63F4BF42909400D1EA2CAFBE3D6A5F6FAF4771AAF B579CE2164B904662FAB8C27D7A53B845BF1F9919C4FC97109C5D16DC76D54CF 3688FBC671303D73A97C6AA181E1E2122CBFB1D9FF0F3BA74782194CAE7B808B BBFA64984C8B10F6AA6C1F7BDDAF1ED0C86D535F55BE87973F3C1550D4F565B0 890D75DA80598F875C9C782EB3208E711F54F873D2AC6BBA784301086E5CB98E 43E8BC08B3866C6F4D7DDF4273EC627C800C57ABA66A9BDC80D9E06E2902B377 8699D0976D4FC9C50A83D994D06E5D2DFC80043063725F7931D7FD70A3AE294F F842AE9B274E5E1E927A83FD17DDDB39C734925B6E17F7260B7BF3E92A657B7F 3870F0D95FCA769881D6FAFACB21BB3549D7C719A6DDAE22029D0AE47C0EA87E 3B0C2647DB7AE89ADF7A75D5422279CFF2BBC7BB61931F7186A6C3BDAA74EC05 B21AB62646EABC5D39AF9F810FFF173700E2A266DB4105BB95D396BE5730040B 3EF5B31B96AE52F2CC75BE4D356E9B7D7BE0871BAB4CFEE078B0A7CA13BA7BBF 902A19126283ACCCAB0DE22D9A19594BC66F37FAC44E793BBD8C480EC016CAC5 436113E88EADE82F7636D551B58457508BBA473E95559EF42B4B880450F9E8A9 C450412E25EC5DA882DB0BB936D38C9386AF3820C9861261527C2D1C252789B5 22A70A50B23F84DC55210D8F92216C3AB0BAF88376F20569BEC71F1E22662DD6 1221FE71EE72D81C9D0A636E5C1EDB20622297F554F13432951E8387F39CE82E DF0E30A5B9EBCAC83CB03950F15690FAF532F4350F9897E8718AA9163F478C5B 9946F388FB3F664B217754BA47E335CB01F791B77E3D13E341E6402E19CB87E8 C0723368867E604E9802BBB059295819C13DDE6C82695A30685C0BF4B7B340BB FBFB921FC7F145E53A4026F8DB7A564640AEDB9FCDD78788597F980261398F82 51DBE45917DE8DD30CBAC75BA5BB1CF65A53C76D89452F58C424CDB2EB5A4C77 BEF08639C93B1BD3F632D48A9BDE59623D53A0CB4BF43F3C611AD1360EECE6A3 456E7504D4359D137E85D89B9FCF5926FB07A35BE6B9DB05E3A197F4D43799D2 C0608C4245EAD16EC8E78974AB2FCB720889FCF89F0E4C8B23FDC705F240978F 522B0A82E45101A38781D93C60C54A4AC1E1325C492C71CB05EFB441A44B0470 2E000EC3C00B0F8915065F4D8F428A3A5B70BD039E6EFEA12A16322C582AA633 5189628BEFC0B8F0F9033C7C623B1EA8B08FA372987C72621A7A627C3FE5D8F0 6215A6306E1FDCEFF18CAE86D091F137D4C970DC47F2EEB6E262C8E0295D9565 D9BABF60F08AF6691C19286A459D9FDCD80A8B20F8A9625333200693B6177BAD E075BC3AA8F88F34B7F6CCFBA8DD4C1E8AEE3D2F2B2E0B411FECF1834799CC76 4428EE962CB059A8425A097DD445390EBA7EB1902BA9CC1827CA599D831E4B4E ADAE55DB1710A2A09F629FF1C4AA33F0CD6B51FCA1FF68F48132449634C4CD39 DE755C287B465801CA0B59C77E16383F6B051BC015F9207B1813ED1B3D0D74B9 F6EBCCF86D50EA8C28BC52DFF627ABB44C3776C20E63FD9E097BCA044E3A0317 2957B29B6027A9D337E0F3E76E926B80B257C21EDAD6D439D3F8C183209A2FD4 0684F150356851E3B30299E21D5EB96D9FCD02C37B0FD46188390EA319A2CF65 FE3F5C96CF1F3A5EE1AC05F84445AB9637C5F3488FCE33F1B13361F0B9DD6EAD 38119F4AF7F52CAAB6DD082F686E5C1EDB20622297F55491C6C966EC367EF0BE 1515DFAC3F118B718A3377091A947F359483A184E30D28F6100CB5D95FF77C3F D6A8CB1777F7195793BC4E988C322DEDA33EF644777C4DE2EBDA1A23809B3700 CBD9A6E18137DBA798EF16F1F47ADE7D2379DF8EBA35A39CA4C2491B3D39737C 49740C24DA266B41005E8AED2FC7BE59F9377D038942D3028CF92FBE91ED439E E76039F1D9D9D850FF3AD4155131595BE51B9F604D42815358CF2EF1EEB4E8B9 647DB460097A8B305E1EEAC76F4C0AF41A99B38D4B9CCA43B541F874169B45C5 9B85179376FEDBA9FE0446AE6AFEAD287B6784A28CB3A447798FC63DFF777B1D D6147152314C7F28C8E0A74273E26B708D86FDB53C6705CC3DD606AAC769AA95 464787F534DD331B90E9A7231CA342E55C730F15744C49A62BFB9F646F6E8A3B F3685B307BEA985D4ACD16E9C19F1BBFE1335F76A0125AA4889835080DFB3569 6D1A91CD56C1B71EB5127CC7136BB4E710055F96136FB28ED1F3B3B6CF01EDC7 66866A2ED26C66FD70950A75795363B87583B11F4DAB7F99DD7435A411320A26 E6658FB77454972317665D6F97AC2C1B8A6FF143B89C33F61535D03E0FF055A8 6E6389BC31FC1D57C6F070F9C88C514C5C1E40E1107189493E654BF151233A73 EDF075FE182104AAE28975ACF454B3CE1ECD5588B265F0329E9685F24D31E15C B5F398F0236CE8B7B8E27E13A1E14558E2E70AA0962A1ADFD4A1141CB28F0323 E635FEA54912DE18789904ED4675EA1F8F2D0F6E188AAA4316C2788E7454E303 7D8AFBBA01E16ED34B00C31BA5D08E39A904E75414940F8378CE47364B96EFAE 2365B1A0BE54D4EF2B7F70809E38D99714F22CE1F6CC3BDC2AB3D6804D516448 B7CF437F0ACCA7C24E062C3D7F8A1D9B58C2FE04E9D8D04F9DB3A4F0A77924B6 9CAC6B0B9439A6593982CEF5BF81CC5402E1878C9E551EAF9A7CDC02674D4C68 4AE5941273C9674D8D217E90228BA48B60237CBC64163F2437CB777034EF83DC 578DDED60AAB9EC48F2F9911A824C2BA80DD28E42CF09F048EE659C8C15D169B 1163C0CE070EB511264AA04672A8364CE30C0B4222932744CEE3121631260EA0 FD5C9AAEE5C2B44A32BC5B7E4EA06278DA41C7680F0A0852BEF4B390D50C38A2 EB8165D9439CDE8525B52F66A44BD5D85333A90342FCBDF43E7392FD2C1BA27B 4CEA7944BBAC028F0E8028AA9B49A679CD20EDE3DE209C777445C90198CB405A CBE3105ED2A600D75E51EF1ABCE3E5328D3F81B4870001C3098A3A4B2AC6B878 872EEC317C582640BC43AD8A8B39A6CCDC82967356D9AAFBDA22FF883D190BB0 49C3CF854AAE1D7BDAD253D63FA95C4CF7DA67FFB3BFBB69B3A8255B34F41A40 CC3B5331AE318C0BA0F99655D2753890C02E7E1AE21CD7D37BABE2A788BF2F64 8B0A431F26D2C4BE39B0BA34614549F7A156A8AAADAA7EED0A2C9DC58CB44B77 D97E7DF4315FB7EC52796480FE9B84EE8766D26A61A05D2C2C0641B77D239E65 6F597BD2CB80BB6E32D48516FAC4E2FC005EABEE14FB3D2BC08325979DA1ED52 FC292D4285C3C5DA505915114EBA7E352627A00C6734927E1F6F5CA97CFCC4E0 4CF5750EEF56D1BB71269450F0A30BAF69AA9089CC1BCC96E1FD09EDF583461A B0B92B850D587BD7290FED43EDB060729FD6B6DB65924CFAC1BA6A4799EC691F 9536088E872F77F9EAE74E43FB09111D95D3D7606156BD0FF78A5EA92D66F652 C4640224FC4B7FB3174FC25CEAE91E5EF1BD68AE79CC929A36B6588026FA4856 4A2537B349FE03C373C9417B303D1FE403C2CEA6CBEF54DC5BC17359B1467EB7 83EB8D393D875B9D71BD7C5CF46905F9EB828410FDF2772E092CB8704A4734FB 83EB9A0A8603608148B708BFBB93CB30A6755A03DE4A3BD681B25F8CC41E1B5D 5AE1B4D7FEB748F79676ED960273D8F3F3FBDD2BCA2142068974A8A6387579AB 3C2044F4CD25A22A093A51991A6EB30A1838933D68AAAE55FE8D225A356EF767 BE7E9312252D300D3DB39F5BDB00734D7BFC1957ED8C397E9BD4BA26E2B82FD3 A84AB46072A106149C93475FBE3803ACF49149E319C944D35069A8C088FD4716 A9ABFAD4FD83BD23A0B58E0B7EC4603E75E82F3ACD8E6CC117D418763DCF104C FC10F9A171BF1D6F0B2403AAFC0499892FD2D3E42A7EAA89A0AC1B369F34676C F054B5D9D6D57D8273683CD67908090C00C38581A578303FDF46223F52128C9E D5E18C89EADF684C79A904755FA41EC6F11AF59925D56BF384C0D81A912ED19C 255C40321C02D535850BE9B3CD342E9FE417D0484F04B4C7EF40C83DE7D5A4F1 91387876D364EC84EE99CED7F3044E8861CAFC74FA6C4BA0D0F9CCC4AFD88381 2A1FB5E652F6945BBA07A14EF499BB962272A762C07C74324C2321FCE747F377 24E7818978FD9C511111F654224F72B8DAFB4319533F53779A5B35A0832413AC A09B57B0BD7B0BEFA6773BA3463201BC159CB16073E0319DD3EF7D99AACD93E3 E4B011C70CF28487B3F9113CF0D2123055285C435CEA3D886D9BF311138ECA83 05C5D7CDF6672AC4315A19C4866D9F5FB76C3DF6EAB3DB0AE493E92276D175BD 8339AD6CAD1F00528E777A41F899A16F7190B81033F4F4AEA1BF27CD01ACD174 C04704ED84452D97C599A8C7DD86FB457FEA50F08BE61AAFEABB30CA52520B96 917EE3B2DAE924FA0BABB4F599036088DABB09A3BACEE7D7764E8648B468D8C5 9E23B5E005F75FC9F72DD4DF9AF3FCD50C7B6607F691994F2603B24457BE8EBD D63781188109A366A9639FDB998DE16ADACE7A0AA483A967234A883EA8F7E579 849AD744BF37FD8E20D0E776FCEAC703DF689F062EFBDF7CC4FBF0AEE7EE02E7 DDD7699E1D2C973E370901BBDDA9C5BA2035CA0B2EFD5C2042F2D5DA0A08009D 2CEBBD8E1B036B2FD1D79E08BDBBD05F4064774156CFE0078CC09BB984127551 CB8DB7B0B1D5499EAB6B4CAA6CE3B229F796B876A1B334CAF0AE81EC27394679 B9DE234104895509D98106A13CCD420F6F4D1C87AA90BB0D623349B83CE0511B F8036E2E8593D35130BAB7F5B61A78BE845CA06D72ABB89FADCBB548D202A98F 99188A7E73746B4845C1AD7C7AE9C6DB97CDC62210A23AB85CE21AE14B678015 B336BA5963B75ACB65FB12EC62B258170D2353AF8FE3B32D766FE6C37EF1F10F 992A0A9B00D7B52EB43A267286D038999032060B40E52223735462618C9AFC86 BBF9A49B5DB51B2CA4E96E6C1FBF911E88FC5BFB217334C9E2A24A27ADC29B87 70D799F26E39BFCC4CEDDC9DD9FC86CF8424CFE1F30C31F3049DD2BE6DF9A60A 113FDE6699A47824906FE17BE0813E4372103B70B7131A627EBB91DB7B60B209 D32D3B7A9FCD0DA8828B22871EC836A4635FFDE800CF856D78DBC5C7C5F09450 ECFC68FEA56A178061948C294DEA6A79F145E64B5DD4184D47C75D5B499E0949 1B7FEAD7F0D750B502217415C0E16D20CB8F15034E65776B311E9FDAD71AC7ED D76D62505260B397A934B0BF31C02B32C25E68F2E8CF17A71E53071B69536CAE 74A283F2592792EDD7919F8A4AADDF9B1B4CDEF1516EE9D105860B5F43C57AF7 A1FA937789F4B738289C0942482A78430839861023252962B478BB06EB943853 9B3D4F8C6205B8917A1EA591A45DCD3A65AEC50F4EA0A08FFD5A4BEB8C19E52C AD9126A9A73DA7B3E17F87DBC4E3A1863C71C3541AAEA0701D0B2E0CEEAD167D B2C97DB74905EA2E24F91C59D6FACF1DD6F651CC4CCB9B56445D8FFB9BD312A9 2AADFB95F05775EAA81EAEFE1521020DA51EB931EE6551660823A90083EB0621 22FFF0AB245187D2944CE53987AF5371DCC5E8C798B9932E332AA7B5A60FA077 5F13E7E6EB7E6E0576BF3E79B6DAFFE149F7AF800E35B17F6305A7F33DD01625 34E7EE4EE2411F0C818B66C5C7E98CEA5961BC282090573F5C2208B5AE7A6CC3 23C3321E8B494110F7B114B132536065AB13C8B961ADB77F3D4A11F14367D076 A6E18B86304BC02B43510B4AA1730D987565DF5DFD8004F129F87038B388C0DD 7AEC8D6A34EC2608F7D95786BB7CC9AFB361938D044498F53DB5CDF34F3D5FDF 4BE069E3F368654036687BCAFA84C29336978AF5300E8986AF5A859D31F6ADB4 792F5F77B7C84D2D80A0D3D7845131B704F1C73B4B2180985339B8BAC1AA2245 1D3F48E39D73EE46D7A0B8DE82F5B757DDFBC7089052D1A93A470C7F97FED81F 028AFE40C5CAEC4E7E44F35553F7255A4B7ECBC494BF027BEB84A73487883B27 80AB1B9CBA667C971D04CD8D28A4D8E223E413EF3689DE3FA9A6C45EE6C8BB4C C6299891854CFDBB14C33C5DB418FD48721F44B5250F0039D3D68D715163522D 541D47D2B8C2B612A79D3782CA16010E6663733313A77DA3B64651AF570841DB 445B0A97F46A131D05AF306C6AD76736F60A275299A070CE4E811FD9D66841FB E521C43A3EF49072BB8A7EBFD2FF603BF9991F1958E7616292250BFE6B6816C5 B0312BB9AF4B0DC8F505C9CEAC0649C63DF40B4733866CA421CD4AB343EEA464 31BD550ACEE562F16A25911F0DD81FEC0A20BD1042165DF55F069D1CB7323321 9CF4D15AB222A24631C015CA994979AA1698523D07AFDC7D0CDD7D4CF28B885D E0D7D1D573E790FA37CC1BADCABBE4415594E6BF2C1775B75659CDA5EFABB756 8238D93103486F913D4241B8687D9BEDAFB388FA8186DD065A3651EC9F4A8C77 100FB70324651A425A7CAC1F9B477DBE548C32954C60D1667552A6026D9B5B15 5D0838F8450A43E3E79A928EFFBE3967787730038D28DB92F1EC5EADD4A05B08 840A7D39D88E3198FDD812742C91612442AD393B626C5CFA5434492942C01D5C 8C49DE21FCB2EFA69A94CA104C689E7334C372F4167A3CC3B395A955FC5FF4C8 027F70528F3719DBB803744847B94DD46A472536106CB1D349BB06081957C48A C30E97A493B484A2F92A69CAD345D30FA51C6462725561EFEBB77F9EECBD3312 98711B474959FA9255132F7BAA9316B5B5EB65962F2ECD43B81C4A5001B78057 79FB81D3881D6262D5B0824A550CE889447495445AD0F4B032AE33240894BE7D 2734C11530C5DF98E0BC3D615BC783F01A6901043A562C8F007DDD1D602BFD09 88845F31FCAAD78E18C8A0536DC0BBB6027867DA688B62A323ED8AB6AF6BE6FB 2CACA27366049218C9D3238011D425EC1AC276FB46E98B14C0BA15EDF674F87F 2286636AD645197626F04D519F7AEAFF7D7F64A4FF28139228A989F2DD1488D8 E3B48D8F0A08AEDEA35A739DF07AB75E4CA234D6222FE6DFD7EFE580AE4DE0B1 EAAF0DAE9C8A40D13E3EF7AEF1376475B5962805D88903A2A361FB2F81499590 538858BF504D188BFD935AD1DDB6325967FC5DA356DFF2984E07782D59BF18B6 7093CDDC51A063D0AA4ADED421484A2B2382DDB59AA8D4DD128EF21AB6A8B23F D9B2DAE8EB026FCCFC2CFEA2C9CF0596FDFD0A1721D16F3B52500D05B173E4E4 D6BA25BD8145D21EEBF77C5746D7E2AE3D077BDC1DDA9A7689725C54F6959648 A1B7F2BDD3E8ECCEBC270D4AE6D3A4958FEA0242A0D4CC9A0453AC3862C4713E 08EF4337C88608ECA8228F4E39778332C4D36246A1C9940876DC68D382D618DE 5D70D079D795713320E58217702CD6721EEE414636544690114D759791DB7474 05AA4FFD34C29F34CFEEFA3A77A341CAB93DA85966815AC67D8C73DB0ACBCCF5 66B5355F88A6349846EFD4DF8C9FF3C9434224E220CF2046C7521DF575DF0DED 1A2D856ED5AB2BF60DAE67D6FE4F5760FD13192D57D68C4F35E35172BEC6F458 A32C98D166704A7BC1FB8B6A5DBC5F980B7247FB408EBD26A0B1976C8C888763 3E296DB797D1F04F2BF34BA2915037F170C173BF99CA8AA422B7B91E61B06DCA C0DCF1E06AE4569603422EA5C380F5A740F6DAC4FCFBBF84B9B424B387A9F925 A549CC361DAA1F08C00A8C38D1125A66BEE9C0420767EF4B3151B3B771060BC6 5568FC00FF2503FAFF2D2CCF3F591894EC1810B34CDF92F745B669A26774E419 ED9BA31B3DCD4920B1D7BF3FF137D3418BDD239EC953B646B291484E732E3ECD 9D6D0C2A55456F99BC49C9EED7773F110A403FA575DFAE2507A5981642389E13 D085FAC4F1D7AB6B87260EDBA5FADAE36C44969508A040E2795393AAC98B50AF AB34085BF1097CFDCB37C5D1009BE34E2D7B04DE0C473A58A18A0F9447DEAC39 82295FC868A0F94ED5017C3F9985F1DB57F93769708D1721BE60042E39F262D5 E4E17EEED956E1F06496E2AE2FCEB32BE5B21668407E019730E55F2479DECF4A 1FF94DAD994C4FFC8CE893E5F326DD15EC44B4D6A056660F32247717C2BCD961 F744E02B550E133D56551F3A69983A85E511C35CD621EAC3F8904DF0ED77487A 3971D00D3BE60C746A26216E0E914C39622EDDB2404B9E066A1F3A15112804E9 8886F093F253C3BF95BC773C93AC0CAAE49747C475481D3B50FB2D91B3D11BEF 16EEF9C4F9BA894EF94AAB81C7AECE07F40BCADB71D195A950AA352EE2BDCCC3 CE9F62FBA2FF7796BCAC02EFB27072F64B9EAC9906DF91E616D2A3C8DA3F1D37 00E3B826B0ACA6A927C933EE37303A5DDD58CA44670ACB6B54375BB3B38375FB 1AC4911833410C8D2DF4A062BEA119987AD89764DA777BB8430C7A02055765A5 3D2006DAF292CD4DEC324F0A4D0211E84A49C0B6FB84C339F266FF93F889AD41 44BB935E7CD3EE37C9C220A6473FFE3C12A0B65E6F42EF69EE5E6F95808FFE8C 8D6510E38798FE05AF80DD76044CB5DB5B6211CCF641EC855A71B5FC21B98E7E E7FD7C5D4BFF48BF9B2341C7E88310EB7BE66742C092A124AA0CF039D5C7FF5A 7DBD329C048F192F70C0EC1E2AA52ED37C12E1393D18362D0AD99ECC4812447D 07B862E52A1CF8145DE889F0EEF8CD76CB5A8127AA9A92DA39C55E1DF89CD412 6E8325EC2424C7AEF132103792A7E25A98CB61E23D7AAD5FA4D88FA74EB4326A 3D78CEF620FC45EF740791BEB6174EE94FD392011D27EAF0A859B283B090A058 E6FD2A607C29C84E6A44639C387ED88B8245217136100D4C607CC318 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.0: CMTI10 003.002 %%Title: CMTI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup /UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTI10 def /FontBBox {-35 -250 1124 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTI10.) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 34 /quotedblright put dup 39 /quoteright put dup 45 /hyphen put dup 46 /period put dup 58 /colon put dup 65 /A put dup 67 /C put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 92 /quotedblleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E 2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD 8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2 7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC 32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09 482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF 118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381 1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA 8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4 61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20 C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504 3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70 9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0 125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8 34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A 30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9 39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49 9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184 2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF 0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348 3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D 9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757 802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28 FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0 98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9 5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93 5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815 DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37 4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC 8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362 E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F 42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96 3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59 A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F 7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4 49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428 D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C 0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955 CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485 1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB 8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388 6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468 83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29 60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284 42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2 1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A 21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA 206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9 D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7 7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B 55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4 6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762 4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392 871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E 9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645 DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5 41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8 2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F 220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001 A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D 981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F 337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8 139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B 1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC 100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A 1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905 F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB 72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7 A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D 310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928 7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989 1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2 8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33 80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610 3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996 4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB 865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B 301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48 3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9 1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29 0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0 30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E 2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0 C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89 14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A 44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654 DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34 9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87 4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3 2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676 21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26 47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4 F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9 D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F 03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5 886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8 352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD 9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0 9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3 92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F 821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93 3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0 47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0 F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B 9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1 AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71 C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978 B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E 81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038 970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C 6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7 97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668 A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594 971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96 514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7 8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C 392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170 3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F 464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053 911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6 261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA 147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516 C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB 61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3 F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C 2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C 7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193 11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C 9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66 C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3 1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692 5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5 6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0 EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23 AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D 8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94 376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6 B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B 02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56 4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF 9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD 751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198 3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A 40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962 2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360 D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A 0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E 8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946 AFFD0B2B724EF0F28393F2034B2E69DA5061426805353EB4D80E20739BC4C510 6C45275B8261DCBA10DE1D104B12F46ACD230977EE7D7D1D35D2814139E38C4B CA6937CCFA653349B1EF64A98457F7B4B5D8F2978F16ECCEF7054905863AA46E DD524CB33459220C71E9EFA7845A3A760A507B3D3ABC525B35930B613710A13D 098832C58EBBC8B0CA6AD516E6385792C59220331D0922A1F6F838A8DE13C337 900462F952EABBDC2EB1FBF94A66186C177501453CD3FE3582073DD86F04406B 41B6AEB440DA475E13240445D46726A6D45185D56BAB8807CEC8A8F7CE1AD149 7CE2E1BB5DE4E5B95FECB4C55C32E08DCC3D1306993E5668603F48472874883F 0901B977CA097B407F1787B2151ECA715CC64834FCCD3AF3A939F19D2314398C 04A3CF831C233B5B63D82858951855644214B4E095F2C33829E7A0740198C15E 1DDEBE00D82CD890AC0F7BEDD9169DC90F709467321455729E6870019A33335C C4745F5BC83213180560C7AD4A85180FE1AD4B3E9909F220E99C367B96C474DF 3C2D253A955CE3E6CF103794C29AEFFABC3FDBE2919FD6DED6425837A50DD6FB 2FCBD1FACC22CD8524C3A6CB2AEF09981FCB7332D5B063B025F5E50D42E30A62 121E80AAA5FC3B713F6E52D61C4F00A7BCD3B54FF31D75A9F5B96239829EA13E E440AD490C5F12862DF943B06B1FEDAF188610C8D9EA82C272AF1CDEBFD659E8 9F2DCC71AC39F4869A3B8A74072C9B27775BD49C83E708C80D31BAEBDBA914A6 709BE47A5332D3D80C97C473C4942FB104B117A37F10FDE34C570D7BE76A496A 58242F51E732138356BCA1A931511C21DB33BD5F7188AB430B481D5BCB57A44E 19E224E9D306E08AF280717717DB055E4F39DBC1F6DBAD326DE98A17CA6154B1 8B7D052CCE3761708CD60F833329DE81E225EA78EC576AD591F8B279F3D9F26B DA3B469D678F01BBD601F46245B0AEF9E84395E0ECC246A1A96A67E7EDE8C1B8 1FA5A78EE72EE3051DF0328DB42C4E19F7190DD2C1658D75329241236F38284F E3CE1EF37AA6594333B300D6ABFD30C9E7B44480DB59193F3C6BB3D62717EA05 975F5CE3D0D5A0F9607E25DC31354593ABAEB5548FD229220F8B49CC808E590F 745713B3AFCD78072C9B27775BD49C08B25F625959E3B1F63F3D7AC05009262E CE08BBD9573C7B80BED02D30E99F0D8F7F5711DE23BEB2897A07EF1CBFDC1905 734CE7ACED96009E826E0D42F3FE501162916242B2240DE24E10E3E3BA68E250 FBBF16C6F54BCE1190A83368062D1F5A5E23476760C4FE444CC1E1EF1C16C926 7AEE7ED06B9FFAB9EB199B8F3BC02E3F3131535C1235C62F5FA0826ACDF00757 2D861C7A2D640460E2BC22191691E0069E8813CD3F45ED4B566A1B0D6560C44D C616FF646A97388C274AA862B93694CA6FFB73CED5B236B210BC530EB63CEE7B 74F7F7116D10592BE0A8508FD5B9E01F4C2302DA5F005F18FD3A578AC755A9CA 2E2B7D736DB0F32541B8D32B5C20AEBCF901293B1191949BE7E93EAA719FFCB9 3F95FDF4884D6CC8C2C5818E18F05197886000E4DD71C97EB8FD9C28D4E10DC1 175FCF7D27CB7F13F30495757AED2981888C2A4851FF8078492BEEA25C5222BE CEC40386F048879B635629467846216EAA9017CE5D62A0AF8051BDFDBCE517EC E572190D099DFA64286C917DDD60ADC12D2B0A1235ECDDF49A904DCDEE56EA78 0E236F51555D6791D790624D87399DA71025377389F10BA4571B8A9E6D98EE5A 4A7B528E5260C8569B437B9302DE97DA6BFE0D0EA5D6609F2A11A78D9BF3E126 E81357BA2D009E4413206A5DF3A3E9BB9491D96675544B77EA17DAAF3D7DB1F4 AE7F2D2E6A9E22CE9EA31057F80E3EE458756F7E0BAE5C7E59A0A100C4446335 23CB53B90FEA41EA89C2DCD65C9C93B91C968C74F53A8E5A16772816AD97DECD F43E851DB01E277CB19C4A0AE6C8FF3172033158BA2E9D0CB7C7A8994D6766F6 62717BC413A03939CD2119F199330759F230C198F6C65D43A687F901B1D0025F F0FE37AF76EE986ECC5B669132039391A0ED0E7909A5042E7D266EF13D18FE46 FBD5C177F12669EF7743A501AAAB190FA55132201623409FB80626B1BFACB387 FC69CC2A52D294D773E30DD5E68795409875FADF1E5081EFB6EBBD8810CA57EC EF8DC018E388F3C96325DE399193F1021213C392637A13F8372ADA2E519CE412 B56D75B9AF11560502C0FD7E279469A8901C8E27BD65A8191F204C5A33ECADB6 190D33AD0A9129529592545F86EB172707832CD4CA8BCDA299FD4AA9631BE0ED 10318333382EA7E4275A2A10FE815C9A30BECF6FD590FA28544DADDCDA96D241 B345177BAF8C464BF0C8B06B4A4BD034E3FFDEB3B31F1C72FE37AE784561BFBB FF0182B969C8B78A9D5D1462384D0B6BCA5C7709CB6D9A82B091364BFEE0B923 A4389688569A934825C79557C03296046C32C88D2A386FF75677CBC5DC7FCD51 7D8377F04F1004CFD61476B4495F931B8602AAB728E5EA5A880961FDAD43FC3F AD9827591DFDABDD3E42F738E55674A311A1E61F89F917D7BF2FDF52CC2B1B17 EA6A9BE4198819E8251B68852D9FBAACCF67E21319000FACBC33DF7CBF88ED17 622F2DE104A751180BA9E7B9A5C1F7F86BAFFB6123DEFA5BEA80554228023382 F84D986EA26651D18A644CD566E7D90EF32F72C12B2C487312AC5102F52D938A 5EF3BEDF24372CE482C82696E65DF223D299E5B8C78CDCD35CB49F2D79026554 AFD99F48226AF4D3FA589D5EBBD3E726306B9225ECA208FC266E193CEFA8EA3D 9B6BCEBCF6002016BA4C736972771C041871735296202A3151AFED07C337BE0C 2A5526705E60394CF84E424FE9F751F04C4711CB0DFDE1597D329FCAB3B496D6 78F63AB6972C9EF695080C2C3A54A5BF5390928F743B00D197783C2478EEB0E8 4BD58494B59B143EF88A166D998717C7ECFFAF85013BA0EBDFFB435A73E312E0 6CEA8FADE0BC9EAFF1920FADA89F65BC9061B744E7F950074DD63DCACC9C7EF2 59323441E082D4C5BED94F8FA7A1C03910C90001702F8BF5F272D46421A64B73 22A7C898C1E812F82B53267CC8310A874415E026C56F08A65F5FC1A5B3B87428 AC736F31BBB4707CFC2029E5F16DCA11F65995F11FFCB9DDB49590952C614A45 57C678A6BA0D324401608CBBBDD145D5056882FD80701F938A1D3EDA513E0A40 C629E139EB0A434342FA8B739572FF62C73BFCC137E7D750C27084A8D6A4116A 992C6659993B432291C47EB94BECE7C673374DD3837121F85773B553B3447D18 8A01DAEE821BBBF4E595EDE4483BA5F54D224B03A6A199F099FB6A729D623E53 B002B485E7EEB558D0E3F75AB6656AA91959E8063C5F6AB613E3F47972B5AE0F 7D29B131A81B1B86A04F5E15798F84874621F42033E746412AB6FD1351287448 F88455974679C1F43FC916A8BB27BA0989F29B459AB171BC01E71A60AD3EC1CC 67E9F1DA8B30A7631BE10E59AE66C9521A23639F54C6CCD6FF813E8648715060 9443F6F2284187A4B9A4A1F90DFED47A41222555C536AC81683DEC7EA17B4598 A1BA19D0127BEA3EE9E9970B06A6CE562C16BF51E25FDEDE6032F5F08F731A32 ADE87D8DBCFD17D48278C27AF9B681B709085EBADCBE56EC43D738BA1EC0AC41 2072E6BE6A31F0A15EA1DF1C79C79951884C50A560A6AF6F099DD109E86E47C5 1E41DDC8FFE93B17F3B9B31FFEAB5A615DE9ED922F438952442A32AA327A294C EF14B63EF925E26842239F6D54EC70DF304F29EF34289D9F2D7192DA13ACB695 0B27B04A3419125968AC1CDA88CBB6C11C3073D7FAF79E3830CC798AAE997D71 B31F23959087E894F0544A7289022147E196B2657C117AE9A2A6788448AA2474 4D36AA9A80138C8AD727DB25A3D00EF809C2621641ED17E44BF1F03710ED82E2 8828552765A35AFD9FD068F68BB25071AC380F8DD2A46222B5CA33E7A408B1D7 853518F8522B9D9EF101A135B8290065FDD4E231F27A7572FE5C286EC8F69C1C 485D9EAA47B86762C20D46FE143ACEDC0310CAAD7CFEC562C65927D21B63B910 DA9505845BB00700D37AF4686C4A7F646915BB4CAEBAB89D254B0138DCEF163F F0899886A372AB4435045804E7808376B89052214E022F91D7CA0242245117C3 1D7692245BF80AFCAECA456431B08B810D776122D87D3B72AC9222F02F94FAEF 21030BA19E0360087F315DA24E3C9E81844CCC66C1A17D43D8DEEA8286D8E40A A8C1812A2D6BB0E0499C798CB2E06F2060B1B9F4C6EE9D5CB637C31E7E788151 61B657A895099EBF7C619B02F0F5DF275DF1E4E7A1E838F14ED4C9C4711CDBD2 55A7E8C3E08E999811BFAA13D89DC16037E3788DA8CD1CBC87E83CF85D904127 335B23A8B39A59AEB7068064A12096950A5186AAB26A64A486FFB7F381C83E4B 20CDA90F10B391AEF95EB9B2921370A0AE5CC4059840D3DFF75A931363C08AF8 8B6CFC7F98E59BDF0D35A8777DF6AFD3744FE3B14923AFD567001BC938F15742 F1B5A3BE7BD18A276ADA9AAC42E790467A5DB078C78B645B52FBEFF9535C0543 28799CE8C40E9C8F5C5BC90A8228DCC6BABF42F0B54E516B944CE29E0D473D27 04700127FFC532BB23CAC4779B944EDBA08A2FDFE971B821A8191D17FBE9786E 20548CE9224E5007B031545671CF9226B807AD3A1A7733E06DC3FA740B019A7D B61CB92598606C00562189ED57E9A7645E03551A7237A88AC788E65FE01DB659 2E1FC306899AF42CCFBF0150CC9B7BAB0B33835D1397888F83FFEDDB98F0E894 1A0EBFEB9E6CC58F94D92AA56737BDF0D5C97FCAA6C5ED02A4721B4F757E032B 6D856644D9C7F848A4C36B61FBC2F313968428BA24489CCE6D95D80F60762702 17FC8A7DBC9BA1CD0D50163818ADFE47A89BD136E06464CDEE644DC59A0948B1 F90DF8C13F6B20B83B65AEAA5ABB80F979CDF8BA218429D18B54DC353E1FB3AD 7827398773ACC26C47BFB73F886056282160768258F65885A007831CC608C376 D70A8ADD566767564FBAF07092F41FC4D73C22BF3D6289907DCC25550053F310 6180FE2434A4E533E5E9B6EBC781925D87D34E4FBF01C7EED14E7B82834CE13D D802A900AAE9EDBD47757BF390450EF1C1C91978535AA0D75F1DEA23E9F56188 E1039B9399C08D2914E6AF4B53E44A086EDADB4EB63A4CD7FE63BC5DF2B5F48B 906DD6E533B0DA17A129E517B2050EA774F4CAED9F0DA1894CBD28EA9B5A01C1 4EC288C33950A278559942069B5AEB1865EF996F8B301409FE0D4B9C4AA0AA3C 0A83DF34A738FD4F7067BA8FAEBA266DC33AD5E68F5643412C907A02DADAF016 5D171915B249A01EE589D97B2BC042C6A65A02A3025CECCDCB32EA4293720CE9 C6083DAC94559DC02EEDDD9EFADF709473171A454C48526156B510DBF7A637CC B6453BE1149A8EC12BAC378B3140D962DF4BC4C202C63CF9AE097EF96C83188A B3E26E890D24B4623348010E53FA568F9612A5B6726CCD27E73469B5F00E61A4 EB59A4F54050FFBA09B195E27FC897E24B2CF54BDDBE9AB675798D0CC9AFD7AF D1CEA9F49B91B2E9C47BC6A86E448E7A3A5437CB2F23E6F8F9EDB82F1AF7BBD3 F9D95F7484B2B05F0DA51BD0C603DF61EF4AF3A225FBB2D6298A4D53AE07BAF0 BEAADF96CB747F2A735F6E81773BF82D340DA77DA3FB5003896260D35443FF85 BD0E8F3433AC97963E87911957D69C442933594B419595452939C3D96508847B A21A9A711E2D9A5FC8D5E779A2DBD1B64AC4A10F8BDF0CE6E4330BFBB8BFB972 8AA129EE1DE6C1359104538BE5B070F19640A350A2BED399F06B4042DB9ACCFA 7604D5DBEFCB1AE125C25EF353D34CA28DFE70C26F1C22794A1B0969F553E162 499A7A0611F04C686B1F1966A03A7DBDB5C38B08E72B3647D90D741C8E08E5D0 6E89245C6DE67AEB23F5614CD1FAE871FAD3203B57D6B79CB75E6C743C3E67F5 E9C48C4C4F70C35B4CB8A6EBFDFEB6E4F9FC9481A14C1BF8DE042398BC62C742 9DA5A8BFFFCB811B04A4E15B903DAA421CC01EFA17BD6F5615029D2F5A8A0C9C 494449C69B837820D148AE1854422F1378BB2A0BA7433DCA6ED3D91BC3528D51 379F99314C93256A1456BAA79605C013353325B21970641AA126E0EBCD3EFEF8 B9227A764121BEF87B059DC1086E7CEF5E5D84DBCB8343583B46412E89F3B036 735A38592959E326BF7EA412320B28D3C9F1601E09F27722044E75185369D89E 4C59DA7EB5F6BDF610FF988FC47D185B43672544E10F66A73FE1EE3C798B9588 25678C7AFD1D6277544D77EDE81C9CB64DFE3D0D03FE9D2189F2120B1EC3B8CB 33F27EA60291A63CEDB8DB3C984A8E7A110DC22C44CDCBB6A03FE72AD340DFBE 729C3AF2D6176ECF005F6FD544B16C74EA7134EBACC058F50568A59513CD69C6 7ED8923BC25AED27DB70791EB2F181908D6D2862459001D65EB8E3B98EC9891D 95DC1A82EC31707B2134315F5731FC40BCA776C907230D8D5573E70D9E051D58 03929BB6E5E854A4D46023FED8CA84F4F4997D01A18069B5C343CD44589CD5A5 F03E1D6B8092A1C8E132C4DA1BC31E2C3A7630075CB13E7FDADF31B213A2C147 203A1E32A29148904E773D785E842C34E8E8FFDE5F4DAD95C05E055F686DE6E4 F37BD913CD8F79197D5125A64B47D751F3213D3C2591D7D9F73107EBC872E08E C5447E33A633B0B071FC70E0715BE87D0C8D373A1BB2E7B115FCF49ACBFE1613 DC598FD63FF6C1B714ED0CF9300DD399BC75B6E521617F139A0B6F4ADAADCD5D FB6C3594E798F14DA42BDE4726DF791F3F68EDAE03454A05FFE11A58D62E0C97 8AF49CE111D3B43FEBDD2F4050EBFA8F3C9315011D0AC87BE702BDF1BDAF3D56 F61B59F3EF1FD0068835D69B4651231C11F602468B8F4030B35B619539B164DE 7F84D3AD82CB452ABBC620379973C17A919C6BCE06F0EC971DF0B9EA4D969E2D 4E795A7FEEBD71F2BBF3255A6FF71961F8A8CB03692D78DE26515B404CDA4C23 85336B8D59127E3820D119E8798F08E96A3AF66D18E1E9552B42FFBFA459B9B7 7279BA4A255B60F1582C659442AE13015479DF93AD271E84F4B4CC05CFB32E2E 4E86AD5DD1DA4CB2A9BF9D256044C2F927A5FBDEE23959D8B7FA28E6F57C94FC 9F971B781C3A90925E6F29D06601AB32EC451692579460406660E64431AD1CAC CD1A6FAEE8430FFD8D2ADBB45B61653128F622620C7435513A1852E5931FE894 6BDAA0024945D501FF61CA67F8F51ABE78456BD422F98E85307503BF7A15DB90 E9E5EE2945801C632AE6C0214DB8BC5B2FDACC8F7BD3EF0C79359DEFA74C1B06 87C0FEEADC44D1C32627F07A425AC8B50C3D4F9A60C179C7C5E7BC33FA09ED33 F62EC6D863CACF19E574D043C7D75939A5492DB6A65023F34B9153A578625501 ADB5B748144A2362A88111B537150DDF9D33D2F3C15A09FB88F978B5494EECFD C1B54B38716E428475AED6D60867DCCF79DDD0FC14C4B53D4118DFFACEC31D82 79C0B88471778FB4757327E189A35240AD8E85E48DE5402665B03360D93E41B0 F1AE5BCD80D4BD142C3950CB106CFFB0F3BC711C14E38A6D7D0BD77715594F26 389D6BA3D6C90558228AD2EAF6C3E6BC9665DDE563ED048C0240D5F4E378636A 1F1675D8AC7A12E9DCD1263D7C314F4653AE79405374E0CD5F5E02E73D5BA89B B4175DC41EC491E07284D6E764BFB30BC8D9E70554B6EC1755027BF13D9E61A8 0FCFB7FFC686E17CC1160204B934D2973B2E2061AC751C2144CE2813A4ABD729 BBCB28B769034C6482018780F5641F50F79372A56DB775813E9CE1922FC284E3 AAF7FCBEB769E85F2B167F79DFF420F70AB2035190430A3684F1A7ECF1339D73 D9897B891C070DECE1D31E707844350B6D7488C78FCB568815AAFD49FDF1C287 CEC0B909655AFEA8D1E845C777C20FCEDCC4E9B3BF511781E9A2FE95B4DB7448 88DAAF64E99999E78DF6B239FEA3AFF834611CB96CA23E74E89E0BBB0805D545 420C46167DD101308DAA2E8720466E64F3913FA78607B1F0C7594424AA45A41C 5B8F6B15089FB20B0F3FAB042B08DAF7F076A30BA18E4A8E52739BCC675A836A 71754E20AFC14E56CC5041F4622ACEC43D35C756276C9222E7012C337FE04D33 888A3AAB6D39C3C82220C9CAAB746E2AEF68EE034C1866C45B8D8146EE83DB9D 439F9931B86F53CCC506A21BB8561D07D650F809E27EDFFCC9BDC2ADEE76020B 880243AAA9458E2874BFEA10104A37482CAE8E5E79C3D139308ACB3685FF16D2 C47147F530F71FCBB3040AB289D0862276A18BC490F90CF2A6BB7B3F20FADFB5 654F828FF4327698A2E6F8CA641B929B0C7FD55F5BCADF92868007432A6B56EC 221D3CBBB6CF160D9ACF881B5A4B0DD4B034DFC2EB366E31424DDAE9BD2452B3 113BA9FD9CF7A9F685F2DF4996FEC8C28610D7457D81CA6793654C8789550236 6228947A0C7CDE0E602882F04E7AFB30EE51F9CD5A0326319ABF1BA95E24C408 424255A356841F58DEC7EA6A5704713BD03ED43A1B9E84F0AFA168C0C02AFB2D 33FC30815C7456B423646F2CE8BDB9C1818BC027A66412931A7B866E5AD35FEA E46DCC0F9CD8A04F10CCEEEF8F1A3E3005D14C25D4F48A2E06324B6A6EC497E0 7EB18CC22D918E5D2BDFFF1D205DA1D6594F12B4F09BFC64F7D0156CA79F042A 849B3D53E369EEDEB7BF753C1EC0A716F6F3A2E1EF158C4E4A7EBE2F64F4266A 9622AFC61F13F4DE759894DD408E74EB0FF0DDA8945CE1F79EDEB46F4A178972 459ACCB8496D366B4F2AE8CE359BF64B3C69CFED2747A57255A11727E06F0F8E 6AD736B820D098D8E50A17216C02BC48DBE285D26A2BE4600AE569CFA9CFC9D8 3A7DEFF136A8F9719E4FFE3769EAD35144781618E2CD3E52008A8B2D5E31146B 88BA0FAF1956FB6E0FAC983084B56BC86520DADAAAEFADAEC724817BB9BB690B 3F1F8D5D6E88A546EEF5635B01D912F50ADA2EE37A28081F3E5654CA842DF2CF D46C103A20D82CADE3043F54711C58F797A7E9AC3CFE46E76F2691B5ABE69DCC B112BD8BC48E1AC0BEFBDD37B19050FDCA801A4B79B4DFFE90E24FF931E9FFA3 1241204ACB8DB462206D944164FA294D6A704BD9F18058E636F67E453B04CC02 99594F56814530F6844394E7987ED6B85385B1EDA874954DBD79BB0501E6D2D2 86FB2FAE85365BFA19FDF87EF29BAEFA9B889FFDFFC2E563B1B4C7B9759E997C 22D55E3B2A8BF5FD6E00F2C87894838C3551D1D059C3886AEADCADDD1E9295B6 E927E8494ED12CC98DECCA0C540B43CB5F76EF74A1C87A14A4CFEA1F008F5364 3C1D27E9DF8891CEE3DC61E27FA05029C561CEAC683B48A08F0330343787E830 52C37165821E0653687C11ECD34D3366767D1410A39512524AC9B4F7CD9AACF0 BD3CD8CC2AC209D8AE334CD9AFAC62547A6073E039947C606D00992E62B3E971 C8D7A853E97F9B61AA0954A559CC1A6EF6EC5A4A1EDF2538325F0214B7596CEE DA342AC3C727C19AB70EF8227C7A576C4DC461E770AA2D6FF99C5A65AF5D637E 95EF521FB771665011DD658C6796AA61799C7E0CBF50A106C9622D00D77BDE68 E163021B84983A2A7F7ED596580FA7FA0A7311C72194E79640DD4A2B954C5D0F FA18DDC6AAC5DB03B8A8368E0894AF350D07836F74416BDF1D4F7BD89EDF86A8 006549911021C81B195E020B63E7BB24E1401BCF11D3AB92E660396D74B7E1AE 7377442962F7FF2CBDD78DFA364E490F1D036F433CB7F26E2F0F6B0CBF876E4D 6F2BD7AC44AEEF78AB97B36AAA1B164B29D2885B6A8417819EFE552AA0E059F1 13303AF6B4D2FE88BDAEC14C45B4AFF9B2B274D622B386B87434A43B5FEA1157 E679F3A0861279B3271D4CC9CD1A2D20B70B59866B337472F1AA9EDDADF20182 6C2FD0396F5CCF81D7C995EB7CA5AC6180E4377028415D7A1179A2FA3582368C 6E9498CE308A15B45BAC302A018F0D95E694F7C1BD63FB69472D782C990FB3A8 33D7F76D35A11F44DF59EB5D8145A8AD427C1AA830FE8ECE45523DDD3FA340AE 5307FEBC47764541F0FA71B0D13BD2350A19AD24451220C7315B3C1CD40184ED 42E0DC683CDA39251E30EE688CE770C8D420BC8E9C6BD46A949A5366780DB74C D5D8FD54B16F483E2E54C6203C1A3226CEAF3844AC584944CE91D3CD09C0FDB4 6BCDD7C352F3D02810083BBBC597D3FD27DE84ABA974FDE0F74C4F99308B860E 43705E4B53BB15C4EFE2C4FC51211BA1A6637764274093F9DD9ACC979ABA5BE4 98413B8C221F0B275D3A2FF43E0D8800199DD565B395E2AFF92948393F971784 6D2B454185AAB6384ABB8C755C0C2B5DD98B51288F1BA1A77BAF84E0E2C93DFE 3A51ADF85A268A228C01BDDBCEF890F336AA33C4DE73471AE768CD429895E7C4 01A9F86DCF8A6C51B8523A28966BDCBDA01C5A7C43390240C0B964B399B88875 D5B55E33E66A5461DEA75C0623DDBE5C378A21D28648017C969E7039652EC98B 221E51B66EB9D8ACE0711DDD37C0A8F81E225DFC3F7808294F0D2750BB756D5B 05CE87675DB825E4D035A58C825ED514B691C0D782F93F8B980BE39E5331EE75 14C0B2BD158DC6B41FB0A84661BA769FDCBFC69114BA7F1CE137C8AFD33FEBDE 5461D0A2F659253D0BFD72D596F598F788D592D10CCAF7A9DC4C5320D18B8F81 117E9C48C84613D32F188F99204A0E2B223B9069ED3FE08A27E32FC0C1E0FBE4 CB93146BF9F2A522F967F27FBF5049BB2868BFD361D4AC1364D6A2D6ACC6E382 A8C59DBE570CB685253ABF08CFB3FA7B558DAB8474BEDA6EF7D76F93078F8622 7BE47524127B51339C72379D2F70104146142FE73D83974AF7E978F50B8F5762 04F3129B96D231D2C287BF45B7BEAB6A278E0560EB569C129021F19B9D0F2E68 79B047B61C7CB6337AF2446237285C0777D283F80F015F92673E30F271710EAF BD57D346753A6E4F5D9287368B3FE8C86AD1ADA5A36CD0A79D6A9A3EDB545981 D4E75B5285FCBF3EE24723AE1488D2F309AEF641C82F7424666DEFD484C53723 CEDC5E42713FA822CC68429C99676EB95BB625B405F94CA6E61EFDBA950CDBC2 E92070C9A43E42BC3A953DEB2A530994BD2B4D3B47F6317DACCF559D2ED72E78 7F14D6B6491056B7CC0647B389C0A2DFDECC8CB1A041D7A2D42B9871B78D73E0 670A5071DB5EF6C558C4A3FE034CCD2B8C7B19BD0FC269A7855A92E256462E2C C6C4E0C98A13B33CB94C4718B7E5B428ECE739F5A29BEA567D7590E0B32E927F 35B49B73919BA038269C4E4EDB3010CAF786EEFC5B4659E4E125B9B99DB9F7E0 18C54CC07AD37FB00B0A73223EA6A96DF031EB62B9152A93E9103EAE279CBBFF C5C413BFD2747AFA17E3AAA3FD6DE661AAEE2D000688980A238E17932253747A 71913EAB520275E12A5600623A27DCC50DF96348805BB06AAE1FF206AB846221 62025C52565A59CD972D365A393EDDF1AEFDE652C1A65424A20FA9E91541F563 5A3FA92DDE2122A9D6808F63FA1F4464E1395B911C484B8185C4F8F455C55EFE 2EFAE97D33823FB2F887613ABF07EEA0AFF77FD38FA83F5FC24D5926A6F31096 59E18066ABEF54046306C1CE7A18B8440AFAF1A54A6C01C37EEBA4BE6E665B89 60B7B80874198E86CC5EAA6DFF03B3C31F89EC8C9F23D674A93FBF02AC458C11 BFF459333D93E06CAE4A0637EDFFB7E0370CDCD133EDEDD9F73AB3D778F1E997 7B58FB6FA47D6F2E4AF31F093D07C8169A4B17423584B28A8AE5E346DC0E758F 0CFFAB29D7C9B280A9124CA683EECF82B9188802642E7D445D6A25CAD8C78370 FDCECDFBF98C1BC85E0D02CAAB7EB865D6993E4BCBD9F9CFF4E2254D8C545A34 239DD33D087F15EF365E9DC33C9D54DF537DEC814660C11BCFA438CEE703F027 2CD249B4801F4CFD6C0C3F7AA74EFA18BB4FAD68D456ACB2EF7BF2AC99848855 46AD76B1666D334719315770EB0A6BFD6E6AEBC045122B16CD19E8DA0685F497 BBF759AB0F764C8518125F5205D91C1045B0EC4F47FB3F2149EBA156C53B135D F3669FEE01404F3C835E673F7B4A00126CE0DC64443D175DF5F4DF1A8272625B 3CFD063E90323C8E58B3DAE0A416CA3C2B58E325BF58E77326EA8F4C3D22E820 649CBD2EE8D58E94BAB14D70C80AF82DC8CCC7B9D6AEB3BED4C667103A36F292 864A8C1ADBDB825A73D7930AC707CC364CBF4A44D9329975706CBD79CD0CF0CA 626D8DB98AD765910BFE8D6ABC60B252B4B978A73CE4362CD79D65B34550100F 97F8DA72F7B42A20CB850A9EB919BD4EA83C8A2C68F7E46F3E36C59CB7A4D637 022A4A5C607ADE635A7D89629E77C1ADF648AD781DF5E5C573DB89D3FDB676C0 2B6542B182F3D5CACC69CB3220C297C991D1669B44917F7540C32D287BD39F1A 82D171E293E5A82BD8BBB8DDA5EF019EB5DB5F1AD5D203184565F8A3290E5295 64699D2920DF71D67A511BEDC3CF77526F09D63BB27D1261230FC5B33F99C20E A28F938A2419F970454FCE9D2F90FFF91CF1D261A9B6AA8C4AA980921E23AE7C A47B4ABD00320B171CE854DA331F5CCCCEB6E42008B511AF7031583BA289DC52 B952A06A23DF06C94BCE9FF08EEC2B40F53C3153EC8FBE9516DBCC428D3AA1EA B57E3D94961AC1A7295E0B81840A902D005091633DC66203503877EB861FC27E 6251280A71C3A9A90FFCC69C1712B375CABEC0853B06B3108C4A663DD3A2835A 4F3074DBA802804B5BF5EED84266A4326E699C10E6ADD1EB65AF4A47666D9368 1C1FD27E5FE125779C2C214B917AF3CA05C42841AA292A7952679C75D403DF2D C2F230080A821145A33C4F5A0531B486B94260604A9EAF8E32D2F77D361E13D4 B6B989A17333A8A03F739176ADD0D09A82F4BEFAF9B253731A9A65150051934F 7BBBC9BFD77FCDD394CECAE01FCADCF22667D5C5888B1054BCEE3A02211577FB 9683D46F8194BA7CF564A10DAC73F0E3EF097B64626586C142CFB27E5CF1C6CD FE4C690C580557ADA8AD8495295B545DEA1331FC0E84EE0FFBC69BD4C9018B72 DD061A83D643F9C1455E32E5FDA21E97230B6F0B96B2E8F0B564218B9DF0130C D93BBEDABFFAB266916082F4D6C86BD1B5A5FBE2315F66971575511A07F012F3 A8C4E600D042849C8BADCFC0EF75FD3EC53A45A8A307B7B562038F0CA4F3AC80 8C6C4D3C0AE95E589FB69FDCE4467FED9D65A32E8EFFCE8172602B03439A881A BBF836F8EC1379846D32FDDA53E725882B2E864A5FDAE1430AB498D29E9A500D BAA9F794FF71FCC85916A433E5F554B59C3CB7D9AE43C31934E0F806B1422B20 EAD946B36E4E19933DC1534E5D82EE745A38B47EB952621EFFC0144C741CFD4F 08E63C426844537B13A501A5EC2594F151067DE61CB462057112A0BB8396CF3F 94F488AC3A6C93D87F5762C237DC735F21A27F53933C6B62D847C9A4B2B244E2 25F50E2C3B2DDACBEF0EB96E6B426A660AE58B24A7A1416666625C8686C75A29 375DF77848DEAFF0AB255585CDA091C3C1E883143D31844A452EC0959F7367A3 CECF701A2CA844B7ADC23CCBE1A7A464464F1A44D4741949B5797AB3BADB5AA4 419B3E5ED695DDE8E09F6B4A0682ACE6F8A2EBEFFAAD1ADE12E0CE18022A503E 4BADDF3254DA58FAE13FF8928C4AA20FB444C210B5D86A321F87600D47225B5D 8DEB8548B287EB6AE949EFF249C1D0CF332DBB8B42A25402CD660E7DEB861924 55E6B63F88D258995909EB082F9CAA89DD70B7902880B4CD2A40316B2C302A1E B38903E934D902C47D612AE3DEDCCE5C2739FB7BC19952659691458BFAD9B2D7 D3D501EB948B2351B4D447148AC645CB5E1D27E2DB0727A7C3F21F65393459FA 7CB9BF96E169643724E991D5061645893AF8823A7A0B66210E6B514CD5A51F6A 622DD091F0EC4AF244613E0921952A2EC11B96F826F612134790D24A830993FB 73790CF1D4E64C884A4D59FAEA2EF0EF71D15FA0510C407F11818EC62DF81122 94A8248919672A2EF6394A09D00AB9CB72B800220071B0BC21331EF225F798E2 42997CD2E33164AF472E375C2D9972A93F4BBA1C4B6F8A02816E856D917FC4A7 2FB9B2D27E8F64F5AF496EDEFA0CD202D2309B8B894E27FDE00B31D57818A67F 97C7ED628D30B14EAC63304A6A04D3D2D7C80BE37A8D1151129DDECACE167B40 21E826598ACD05DCE5C5D8F7000818209F90C3ABF5E9FAD1F7A983920C3884B6 B8F8C1AC68980E4EC89FF127E952E0775CEF9382014D1A071D49D2D18B0C3298 7A4F72B26D405FD0BA956C41CE27E4F71F349359B850AC396C17E508AD4278C7 80520EF96223D93B0BBEE0AC9E22D571EA6F653902BAEE2E4EA8246C23CE0C18 6BA645F1AD88E2492A8DA092BE4573B346BAAB6429CE63500BFA305DB26C202C EB51718767821CC3C4A8EC246C062546D56E435437A64B1070208D73C76DDC1C 211C7BE6A7C8FA0654DC0D7481B6C4EDCB405565EA088F22A88FDEF9951EE253 45E041733A3AC1BE0530C8A76E85F59E65CE803AB9866CE79271BCF872E683D7 D5B0C2A1D1097611A352EB5E938CEBA820A56A140E98BA35434AFB0E918BFCFA 2AA54BFC8EABBE5F1326731CDE265A45B5B6939893E7BB8F092FDA6A15EED96B C30DE69110D3D9B58A0E0D8C76987E7E1E84030523370D3B3B3C19DBD8D44AF1 A05E05FE7328CD33F530587D7DB594316377B157DA55D506BE5D9EC955000C77 13BF128AB50F304DBA1BCA599876FD57104C53C07671EEA86A4AB759A3D1BBEB 0B774705B5BEEFF2B9C4B4D871FAFEDA0195F79A0A30F5C321A600652B8398D1 9DF399EE35D9AB077FA73DA936DB911DFB54B8EAA4F8BB84A83E53C0695A1743 25EA0D6B471A6C3374482906D9CBA23C8524BDF4A46EFBF0B0E1FBAC3984BE61 595916BF2ED81DD8DA6C8BF198747EFFA72E65DA1A3EDB05AC47A21EF73EDA8F 7C4F7508DD447FE8770208F240723333BFCB2FCA44FF5D5B6907A1431D72ECAD A24B19B6A8181E572E56B22B35F44C3AB082BF236842C1F7C3E8C21FA2738ABC E69DE90F8E88D5172B69E53A14F03F6EB1177F8DBAFD2BD353AE8772CD2FD428 B05D5171BD72B1D78DC0C445840F43176C0FF865833632F58AE6F65B65D36532 91C708CBA6227B22F59C7299A0445DCCA0727CE59BFC844419A88681EA85E84F 86B210D8BC9F61F3B04CEC99E40E9C2F030A92491CA096F64364D424B40D85EA 4BD505FF3CC659EFF5 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSL10 %!PS-AdobeFont-1.0: CMSL10 003.002 %%Title: CMSL10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSL10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup /UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSL10 def /FontBBox {-62 -250 1123 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def /FullName (CMSL10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 45 /hyphen put dup 49 /one put dup 70 /F put dup 74 /J put dup 83 /S put dup 87 /W put dup 97 /a put dup 99 /c put dup 100 /d put dup 101 /e put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB 5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B 966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD 94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E 4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D 8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C 567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF 62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC 38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE 730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F 021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD 97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B 362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F 9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A 44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C 683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D 87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF 550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB 17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB 3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B 1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A 8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E 7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E 523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE 144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F 172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC 0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E 3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E 993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E 0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A 6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 AB7916D44EC2210CB941B1455867E510E9D8A0B83CB645BCABDCDBFCD51A4E12 60CFFEF0CCA548F654037D01CD631FC4E1F97B4F65DA9AE79D99F13A726E93DC BBB027B7D175FD17A704C4668F6F8428262959DACA9F8C687C923CFA053804C9 9B2005FA7E0F07D81E52A9A37AD5CEBA8EA63929093ED0DAB9F7C99C82A50E6C 6440387049A0C359218F5268C9A28F581783BB9D29E08772D7252FAFA6739687 22570150178893C418531769CB3D96F799BF1C6415820F96B78BD1D5A73E157A ECB9F3F59C0D736946734773AC3D7C9D53126432B6B3DD17FDFEA03D4E0C9C78 17CCB865978492F2A9FA7A855C906D222033295988EEF54D2F40E408D52ABC83 1EDE8F5F1DDDA31A8F17A3CECF4206E3629520D3AE254B77057D96CFB04A3AE9 2014EB00C07DCD7651B5E90265CA9433FE878B44FCC817D5F13641D553C557DB 4C9CC137160DF87F0E3DC9174C69B2BF6BCFBCA1868DDDA90AFB9C2446CD056D 1246C7ED09A99BB8D79157FA45DF1A4A5582FE6A7BD96DA62388D7CAC1539F78 D4B94A6590D3EED9800F98038B815CE363FA4F56E32CB0C9441367667FBF6BBB D50DB609402431B2D44C185525FB7EA87CECE176E0CA07E995867444B96F1863 2538FF2A52011F710960E642E963856D19410A3209EA85829E403054DAE65C81 8D8F2DF9AB0FA670ADBE31CE9F1224141490B60FC829771A4AE44B851E310B4E 126004F35F2277BC342CBADB1C6AEBDC002D6E5CBA75B9C1D288CEF40A44CDDB 923229BD228491374B38A7DEF6A07CE397A76136AB7FCB66600CF199FA3D858A 37071ED9373CA14531F3FE3137887743574546C2A9B7C8D6D43CF90BBDD9C40E 5FB4607F8D8D9BD20C2020EDF6F49F62E1C1C150F5257F5D224D733C9116A372 213A84A236A70EB0E4C9D01F44753131753F9527B297CE84F9F13759C0987ADB 42F6159BCBA3E5D7FBE659D44F279F02FF5B1F567FB99AD8BE47D28E7EC36125 74DCBE712829EFEEF4FB2911087F795ECEDA629A3FA2D1793511BB1CB93E3BB6 59921F806EB06B205DEE539A762083F217244C5AEAC2B2FB07667A2957B91492 596756DA1D1BF5F456BDF999EC40F11193BDD2AE9127C7F5781BEE7C3338B3E8 9A18C5A3152CBC43DE193665207E5603094711F078900ED1C89D1F8C73FFE491 8449C0D480C5238087B40D67931A16F799B4DCCA96359EE2A853061052786445 EC4CD0E03B3331FE9C44C9345DA27E4D098F3CE3A7074A663E5A8458DEAEABAE 9F8748CF9B52788CC0E22EFEF1BD1746E65DE671AF169EDB6AC33B4031B7575B CD23E8E05DB3F6E63059D9452FADDD4F0673364D2F5F08BD55282FB55C1AA7F6 F915E2018909D1AE92D91FF3D498AE53BA5BA3E9316B42BBC5867C57CD99E0CE A85732A574C0E5907F56ACEE61BA017DD59CA5D2B4A64ADD87D782833DB8BCBA D6CF6C382151942781AB268A6465C0B49DA2546523E8B2EEA84AFD8BE0E2AFAE 7B4FFB9205410A6F0AB4C56D330C30CDC6EA34B51A6A4D692AE87F9D695C0ED7 CA64716529E5D995ADA4C835DBECE251C41E917D7FEFC43277F0893248DB6157 AF79E4203D0FDB000C5BE59AC1BE7F2AD9E66EA1B27F96002F4A7B52DA201E27 D173E7C7AA02EF37A511B760F919C11D9B552722518B48040D40CBF9B29E85F0 DDBA49C3E70347FDCDC3CA417ED19E54B8738DA847CDF72BD870DA9AA6C8C869 72A0168ED2F14FEE8DD50B9B1A649E374E8669C8C016ADA748D48D7A63F2C05D 3640E7C3BB80FD79197C49C6A47206474134CDF9B30C0840DFEF56D0C71660EE 1B221AF91E6E70690CCE64B7182521F4B24C5B53BE4809580F9CF124916E364A ADE02C5CA4EEF0F95A54B34BD9991A86C0966240612C3EA8DFF4C9767AC0697C 139B2F2E747B2B021C0FBFA90FEBAC260BD310F25C5B9CEC14A0FE23F10ACE88 4F145931177076136B30A2D326DBC23119DFC43A0C04C7E7AFF9644C1AEF4B03 24576D8FC3849EB2EE8F36E36A8199706DD2BA0736B2D3CCD7ACF684D4FCAA32 10A9219780FC9E496DF3820FCA36C1CDBF60310E815926E3DBA959ECB9AB4349 43F59236D6B9E7EE023D9558C7968B226698F6B631DB269335ECE07BCB8F9BB5 A331276CB8ACE8FB0AE60DEB9F79A358E88242C2AB3CB99D9F0DE7AA3FE5FCB2 C6FA5E89BA86646E7EE8CEB76B06257A5F7F8782E6219F9D31097BBCE2C331A6 37920825A3DBD586AA755C9B09591CFCCD9FA2130EF1C556C1EB913769464608 AB18ACADAE060D73D9F109E21E414D5DA6FCB75B5B649D91F94B24B3DB882DFD 969C7A6FEEA7CF7A78C5B681E365C9D902200538C5E96B3016FE18B7E2530382 3433CEC6FF33AE3E4381EF6F5357F73DF3649DB31839A6DFC1251F27E95D0ECC 9C72764075EBC26AFD8EAE1E4E58D3627D6F57F2FA5A9D72117469C7778AFC7E 5D305E31B037E1A6AFDA7188A0340CCE56FF5E9D8E283D3E6D4D1BE3E036D02B 82100A7156CA52C0284E92E00D09F2EC93DAAC18206589BA94E6B495EF36D51B 8C0DFCF7015D94F9D124C2E4B2AB0E7618A59518054DC793093905FA3A127A77 66FBF5851D5B71DEF02652F0BA18C216E54AC25BBEC81F5609EB7A2DF6E8DC5F C2AF9A36305E360740ED8DAA113F926A3E59271F8E88D62885D941C0418E7467 486F512AFDF1A518A5E131B07707C95EDAD9AE420E39258A21A11209AA1A949D 5CE192D40C2107349E44BC1722031701DC85F6B37C883FA72CF27200C4A9738A 00AA4D2BF8E74707A016215C31B4027C716BE7DEFDED8AB1D0B0CC27E9B45F7B FDD7AFBF616996D06923C63D3A5AA48768EC4379F5EB45E2F8100E29B95F6C4D 5028F3FB1C8B068181581D4FC16DA48B59BBA3FE31899E00C1B26342EFEC6F15 E7F3F48B41607C5674B19920A6E62C828780150AECC151680E56AF286423126C 04AD3896C7203B9F021F8081D1D758BB06EE01F3A0DAAFBA27D332D8DA3B8844 B5E1546C21CEE9BABF84F52F7E2EEB89DBD3CBD340D48BA1FAF537AFD4E6AF51 5D601165346D652DC224307B1DC9ADBE2408E68BF72A284A3F3E1989A2F7EC15 593882B36BE1DACEB31D839D099EC972A3E0A898D5A8C712FD160979E6E73602 3C85C901FAD0643CCEC6C2054B966978A3294265C3260AAAED059388B2A74886 77F5B27D41FCA5DF6E1BD64E2F798B04297FE50282B12C1E156DB96C612F11C5 E05CE70BC916603CAB07AF435275DB2B94AA8421B0A7C208CDCD9FF5CA4F631A 8C68AB84108DBC48F56F488A4C67364F7B588518E3793D64312FF17303692694 83D44A77F4F81D806B129B2AD51D851B56183EF6B88BE032538FD10C75E80B8B F78DA82F10E36BE9C751A6F72F3387139FDAC341F8D561934BD025E2E3BB1840 B3E8671C2055A9A08F324FB8FF01C14F52400FF3BFB77B401327E3F05D8A2522 7A0CC21ABB6E95725708ADF6FC07BB7E82668D944A03A9388D91BC8D314F4FCA 3938D8B759C30D26E7774D2E36B7DC6739DD014CAE4FDBBC6F3ED465C1242D43 CF7C877356F75B34AB749E408D3C4DA96983E597BB763E15006CAB3F4BCE8A57 54F8B7C4F5145E9487630165B0728930C29E257D0A9E91874EF5959A743F0C37 9AD6325D5BD88BBF0E122135130D8ED0DF307B4D9B2026DC940E732CB4F48802 25461F263DE5536AF40E41CBB86537C7542AE47D9DF5FAAD5AF1489DE11F83FC AAC0D8E80FB416B5727B71ED29FC554F9092BE55BB4D78009E553136B9DEED57 6FC3EAEB7476A1CB4FAFB6029AC485A190D55E84127691743F484BF7BB03B2FB 6D7D213E8BAED2CFA11FDC99A7C7F89855E218D564D015FBEE09DA0CE9C2D038 AF23CE9E4395CD9710BDA3458EE519F4D11F27AE73A19A0953F9DF6EDD8C6FC7 4DD1488FAAFE6CE9C3149BE22CDC2BDB098C9B9A98FD9F2F88B47485822CC904 4ED033F76EB839A562B3BAB9A4AFAF00AF6D367DB4505BA82614EA8A483DC929 17F03813D9417E850009667AF66873550999C09EB059BCE21442344CAC6182D7 A61CFF35CA442051F4F4454E5F13211638894B9315136DE53877E03F5C2265D6 34AC591F8D7E94A66F0663F88AAD4745B1E957359D031064F3A297CA0A6E0EA8 6577436D9C7BF9511689CB845A48DB814FB52E905848C13588351234A594F900 3B13D79F202A0C62D12C9CD1A6A8BF1D1EECE3D164839DE54B244F158DC45804 74B114D22B7B4D8000F8750A368841A8B4B071DED73268FD6731C7B70FCE8B43 BA09446D4A9AC173A33E587FFEAD251F634385553C568D119B2B7E0C9B254038 670E6C28BCC8A3C0D04554302616B399AAF2E76E61D603D58511AA129369B18F 330C5C40E556859FA07BEA3848D89CA045D77D49ECDA6E7466654BA2821657E5 24E67D3BA652241908AD3F57EC4867FDE6F40B8EF919B1456D253570509B449F A8A74F743BD1A0958C0659C9469DE28FF023C5256784295BE79E37623CB8ACFE 2FAD9C8D5167D4F8749B14EF6AC64D11B04C6381321C2109874CFD2DDDC8679F 6ADEC4A9B304E0CF65B2A8C485BBF484E41D022D0690FEE252B1A67826BD29E0 5359C8A7C30866CA0B19EB9E73642468E19D724398B29BE807C5BFADEAA8FA69 79C0AEA23547EA92F1F46A62A3A651FA8F474C2802CEA95436101636E37B0BD0 B993C84D7A862949EDA24633B90097183365A314C099DC170D7E2050260DB513 377B59F1E25DA1FA03D8EC97FB14E4C0B18D7A674DFA8A6680851F042FCC13B2 EA90A912ED62C79925ED3FF8D638DAE6B284FE572954FEBCD7F7D7D81644263D 6DC889A2574319F6E6AE0183DE5A8E6EF4016B13B7736BB5353390BEBC1C650F A8D4E99BC6B1E36645EA4219ACEE1CBBDDCA088BBFECAD70C619E781E99463F0 195C6D14DB312CA838BBEB5179F0253FE33E614DC59EE130E5296211A517B092 D7B59D11C2CCE541787119AF219AECFE5A690A7B74A3C32E62BF7198081DF9A8 E8A7D43A73C82BC4C6BD5E1F002417B212C8BC05D9760548A3477C583D69F09B BF5E31DCC7DBC887A7FDB5C703964AA732D63FC9EAA8A4C47F959ACD8F574F39 23C5FCD29A726BD83706F8FC32FA1DE05168B66E187A59F60DC82836A13E8919 A63263BF4A8FF99FBEFE22C8FE8272669DD6CFA0663F238075C47570E40D9840 947B625B4D161A56FDEBA7B1259A17D9C926280C366E925166D289A0987E35C6 0914097AB29C80FDF5B690779C1D7116E8679F1EBD6439F8C8B3B905CA16D263 B978F5898FA77EE4399B6751A025DBEAE505883CD9701A043FD899664DC6D270 31AA64A6044AF818BE148E27DA63C5D888CF8A4E052F16D4906F203F64A12DFE BE25B416DBB2B862CF9270D11A3607435806528D09A9B0224F026F513C03E631 572CADFE67733E6C6E8A4B25EDE0BB26C157869595A9A2696043DC8EAD23D701 5229E2CDFD506FAAF8EDFB6CD2AF0ED871A951D77E82B2A2919901F1FA2468B4 E4E4B5D744A015261BF045D3A1D94A6E302CC524FDD9FA1C9C9AA3409C20CA17 35E71D87C75D192A8E0AD2F5008E7A67991D15353490C7348F3C2E721E0DB973 6872D0DFD4053911EF331D759B7D5766C97073BD0C9FE7E4AA0604D7196E081A 8C2A8BE6455D81FAE9176E77B06F1BF754A18E5407ACA22B45B7274122F054FE 5C7D938049820D6E79650C49AF32CCC02A9556414374CF185294CC9D75E383B5 D13A587854944C245A2008E0EDA07346279239669FD69CF96073C337FE893876 903731034EB930169C5ABEC4D52C56D3517FCCA939164E67DD130DD972CEED36 B06C2DC828321775E117D2F2FDEA34F037D84740CEA408ED83799A3656F5D65C 9A654CFA734DFC2EDB7B78D290779D33F87D8F7AF4D2401B310418F0FA99F851 820EED52D2F0DBAAEEC012C669B1FE7DC6354D812BF2E136BD14D061832802B0 227E3D4D3E02CA9200E89FB151551B3C76385212D3F481BE2C8D6CFDEB1222F7 0051EB82CD4E420F18CEA057868961DA8D1CA1F1540698C5D0FE5DB3743D73F3 9ADB9976DFB8D435C2683CBAAE7A0DFD85CEEADB2B91F42528F3C0308E392A9F 5DB4D9A985E142CCEAC1AF8479050408564B576BA2DED06270620205CDB6747A 8CD916B65FE2C7A0D57E4B08C54C82258F99AAA4860099627560F209370D56A3 B7DD3E985A563D5F82179C9022FCC3EB8C1DEBA99EB6A2145BA78E3D59B55651 90483D7F9E3881CA641982E0BECFE66E11D95892081BCF75C003C41A329258D5 59A811F5834EDA2D9E5AF318638F3D6D2699A9ECA275182B89DA5D0A48DEAAA6 3DC1A0D58DE751C58258676B39C91216027315FADAA986E0003D8AA12D392B9C D2E9BCC906FBC181ED8DB335274836E1EF5244D5DB04BB07D57FA048C95D0AAB 53195B44F4483CD3E5303CA328C33781C853CBFE862C442A56364ED34352A2CF 98D23226BF6B01B24BA577FC5F1ADF77C6D30626535DE9EB05E974550FDBDCF0 619BBB766EF8A1E5533AC07E396ED562A0965BB0C4B67BF056F877DCF8357252 8A3594270514436B425F51E51E8EA37F87C0B156D3C9D75324528F4DE8E45C2D 0ED6DC3BEEAA6D527E4D4B1D2003F361EEF2BAE040A292669ECDAE0FB4F04314 4C9919B8BBA3DE1E0F462C62C3700256A5BB0880A2AEF180F41077D08E1566D1 A686CF830F1878160E42CBDC6017096A197A4F7B0479D930E77BD4DD3A867A82 B0A0468A6454EFA2439AA75AF57027BF80296B12DFD0B0A2D023DB9F858376BE 9A3E2939CE5ACC4602AAB3142F452988551614CDB3258F7D29ECCF86B6BA099E 35FA38C2095D8828AD701A4516A328079654BEF7B7DEF8C968CC6FECCC16F784 BD4F868C9E1949B79003ECB3CF3231AB098802B5A290586003A1215D01F30819 9CEE5D8A335DE4D8D76426EDD2B78B7F36FA48D5F02D78D5C0B01B73834082EF 85571197AB5FDDB24D8EA5F0CAC9C6936CE42A952436D62E0B8AADD3A8120EA1 DB73A963E39A3A7A45065AE7B602F7769CCD2F2666B38FA49CE5320406CA6C35 FCBE72CF58A6598FF9CF9A84F05946B23BBFF4E53C36EEB8D7E06BF2056A346F 656EFA5330C3D10387E4B6F600DB7F29F5E6F14485398C6821100576EE7BDCE6 03A32681F6B4630C172F2DD7D04F896AFF740EF1AADBF4B8624B48F8DA91D511 CB16381AEE57C391542EA0B8E965527E8512DC115830A3AB702CD7688315A5EB 617BD38AF6F2B63E958E42C5BBC8E63996FF63C4C38D15FF4D508953920E6775 871404A90176465512689E465BDFB48A3C02157EA82CA04B9DE378CD4AE3478C 0058FEDA977A2D2FF94747C20D4537B7EC290974EF9E06B9295632607500C782 1A6511346B3BD186B49329A8B16B9DF176051ABB97C6F2FD61EAF4FE7A75763C 1B5EFEBC4B0DF1093A0D47469CA6930B9F7895EB69E2056D4ECA05521C59667F 48C6F64D922545EA9E70B1B5A2E6649689AE2DACADA0CEEABCE5C3AFF2873545 D2B6FAE5C3118B02A6C6CC4664EC518B448D0764E1D9A7AD353AFF6B2066853C 2BB8277864415CACDEE7622C4CF94B8FD4012F1367AD8EE2917BCF5903817837 DCEE7A4021637A028F17D03E9432F211BCA59C55F8DBDB8168DCBFB36FD9598D EE536E43E81BBBC06201929831375AE398EBCEB567F441A8F9FEE1EED605C9D3 38323470DB15FC7DB46D267A813F51CA8E93EA7041718FED9E39862F1F45DAE8 13CFC8E7C1898468239C6F6692C45310CBB974C3DAA96F3C0D98B66EAA217C25 A5B05D4D58E5A2AD9582D003DB980EA1AFB285E92942E096109E0F351E09887F 11FA623C98F9CDE587C066E25A8379D1B20D86498BAFE5A23C751014185DE92C 4E575F9F43F8AEC331A715B9B449C32C4FBFC2D8F9A647012D765BFFBFCA8E93 C2E76CEBCEC898835C2332F5D8A20676710D4088D30B70C4A77318FC991383C3 15A2B7568240232F6E78FA4F4F06724C2FE35D7246D2F10EE0D331375959C830 8A2B13FE1E52C341EB248634CE06F43CF3F632ED010BBDD3B2F75476166040F5 F851E00E7C5A62B65369402566C7028604328FD097AE8046E6C25E6B818EFC72 901C62CD0F26D3B1C02EC09BE1EBC36ECADB2596ADF814D1611E399ADDB67E1E A24DF5D779DC788FBB07BCA7599A0590AD3B17EF3F132BF588F93BA1B41F5DB2 518F8430A38DD6FFC415251E6748081FBC8E12204AAFE03587696CCCA2B26174 500DA9CE7C815CB1180401C1E8769991198702E438D5FDBCD28F2938F003F784 C6D5D64315BA9362BDF36A4AE81191C46CCBE00318E522BD5673BAB5CC172D51 3F89B1E703EE 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT9 %!PS-AdobeFont-1.0: CMTT9 003.002 %%Title: CMTT9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup /UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT9 def /FontBBox {-6 -233 542 698 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 51 /three put dup 55 /seven put dup 58 /colon put dup 59 /semicolon put dup 65 /A put dup 66 /B put dup 67 /C put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 87 /W put dup 89 /Y put dup 95 /underscore put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 125 /braceright put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA 610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE 510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF 93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A 09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C 0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C 94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF 409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A 0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B 3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B 7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D 8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC 2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C 54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD 6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB 3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF 573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA 9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D 15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC 9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A 1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA 4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D 4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D 80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F 66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E 2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A 1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC 887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD 15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B 9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B 7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B 9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A 97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF 1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E 29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D 99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE 480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB 587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C 839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C 320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F 461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A 3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 097C4995B2C3BAB2DD04B1A7097DE16DFDD76465E79ADEEBA90489ADD0914EBA 53E11A43ECB11D072C68D2131BE1C7C43CB9DD5FBA0A67BA43D6851AD4CD3BC7 39AE2E22CCC183A56CEB71D4F9F578518E376426E42B6390426A8434B5A83E78 77A5B9963BAECD5FA5521C2A29418764E4EC1A72462B04957F823E2817A7F8D0 1512919889500024B1C42EC107E8B8533C0B314EE4E23313A4C1BDB009A2073F 9BAB479A3F9DA76CCD65629CCEF78015ADBC2D0D124B3BB2D322FC4D209E417D 84BC3C758B6AB64A01E25C9C7B71D741AF90A19A339F99A0BE9FC39622F04C6F 737474CFEC19C890A657BCE192B9DCD8F273CDC5294875DD4507DC5723EBB357 73DB0933927DC21081E67E5DCF4E41FAA6E00E8DF04128F86348FB0718068FA9 918319C4EE9D090CDF348153B6CC48648C55E889B4FFD3D75466F1B50C437546 7DD9CF20980B148F60BB146402DC0732A27F255DCB859CFB6F9D329C12FB14A6 7824D6DE27B03FF85BC59703A5D6C5B7D1CEBCF3C3FCD71D6D6F0311E41BF8BF 0609D23C84720FA9EAC961C9D49C2E962D9618C32BAFBAA8CAB0B2F616E57DA6 8CB44C5595A22D6536036AA3F9E9B278571FBFDF47B2F1F4D97ED2666E9E230B 8500BC2D312B443B447D7433A75519B9722447641CD9C6464822BF543F917360 C8B6E2F7E8722E2E80FB7B5BFAABA62AAE8668897D6269817F36D90E24434CF1 ACCCEEBD0E4DEEC122B2C015D5478F2F892F3829D80CE5614A7AB03347793915 EEEA1BE0C4EFEFF998108A70B62BB7A890BC20DCA43590F99B2831713B8A97C1 89E671C4826384CC25354A9B36CE515AEFE9B5FB4338D21F232CF68F35CEA872 6B726704CBBC43D907F929FC5CD1AA618890C33DCD9A958910A8288351E28FA3 7F16AD7581FE5EEDD7827540CF3D0616B6BF298F43F1131F1FFBB0A9647748A3 00FAC3E95BDBE51A0AE841D88240FE4EACA8967586FC51357332091210C98D62 A5661A23AB922EA436EBB831CD324AD3756F776ABA21F86C3135E074108C53D2 610C6E026F4B907FF1E0B66E050FEC6488AC56D74F72985E2FA16D0F225958F9 9D1B579C11936C48EE20BC15F0BF00A15161DC1FB386F948D5192C7D2330D65F 12704B511C1F1D8B69406C95E35FF21AAF10DACB021432C96D37000F084AD418 F56449C37045C2D0FA6DD320F5E52CA3F6AE7090687B9F2281D102CFDA2B29BA 1DD5B0BE0BE71F3A9E6BB678FC81385BC22A08A57AD7133CAED6383770AC60C2 96DF208104F2B87AFA8B547EB8182007A718B495FB015BB0543926AF1AAE2197 735942EF894C6974AF39573A0B58F831495F76F1FF50490B89D669D2A1904C10 072023B22F24EADFD0B0CABA7A0C71510E54A4EE033BD9C8B9E2A571E1B0D49D 31C0CDD488182362B357F83AD3176A53949B580923B7D4AFDE2260957846BE7B 476812A478EDA139E13B088ED7A1FC7CC86353D3617FDCE10614A4B4EB30497A 29019D20E2A8AB9378E82623603A7FC6805C49C6E568F8323556A58B585085C5 FA830F27FEBC462A01EFAE5B31BDE44BB38A036EF58143A2F7FD97E031EB5FE4 6E0DC6245121AF9FB97DE8287436EA1F1FE5A7B8436B5F76CD3A0FAA6EAA0BB3 06C51EBDB26CDA4AD4A2E9EDFC5A580412BBFDEE310FB83B4FDA7C16D1C6F605 9356E79F093B79A18027228D815E5F6F7EA110C54F28AB3F28670D822220DF70 DE84B1315805F77A7DD84B00B32A02115D99174B75C54C245803486B93800DCA B79B502D77B06E12EA5A7FF49E24571EC126599048062F2EC1515432639C8406 B9A363C6373FF0957A3C559ECE60968FA7AE5136969F14202F8BD59EB38FE35B ACDA0450BCF0B4517178DEECB57AF6DBEEC163F07329591563238CF57511C334 E8251E2D2D102BD2716E7CF42B84F8BE06885B85099692B837233F1AE3CD3A00 C8FA8F0E5981793C2DBE5A265F8FF059C350DE78BC3C2F5727FF35E73F1AB44B 8032305B314A2B1372320081FC7B099512951AD90F77D25C4376B628DBAC4C60 EE8A3F05BD51308373F28D406914C6014B130E78EBDF40B2B5598321B4A9F0F9 1B6A7CF8FF13980F40F69A3A30CD38838D6763946166B32ADC87F1C0B3DBEE2E 5B4BD49DE67B04D118FD6C9B7816E5D6151FC90CE63BF5C7599D2BF7736E947D EA4DD9BF8376F2EC61742B1988846D7586E75D7F4F700B6AD3139BBF92662170 310640FB511E286C458D453495E68CD6132E47B03345E039E1187923A99AB18D EE8AA68F1C2A09AC35E4F77F9EF91FFC63B06C2177264AC5FA373EE040C9E461 A433C6B244F7DE802E1CD2A6D3167044ECF6E08A1A3ABF5E4C166CED21D6959B 1234B69484C237E22D65D1C0DB94C9C77BD752F061D7AD263592E72026D94066 87F4AE0BC95CDCA1D04A7A2202AFC76C16E24B43FED0B6D8A624CF0F91F8EE0F 9FBA134628AFE586502DE88391554C42141CD2408502DE492CD7418F56E178C5 F080949268A5F007E4BDD38DA2122D8BF441852818404EC382B5AF4F62B6BA87 CA349C6CDD81C4D514A472D4457C7D0EB79E59D59C680F80C217087FC30F5DC5 DAE41BABACE49656420FB8CE55340CA0F4876B6344B9B8DC95E0A976F0D5BC99 EA81F583564EACF1CAE4901CB28610D2158839E15E3FC3DAB5F74F36F72CA553 ECE7A5F5BB9B4C0E4527D378967CCE6EBE074E76100B1E9C8349EAE8AD6EC3BB D1F5C94D47CA84335869F52F9A680487370C910A2A4C83DD0D2354D916B22E0C E1C819E7977D3D09828BD48E9B014C6F404AD94F14684F48CEB208A67952D31A 927114EC66E222F8E4F6FF50B898F9778D72A3C2697D9FEB7B1B1B56F0C3376B 736FD63F8EB4CD091A245352F41BE5AA8CECAC02C7991CC4506B59845C11D3EF D5F0F04A38BB5670136A2AC0183E4908BA48731796FC99ABFBB495902C92A80E 33CEA0A6875885B80B389B4E23D08778D027E8F5250CCB54DF40D031D0777E87 87E09BAE6C8FC13AC130A4FF6DD85E88ECE6558699C7C307907557B64E43ECDC AA443DC9DF227803C3C0662CA759F22D441B641B73FCFCDB30B19D2522A9010B 008080D91203EF1273EFB6C70465425D60F79D54863F75475E3889F26FE040DF 13A632A6C4B15D0244F242EB32B6BECC890983EA0FAB2536A6CDC7C149BCDDDA 1C247B83371E2D80805FDE95675EC7BAB2AD60E0BD00B84D12AC3A140AF06167 6564B407E6A7AD470D1EEB1436B085077F3931DF4FEB3971524FE8598F6E4977 9E8775E05447CF357D622B5D9F5CBFD7475A28B14600D835CE7A0E98C02B6598 F38BF153A28EFB047DFE66BF87C5E0655AD8CBABFBB903B03F3449F05FD9CA97 15A8F3B2FB007382B3FEB0B0C3B5A92788C7E04797D1455091553BA398E944E7 6C2A10A4C400FBF103CC746B303CFE28B308987D98280619B430D0C20974047C DC327CFD482D8DBF31C79FDBF438FD73039B04FB48B5B6B3C2EA1185A30A2200 161F14F4DE44F26DD2305EA617D611D25AA86BF99A829573E4981384C85206E6 F1971C44B9C9947F8323A5B39FEC57AF448ABD7DC21EC3A845E8E0DE63413C90 91DED6F255DAE4F4372A8D79CC37F9B031B267C20AC4687F2B7D1FD957D4030E 557E00799343D0A48F6E9FB08CA9B5B3F2CEEC287AB4A270F12A7054FC57C1FB E8A7019F3F8369A954667E55CFD681C53380587D33F28BD7A750B7DB435F8C07 D4224F7CBA2EF50B8F42B5001A9C905456220CA470B4C8F7B50EB611D4AA3BE1 BD5DE77F9516002C14697AC661337A350508F79CA80E61F49F06196654EB7E7A AE0EC1CE57BA869612235E333757D2718E7F5D206CC9CEBED3FF517918E8D79F ED729D62CB46143A753BC406007D020DD1F368E0CD4F668F5DE83B43F113804D D07D985B83D6B746FB166A1A7F4E0FD6BEA6EE64CE9D0E4D40DCCDFBAA8BE8AA 0AEC08BB434D5561C2EA00A108C324CD9D727920E4247B34B9B97C8DEDB04B03 F296F71D4A3F9DDE10BBCD274D98AF7BD586FFC480BDF7D264B69A9D0C7BE6E9 033B3B0585B31A15375C5B4B5E7FC25A5C8E5365AD1F827047911CFB57067CAD EDCEAEBA48AEBBABB7F1BDBBA9C4FE9B731FEFAE32204C8B03418AEF0472176B 23AE10ACA825218D60AC192A3B1B109CC444F9731612386A6C16A5C3044612E8 EB5CA65E75BF2276D65248C50A43BDD2D2585014B16E5F0F3D020FCD0868439D 25C3DEE8ADA5EBD14A1439D8AE6288620B3CFF0CF1F93D0F078C269A7953D1F0 FF6482931E8CE8B82E3D238A5A05DA244F1A3062F35E722FA0CD42A180361217 81CCCBD7F42166C04BD62B80E1A845766CDBCB56801C0AF2DCB72007BFF62820 E8F8D3CAD33DC3F2603EC87D536C133D8080A28071BB630B8B05EB4B3B2AF067 8AE8BB6D9D1D1F69E7042014A27E3C0817B226CDC04BBDD3FD488C0D7A2D555D 31AC1CBDCD64BD974A2F998B56F209BD0CAFA0368D7F170FD2F24BF47AC04B80 4D2E1306CE583D4A3D352BA0FF42D089230A0FCA520DC87B43F90DBB4110FEDA AC037165E52F751787EE84605281191828A7A606ECC4E64DA92BDB6C8EF380C5 D1C4CC5503E53627A041D33913CD0E3510E482B8F1F7BB32937BC6917879D539 F125C7C921F8325E0B1B8CD848DDC23C513D17D40EEEC42B13B28E6F9FB6283F 1F2DE85D1EC6C47CC9F121D1BD768711B4659CF6AACCE52A03DBE9B8FAF2B8D3 3DFA1A524BC02DF019C35D9B952D36C019EACE048C05432623FACEDAA96F3D99 2CAE6709BD48D82DFCD2E6333BE6B47DA7CA20BB93C251CE702E8ECC626AF70B C96AB549FEFDCC6FDD2801E09753823688BDF23AA09B150479161D43D9F6F261 66E4A0F38048FBB40EA219F60A374A4BA4AE4B1E2033DDC1959A058FFDD0A01E E96950FB0F63F17992B17BCEF5BD1B2404E05B506F87E0AF0ACE21EACC651C96 63D36CDB2E01AD32F0D45287968B06EDA2ED1422A336A1C9CC73607A16636743 52579D6383DA7E5E5981967C8F1484673A3ABD9E66EF3AB06372E60C10F601C9 3C63F304F99A43446492BF95D8836D3E7645FCABCE3CCB7D41D0C02C549EE00F F11B574EC9705F859A40D21E0A81382CFC975563DF004C3CA336755986E611A4 DAA5CB8042FCA1EB4084438F24029583EE1915888945C272D4FAC539F60B15AB 2180A565BBE8014E0781F310DEBA00427C2625A6C81728DB0C3F278465273058 9FB7E5B9DF18CE179052A6766E444E294138F6868A7D77AEA38DD8E1057FFC27 CDC36532E06FB1C5956A0725E6C746CF54C114253B30A04A398957CABC66B78C 93D0257F513BA1BA16886DC41BFDBFED561C688067C60305861F59CE8AAF3C01 9879F86FBB0EFF6F2569D429130E8D237A6C87C105B61A030BB097B29EC4CCA1 4C46907915459F23822D289337F7CF3048D766B55448008FB56FE0D2C62329A1 9C703057A472484C207AC7E6BAB0C5820FE308A255C960B8F3694C40725C2354 E9D37DAA372088873C5F3F8CB5E0BD9EC2FB4C06CB334E23F3D62AB04D8DC369 5CB8ED70D01657E949660C1DFF1BFCC8DA25BBAE623928DA23A9E32A693F3CF2 86ECED2C48B7BF7E220C5345AEF4D063893E3EE30693DB732CB84FC6C2BB76BD 5104EE54159EB19877D57551A5F1B40A85EDF8ACACA78729255903FAE23DD83A 159D9E58C804C54F411B2BCC0A21E88A9A465A043169ABDF5908533787DF44F7 AEC04BA1EBFDD3FFB295C10BBFBDCF134E1DB06DECD03FEB8E72B5ED25F5160F 930F906BF7002BD64709A85BF04EAADAC5EB30F319E68A6A677FC0571DD36845 09BF32EF6EA7654BAEEB90FC9BAAAB7160D5C76B7F1DB2BE13E8739F1DF62A82 509F8DB46530F59A3872F61EFA601672008C8FA8019BD71435B7DAE296F6F266 FC69CEEDFE083F9F446B590A71653A985BEADC3D0076D5E6849C4310E9219048 024845BFEABA058F26C94EEDDE0FF74508796CB63069C8D700155924903BC73B 172E1B21FD73404649E089FF45B76ECD0E2B91736B81D9E7F2CF2CFA8B34024B D68068160C383973C7612F76400453B07ADE8628439739AAE6E277ABBD1DD2D8 3DD8096E9B2893B59E81369BBBC91FB25C8091C0345F0A0BF9EA4E62A4687C59 1994C16B8094DFD5072E42E4CE3F1DA5CBE9BCBCA45CD03A01D08652DCEBCB1F A9C99C934A6935FFD0C8416AE0EF64775E26626AB380F845B7083B27CFFFCC7E 07C6EC16F5B2C8172F943591963994F275730B8A9355F780A167A1BF0A37EE02 1CCE3CCB38EF4EAC599F4671B7B9CFDB13D5E84E9F1C32A380D9595900DAE57A 6BC8F25F84142B1C9266C58C6E15FB4938CA9F100405DF6445CE591F41098107 9AC2ADC142C8D60C7DDABE98B213EAC922D3A4315BC90392EC74D39FC8461E9C 3E91B385CC4DBDD496122E07C441B89F667310634845E07F645FA47116F64074 B0036880571EC1E3E60DE2FE9850765BECC1BA06B0D166288898FE4D75D835FB 70498AA25B7EF6DDA0AB993723DBC950D9E98DB1F076ECE7041FD16B8BB672F1 52CC89D335834C2CCFCE3F9E3CAE715E2AC6952265AC1D94DE5CCA6B61C7D8BC 3B09DA7A66E754EEEAA3B664804E6BF0A456474781B467B23EE13588CD4DB84A 77165D8E3D982B174AD62CBFF67018A565B9B57594DA31A29E7ABB06C2D9616B 028A46E16BDD5E8FCCA9BA87E849638607F8190774048080E0A4D770687C7EA7 94771A2D7500F7CFB40CC631D64EDA07980ACF561FBCC4BDA0AB3BE0293C6BF6 447C2B816B8193B58AFD65C90BEC03F13845FCFD69D3DB5F9032A9C73F87D8E1 7D55A15BC0801D96697CDBB98DE4CAB46E0F7B48D3037CDF4A1FE71163A04429 2A7A8CFDA20B1C14D2401D9C017267D32F355B4DD19EAF9C91B25E6CF733BB9E EF26F55CD8EDEC5FCDB4D87ED972584DD9500878CB4B4F84C42CED7ABD4E4F0B 30D3B9B88137A5E83ECDB9F41497EE3C71A81DC0429BB0F5A29EA8D99D827680 EFD472CB4CA638570490E07CC72D5E4575B8F1DCFEDAF103BB5F88E330766E26 681BE4C3F8D91A6978D600BFE0552484F63BDCE8BDF5E57C623310A73BD40853 C60915FFF3BEE92B0BBF4F998717C6A3E196062133F66871944388E0B241D395 D80DDE5612432AEB5824E102AA7A623F22237DEA072AA6CB6868AB239B55B912 C28246536C3D87B338A7BF381DA9438087DCE9816FD7E398EF7875233EF1689C BBDCBCAABB5F11781DB56E9808DFD8355FBD3B48A785BF0EB999409CB1E24257 9DB7EBC4325604B19C2A4BE571AA6CBFC45C8978F4B31E7E7D9582451919F624 D4660D107AC7B39DCE4DA1DA18DA2E3CE03BDAAC4A2EC5C44591BA857219D6B8 1C9CF2D2221D750C366EC48F3B8E8DDF59039126C1E47F7E822E7755EF48AA49 3E3D0FC51E740DDACAD55E19132657B36486834BFE4C842A6AC2596561FB3A64 FCA086B5F35EF5CD3DDECD3CD9BF61A22DCFD000ECD6CA373D63E9FAA58C497B 5DB78E27D63CDDBC7F09CAF06A88770A27B3B7B002806CD56F74016E8A9EF011 53C845906722473D96B051E7A7913487B4516711DEFC96E9AC946499188C3A61 CA8619108BF53C01A9393E4F414974C49EC0A147ADB1A5208B79DCDFC0212DD2 177C52EF733A0D38224B8E9F661683D8EBC30CE62FB71359E6AF4DF469B4BCB3 2715693AF6D1E1BBC78ED32DDE561ACFDBEDF4B99E366485713346456C07D394 BB14BC02B614F1684414A193AEB88CDF335B83006234B62143F314D051BA023E 02D91CE14A0DC7C32AC598EFB2F845C294C4FBD1958AAC2552C0927E96F2FA53 C4182754A53A09697F677FCDA375089161989F9E8ECDFB2C4BEF908AD01C6505 3B00894556591C9EE6D634C1CB0089D25071AED9BE8F61735DE3213888BF8ABE B8139F7D3911F48E1B460B8FF62A8C2E6CD67FDEAC9C37CF69821184B4B7C0CB 4D75B61AB613B4FAC3403C13A7D5CE5343C9869A3015C843DAA721E3CDC6F681 79E97F969F425A6B54DBB9CFCEC32DBD5604B0E91645C65F269BA29BDC17F1F1 B1189B0CA30C0D89BFF2F110742D2AA155F781F28D25A22B31CAA057BC4C7BE4 6FBFB1D96E6F3483B821D9907942FAFBFE50DC0BAA8698DF7F180B0D13979EF3 0119F5C96A6326E0F40D57B624D26366273CB399867FBA6942D444A87C340B33 F2377DD72050740093C379B49CB3349A6F434BE76F7FF70E1C4364D98A0C32BD C45945D17A1B9FB3515764D90D3F09BBF74D6067BC11C17FB2929D3E1230DDBD 5730742BE7A246E4C57CE5903EED3B5A38F025078044B194D4BD16D5EDF02F92 3F9323B681A18F8C3EA66F944769CF5636637CFBE6EBA76834EB3779C5D7EB42 F9D179928594F0CC18A279DCD73B6F851D0233B18EA2797210D0C820C8103C5B 1F2B98B818F06C8EE64CDAED7062529E4E86C906EB114E03EC7D6B3D5EDFD71F 1AFC450A24A1BF2594131C920D7947BF62ECB5E25A0A3769CCBF0B2FDFF3C1AE EEE134C7087E776F6D7A6F173CA2100B195F8E8492DE2331112497DBDBE9BC98 2D3133B1CBF8DE80D920A27437C835111AECBF2436D7D8E381DB2A439C6F9A65 FC3716473B6B3B0759BFC9F4473543B3F2880BF30A8F77445B3C774A1AF90A76 DCAA0E4C57F0A7B9E61960A87291300FBFF7FF56C2B267EFE1FD0F29CB6AE1C6 71B7DEFDE60D5A8BBCC59EBEDD893D677B11F4ED72348592FF9F9B41D401E832 F611D1F818686C2E31C2FF156E96205A9757ACFDDA5E557EC28203A152BEFE20 C1770E166F2AE6A566FD812097CF7184F4FB79EF97BF3AB62BA46CE6A037335B B065F18993D8AB50C666DFAEA573A5C9E1CD51E4E478E317678249768F4A78E2 6D7BF1678C67299A080CC3CD39F60D730325A618578C49C580228D2CDA4A85AF F36A91C8AE57470FEF739C0EE2B4739B23C81B9F1AE1648188DEFEB94977C0AF 0A10F0F29B1BA4686957D66D4D048A0EDEBA6E92EC7063A80C38BB1F69F69112 A55582F185C82631E70EE16B85514B211BF1B1EA6D3832190F2185385A17110E AAB754D0529F818905B068F5FEB03F1B8BB817749C9A0615CB64EB3473E20B4A AF7069A752823005FF11CDC2EE66154F6D4F9098279545CCFF48BEAC54B91890 F3D4AEFF979321A556D9DA2282AB72C8D7306D3FF7CAB60B1F139742CBF50768 6F82936B2E8710A3D155CF6ACFB89BBD1F05988944A5BE88412B6624DD07E43B A5D280ADE638D66FADC4DB801F3685B98C5EF235C70DBEAD44DC03CE3C79CC27 77C8C1691D8B30562F9D096D6DD5EA50D88422EC14798F8FFBD4295BA8E576B9 3E302E5558BC3519037059542EF8D9DC2F515A5DC847BD1575C6F5BCF2F828AE 5E3FC6E73B6DBCE0CB339D05F7460D9FF5C5D7A3C8A87E1BB1CC4DB1352A7CAC 6672FA3AA560989E437EE1D6FAA56D41EBD4361451744FC18D12A81371BAAD55 F9DCDB6D64075FE57F12A48CA5AD74C16495EF65345FE207B877CBD2DBAACB97 562E482E29BC1D3578A83B9C16385078CB6EEB78735AF350BAA58A3353D2B5C1 558154E73F58FDBDAC5081A59B9561E041A27F84AA04758C38B0823BE66295CB 7F409230DA6CC70DF87E5BA87759222A9F55EA778A7095BE6F4399BC42BB6743 C6BC735EB79F7751BF6F9342AE6A53AF27590BB3D2E4D714C081CF284BEA7497 A84175E67E8402A1E88DE6EB19F5F28060B434C1517F8E9A0069B68BB129E39C 6D887692E5DB237F95A1FD00D931C4578ED73D0CC202ABED81575828B6F9E8B9 15FE6044A04567C7511F4351BF0B6066B7EF67D7F07880DC0A56B27B79EAD408 AA204BF6D58B77A673E928397B5B599131B2BF73152E2193E7DD5FEE766CC4AE 8765E469434F42E6A3DA89321354A295FD158B64E3678A7F9F23AD99B29FF1CD 231CAC2A4E980E0341DDC5C2986B33D1541E98F536777C89A73F2EC2B336EA56 217CE6C1A8C9CCFDABCDBEA869A5C6AF84700AC3B99AF8AE717D9F0C695505C1 2254C80F1E61334503464E6066DB290068B7B689207BF3AA3168CD491EE343B3 6450C58B5275109FF226D01B5506EB46BF12DC6E8EE37D6C5D04000287E84E86 E1B3BAA4864AC48B211F48565764854160F394BEEE2CCDE351B7B3317E36263A B6B40642E342192B3DE91883C3B6177A409E22ECA1BB248021375E1650C3C91B A8D2FE6EFC78D185A147261ED70235A5EB3E9F35B38F1C058BEA82FDA32CABE5 D0480E4D63BF187D8A93FE302568A731054EF12E0719BC48B5556280E5878ADE 3DF646B173C30E588F58C29D01AB04D397C07325FC51A08571880D6B1AA8319F 6EC13EE8873B3F5F646FD183D6982253D69A6FF5D89DC1C7A2EA0098A1D8A9B4 8BCD783806E06B968406889515B6EEB41EDC9CD1968BD55D4BB3E14551CD5333 5921F2ED2912B39338A6BD3256142A4BAC6207C68A403B9C8D41DD8D0C253A2F 9C520CF3EB9C6CE0289FBC853B949E40AC8BB2496806E9A41033B69DEE5136CC 961D9270B350E9B94ED4B372D8A3779A2431753B21FBF6CC22DE267647A7E93A 180F8697B10E5D61FA88A190CAE58A74FD38ABEB9FE5E413C57AE8AB91C1ADFB A61853AEDCA70765E712998D42FA38107D1946C5A15C66D70B62124F75D780C9 8EE66BF458AEAE158085EDC40E6ADB76AF45973126F17642DFFA1D6C45DD769F 806E3D8C716F6CEE5EEDA4D96936FDA6141A14B7E80C4DB3B735875E00650606 726E598BB79A655CCB0AC626F554BDCAFBC241216F2A289D28E494B1D6D8B65A B0441CF6BC41F06633E65A07E22C4FE5C70B50BBABAFF807CEAC35C2FB11DE0B 888DC680DCD9417C0773E3F194C957CB5567AF0F8B020396EA0D40534648D95D 638951A870A22BA3BBFD294D430C264FCB8959D5D5612D105F100DA21C378689 3C7012D02791758F99B6CC52A224CF00B03A4886BE129FA4B22A1C7BE8471529 184785C8AFAC970700C6C24C8AA77F5949EB0181404B54FF2C26D4DAE84BB10C 6D152A073256DA08B58D82A0A7BF1D88D3D8369BD67200DFF251DB7C368F6203 DA6C011C1D4B8219E1263CB341AC0C96123692A5326D9B728A403052FCD72631 67A3C0BC63AB21DFD014D0D717463FB49A041D4200268AC141E64D64A984B040 CD02C7FA770731D21F67899C54B8623EE7C521B59C1A2BA2D99BAC70989C2D8A 4BA327C68EC703369B550EA16C1AFC5BE12C5D6DADA0D027C596B664437885AA EA394969A44B89C6E068AE1ED2B612D237A493E9356B6E3FDD37E421FC121459 AB426EF2142BB3452BC5DE989438139104BD44097206D391BA11496C0EA145E9 3E4FB625C13F8140D711AD8885B957F77FABE06F5DD80457C9A023825750D5CB 76990D0730B98687F2FCDB5C442710C6969B370500579F737388069EE1F368AB FD06B009783CD774C2C09F6ED98431C12980C96818968A25C23616DF238FBBE2 223B64D4082A46AA8E5ED2AB50FA2186AFD64B9E7F257D3F14ADB8AA487C38FD C8B573E08DDAF7B5754A40E0E92AD9121490AEE3959B1DBC63EF33E0C6125725 565F98BC1DB703CF93CF0EC02341531D06D9B9E5688F3D6752D135F0CAEB2EEC 2FA2003D5B979080A6446188806E77C88718FBA1887EDE7549F2BE8CE595297B 3CE6CD7F86803EE79D1BEC163AF6214EFFCBD06324B4B0D4F1E18BD374388FDC 23C77787757375F30B8D982EA55F3B73C48A7481C54C67583E3A18F782CDDEC2 E94D8F13DB333E91412B021CEF4AB6D13A9E76BE7772E589F4D54FF6615B78CE 41760CA43C3424267CC8EE7CD5A0F3A9024681106418B2C9725764CC5894489A F0F8EFD83E5F07926E7E5B7482FD16FCA51A6D123BFE51DD967D81AA9BC8CFE7 26F662C092457C20D8C0529BF20D408ECB5BD1FCD500A187BB0DBDB58D258D70 5B8EF2536C619452EFE4C8C78BE517AB9CB631E5F859564F8CBDA55450E13E4B 57F3E55792F20840B1065F435BE8A357FF5D1F29CEED046A7BAC9F4BF4F8EBF5 665B5E36278595F960A434B6698EF4F74B5CA2B5F4DEFEB1053463A4045B2D7E 46C6C60DE975239AAF2B568879C85EDDF335A0D5FE30AAD7FFDD6931E559BCD3 2B31E79E2D06AC0400759E7B5DDF941248D8711451F6F6494C2598A60A37C0BF DDC7FF606539D8C1A897BDA95BE041146895D87DA21919211BCFDF229B6E7D3E E53D2B616914504E01E859AD832B59B1788A4F7270CB7F97E4D78A508367AB5D 566840A8A66A069E46C2BC3E627F9898798D96B90ACD0503F73E1EA8DE143130 4754B2D9B34D989DD8430709DA8F23F3C13E36513148 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.0: CMSY10 003.002 %%Title: CMSY10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup /UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY10 def /FontBBox {-29 -960 1116 775 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /circlecopyrt put dup 15 /bullet put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A 11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F 10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D 7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B 491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D 9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E 0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD 5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B 5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB 54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD 2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C 16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F 483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA 051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B 8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB 0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD 8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F 153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A 98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B 888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D 052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F 07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D 3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F 849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE 84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA 2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD 2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E 4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB 8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C 4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF 035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B 0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E 2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B 60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E 94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA 343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE 894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F 8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC 4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70B15A0 657F5ED27D204449A841ED19E01432CFFE928E921321113780D036D34F2797DE D4459CFD15BB117B5C9745EF3CD2B296D91FAD48C80B136D94476967E255F808 AD2B5D522ADEC64176833756510391815A1D4A8DA1D0AEE7CAD36A1D161889F2 3347D5B6BC503300FDDD48F594F391D5FB42C42113C538E707C16EE24A3F375E 7C506E8F49CE50FF9DEF3B4A4C1BEB3848EAA3477349833BA22D2A9012287D8B A8C4CB4307A1188ACC0E6E9338E1559BE5FAFF381BD82A6C71C267409468B3C0 2C1A29F4281D565836EAE57F680490FEA4A952FF64C8CD11C377C294DCD1EC25 CEFB2B6DCE959D0208F85B6E32E9B44FD455F9B134A5306D95EA29F37BB8B86D 9E592159338E1293F449380E13C21AE42E6861DBBF4AE99A7469F871A3940835 FFBE7F316FA9BB834EAB18625F0960352C75105A92F175850289B1AE177E0D52 E43635C41B85F75CFB706BC92B0BF90367E180A141703EF69FD064C0FA34618A 5D9684895C3EF50F4AAF6E0F78D483280942D3F9C1A18FE7FA657928477AAC74 ABCC21B622EBE2C0AD9EDEDAEDAA9A6E3D96E01CC837668FAC44FB52307CE618 BE8399078154C80E7DB52F0CD16717DC59203497E89D69B390E9966C19D36188 E47270673493F7DFC14C72B5B4737AD52783C573B5F12D50E9D54AD65C2C310C 72BAF2A8ADAD81ACF0C49DF971775F2DB7404FC9AD6B30C947A348B28B0C042F CD9756359BA6942D643D8B7BC54E6047DFE25215CE5EE74CC3076975A3F324DF E8D80F42AE4A1C00B155FE56A61CCC09924E4D7DA7EE07987C2EF9E91AED55CF 524C54E553030B5F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.0: CMR10 003.002 %%Title: CMR10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup /UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR10 def /FontBBox {-40 -250 1009 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 34 /quotedblright put dup 35 /numbersign put dup 36 /dollar put dup 38 /ampersand put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 61 /equal put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 74 /J put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 91 /bracketleft put dup 92 /quotedblleft put dup 93 /bracketright put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A 2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E 3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B 03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A 8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E 94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C 8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A 64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B 07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC 1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A 5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE 0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D 38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C 0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D 4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F 3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE 15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF 7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA 4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B 3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED 49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B 8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B 5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC 17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D 364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F 7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F 26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD 8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A 65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A 5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C 9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B 72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB 3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF 2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF 9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A 2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED 6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B 7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A 8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC 41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F 4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF 9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E 61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA 07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11 6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2 BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77 2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDB693AFE84 246AB18279A2B24E5B50A2FF6337B7B1039FFDD4B00ED3667B5F2F7BC2786D2F 525A0E82234B30711AA835EAEAC2E404915FC7EC0081B194765032708B5E11CE EF68682FBA16ECD75C6A6CAF0F577583B72C77BF328E68308B929229A0930D9C 61CEFDC57E376B63ACB4F3DB9B5C602C248B4CA233E2C25E16314CC878BC1B88 6C0706423F71514CC2DBF0D259D87DF704CB718A866DBAAE005180435034AF3D 5EFA02237755986AC73CDEB3B4766710B762312D5F48C59537B158DCEC084C96 19F1F37CD1CFB61C63F6D05F59B2E47137A433DEAA34823395727B612C9F339C 39CF69081EE2D7B37FE0EDC7BB5A0D38788A1AFB315C6B214D784FE4C90365EE 0488B823FC9E9056F1F2A4F3432E34EF399BCA81ABCFA0B54EB99FDF2B36A5C3 8FA373CF18E3446091C91B7346947CDEF677F101EDC7396513896F7B6FD045E9 49E25F10F2749DD0164A56C26217678B438C35FBF7AFBB02CC0937BF33358AAB 8804E4EB08998103A821C357347017ABC339ADF504E44E3EEA6FEE7D6AED862A 9A2CD31FC5A9A0E5E0CA757F4BE23DFDA51D40DD9B8B593418508992E53F198A 5302172CFD08E2D0F242D08F386209C9B8AEFE9DBA015D717C95F25DA7BA3F1C C7C41291F3D7D93ECD9C3B933D89FB879514B45BF8EFEF29097D6F665DC10B6F 46CFFE8B6BDD781F814F6B0C6FB243C987305264413838C8AD2429226AE2D22D 8A106FF2EFB55BB3197F89712B665C7E12F29EC4BB7353EC2719859901766C1A 7C548C197F3436B9D0653CDF0D5B08D6D1104BBF7642D7BA5F9310EFF719A8EC 53A7CE2C76FAD4CFF06C5B946E21AEB7608FFC4210C6CEA239C2E9C293F9D647 A0B4716B87415B1E7A6CACA81F26EF9F6613BD103014CDE7522396DE8CD74A5D 4E1405730F0DD9B4DBCCD4269D15F07B43DE0C0C64A45E3F43E8A1B08CD8FC85 2D2E598734CDB225DAEAA408562FB35E31E594F320BA98FFABC802B14545C844 8B5E87887008F6FE140A6AE50E48B84A7B18CBDF0BCB5216391EED922E0425C3 5CF3F4337CA9C108D2660282150E516E86F14C8166433AD01C6D7DCCB24DB82F DBD6446A115F711123DFFC20E84795059D0A12F0E2972DDF04A7EF81F6212DA6 6AC4D2283F72330DFD320905120D24B3D3F9741BADC2E21D916ED69D1B7FB6EF AF5431CBA4E23C0F133241F09668D17BA1A8FF92F45E6BC9AE782AEDBD949676 9CD6DF30E4F3ABFAECD6D8FEE82559F0F8ECA47A8546D53E48D75B088AF5A78B 3B60A98EA819BCA48F83F2F595DEA5468CAAC2B78E5A1993F2B6373BD74C8801 BAACAFA7B2EB6C0DAAD46801979BF4D8469715CA562D63CFA12F8768CB3ADDCA 5046DBF783C7875E7F47FD9AD944D046BEFEF429B0A153D676F5D5AA1FED4484 491532ECA79ABC3EE60C00312665A8DF2796FF3D1B09A98AF806357C6CD6FAD7 B1371B6E6BA934B1E9B859380DE99DD83410B2CF4626600B1D2C58A1E6CDBC99 204AA6AD1389484D49AE5D5228E2B415E32D4FD9FAA5EB1162E0D8095A1A876A 054D85D2C32FCAA194285352A255EA778C5DE0C1C0B3BDD6F1B1DC5678637189 D45A4CBFE4E7E9AC2392904B4D0DA750DF8C988A0E5840DAE2F8B2E02672E785 A06037A79C3424E5684DBD6AEE8804F4BCBB80DAEFC47B11C2364AC6DFB09D55 4319F0B2600C6ECE8CD0E6DCF56E6B16AA020026EB23AF9D42E7E92E358D7E49 B226CBAC20141AA4E80ACF3CE6CE5CE12D962E6C56A4B495A8E48F36B32A178A 1E5DB965017A139CB4DD408BD5490D057660A73A2C19992E11455BA632AD0CB0 C676C1683B8B5CE6EE63CED9FE49B97910F3E75C36E9CAA4ADA40C8C2D6CF16C 5F70736AAE9FDAB615D4D6FB56B96A66174F0ED5E229B638943E28A960194648 9F7C9A755A2AD968CB3E74C7CE7252345C24FB805A63572282A7CF883B8290DD A889191E634981F74FE0DFCDBE9FE8391A1DE6A3DC8F7A0141AAE9C0F7D65193 971C25D60EE3584C355F5CF083DC4FB4F8B6D246CED8AED058C502166BCC6B65 1A46E94A4BBB826E3F3EB8E5EB26B93AE53EC65641639EF1AFD8CCF42255F337 E5242D455547C25D2893E35E5A3E16F7ADF1910A6D686A921F18A7D3C11BF012 F62927A7A3E77E41C2E6E1EF0FCFB0207F6E19334730A6CAB1A2AE6D6471DE87 764D72CB826E007AE0B2B149FA7C18DB98ECBE34ECC1C875D44574372A39F5BE 217A81A9CD2E47812A633DF5690B91811B839D2DD66DF0CE3D8B5ABEAC7EC956 D9E7A2131FFAEFCF250DF79F6B1FAD579B6ABE53583ED792F10E386C9BCC739F 6DB31FDB75C4CA969B1A8FA0F3F3A77D3C55FD2E03EA9E09ED3624794C8778C8 685B9CFE17C588E84855BCF2C57022A32413A076EBE7035544FACECC830BF9FC 5E977A6BEFFB408F222758ACA10DED826DBFB10B28ED8F24E1020E1DCC1F5065 FD0E0C654D9E97727843DC90572ECB44D71092A3CF4C91FE5D05F64B392E8BF1 0224ABCC4FE65762A4676961DCEBA9BE70223C0CA1EB58822AA2F2C52E2EBE99 65375B9993C7891BDD257944D17DC094FBD6D2B380BB2188E576540986DF0DFD FCD73F99979598AB7CAC4E86A8284E84E5EE1C0354A9DED851C1233E6D4DF600 BDC5B772D0AAC616784D91B39A530A20266EC5A7071B4901F6438D6AB9363322 5E45FB504F626A4AED7AD9AE491A9E8FC624FF44D2679E5F5DE067C0F4392748 2B412F304E0F15DF5DDC9B82074D8BD9BEE0733C0F9ABC897F856B122B697CB4 67BF5A98C888C06E4FA14444BBF3A26ECF2BFBC4B1D57993B4B79D34D2A24CCE 2C6AEA49475D008AFFD820A662917A7282FDF320D61E81403497C593C90728B1 28E7B23C726404CB5CD95D3946417712EC718E2828D8D5367F3464C2063FCFED 57622195DE6B971CEC573514392567A8284EBCA984CAB5C7D0D9AF69A86F92D0 6C4D2F4E12FEEB41093D8549CFC39225F7A0ADBBCA77AAA035608BB2F0EF6283 34CCC1953B78E7D9D4B1224985FE2710D558DD3472B8ACCDF122388E09B6946D F19AF164D84FA651507C6739FA04BE6A8DD6086BF0872B47145D9350D51ACC15 E1FB85E9C3D94B004DA8C3F7D97DC5E948648D816B86841907D6E38BA025B332 4B2F94FEF5048DA31C9E4534AC2F079A5A8E5642FEAD37BCB776A50846D1A247 7D99FDAE40B956F2F58C635CDDBE728515733F64E1F2AA294C00718ECBCFBB68 3D215F6C0CF801852159520E0F3AC023BA409983E3185DAB17DE64659A91DDBF 843D63E8015813521C015B5855F0990A576A03D88128446AF3D5FA41A435B07C 3DD79589861F3B824FABBD5E60946FA2E67F9064EC9264237BD14A048957D989 00A726B3C212D1F716AE66126E3E61240E4DB91D8206296D827DB1129B84693A EF86AB77CA66C942D53304A8C76D1382E6615C6CB160D79470F252D22FBFEAB5 5DE422148FBD340BB9A46B1440AC02C711FD85B3A7455B4BA42F5FC9262B25F3 DD96B454547A56F78FA94E8396BCBE67BC8D0D45E23376A3FF4A894F551A6EB2 B7D8BC219C7460CAE36E35E6CDF137E88127A86B31D60BAE7E43F272A1B052BF 581B30743D3D6592C0738506EF55E9207EE1F683EE4CDE289FF8CCD41F21CE9F A04DDF63828FC198750E228A23BFBD557198304C667F2FE2BA1F6ADB2A955597 6403A9F202D6824198E9B9F5187DE0DF1816E435F3800BD14AF40BEC71602E0E 5B7EB32443903590886A53C7479ECA5EB310672590BD7BAD051E318B6A85BD20 9DB0CCDDC34247F53504BDD30734BE6ACD370B57FC39209E7FDD13ADBB9B585B 9AD7CA057387BF1868F87ECD9475C3D9616FC336696EB9D78EB3CC6395217A08 454E83969A932C2FB22529A3815363EFF3CA9DA6425056B9AD78C959DEAC495C 5D85F5543B16D13CBC864427B00164D21F81EC4C1CB300E5D9BA9573BA726C83 7EC503AEB5A3AF02446669BEF5AD61EB798D2240D716C6A657C2EADEBEDE72DD 70F16B8A5613A89CCDCFB05C257856C129441492FD78807F02D09338BB6ED59A F37531DF4D945A2C6105D814EB859123BEF718B21D74FA8A73FA805AC92D4506 038E76EC13C6D6D393DC3466AAE4B8EB2805634854AD9B3101F0710532338F76 96B3D53DC826BEE81B37AA1D7D57BD7C7B30DB8D3ED3A1D24A140CC6F1862DF6 4EAF4FF16AC499A4908C5CB782F3A44F54E611AAC39C19D44272ECFEF0D2B100 5E73772B1D2CEF3F509E671FC4212E2611C3C61BC461674D2209130A5AC5A799 CB8621F36BA230E8F2529AE564B402461496EF8A0E05E535736EA725ADEFAE46 2D2979963AB3BE210B3C4BDB56AD8746FFA32316EC3D6A2C251F70908E99D997 348C7D4E8E1E1A6048733F3168A3060D0D19F0E1825C90D88DF40E7D40398A02 9D6D08CEA9983961D761AB6D4C5759EEE33B61C7DCF6C5C708439E4EEA425ADF CBA8CC7C69BD3161F443C232F48F6BBD78E222CE1B5AE35D7122F1E74C31C0B7 38525FEF89E5722CD88B69B6B65F41352EDD4C9B22C8BB81AA1258445E789369 EF53CA44DA553EDBA7F61F31050A0C11FF6D23E1D6BF7BAA041296E7A4B14E0B 3B33C216AE3AF7B999BBAA32DCA9DDA52BBF99D226F5829D9A7C2E01FC260CE9 AA278E737497324B6E823AB1D4A0B2F45887116E99980DEAD2DD31D36979C599 C4962E52E0972E52406DD2EAAE67D84851BE81F6E67D75E274CA89DE2EA250DC F346C51FD3E70DE032C453D588FCEBDFA94AC480D44B591BFC6D1FA699041351 A727C2DA45D68AD8028B3F7759CDB6B3F043AF3192914BD26B10EAB91C83A0C0 6CB6391D6B78009E7FD3978F8A65C3A96DDC21078C8DA63AD896E31A341B8D24 2D381A533A2D2B195BF0844D3F91DE9DF8AFC980312020A8F0CA63AFB83FE1C6 F3D684122CA9E5CB8BF3B2A4E869F264A013C90E7890091CEE5CB10C52A339D2 334219B8ABC2E8487F674A3EB3EA3A22642A8BCADC3A177FBA257BF3A36A7771 0F497B91CA0B5B9D3BB24B58EF65863E1A939EF955F2E2741C1AB805317522D2 F55639A3A7C02F5933AABF17938E4115977644DE67F3324105B19359EA7F268B F438B43BC4DF6E735A4A4841C38FAFB19414B2C461602EBA0FCB7EB538D975FD 0644904603F36E116C235FB45FDB69B146E2FCA4954962544AA6DF8B2C6D8E44 1DD4B12D4983E6396AB1F8C0C49C6C5151467F0C69B68931E6546C85AF6B27FA 4C4FA4442C5BEC173273F690FB606B96D6B0EFFE98C5D441BBD8A5D7945D4371 122E2BA76BE6BB1F096684CD2FACE3AEE88B2E096FA248C84866293EBA6802ED 215A9C511E1CC5D8E3AED0F62AE3DE811F5B1D375BCE2B2D46DB736400256B74 08747B3CFDBA5F17143040C8E053C3F1EEA62E8303EEC3415598232BA8FEC330 B6D9D00600F8411F9831B633660F744A70264E2A5A1ECA027E4ACF59745C1804 D81FA2141DAC82ECDE1090491C6F3DA664CE3E031967D09FFD5CA1DCB40082F0 04EC826173FBAB0A1F0654F42322BF956652E072A401C1133C5982706779D1E3 F70E06A44AFE110ED011B4B9C4663E0C569F2758784B9716BAC35C88BC5117DC A1FEA1E336BF77EB7977F12B0A3AE2947496F2A9B2E80C0101E9BE65B3E7D0A3 D20B42715116D23D209DD531D9B4DE6D8FA13E74F0FB1183DB761489E07A1BD8 C06475F1DC3FF98CA781278DDC349EA2ACE4FC876D460A9CF2BBD7F9DBF92515 FD7870D5F2D421B15124ECF9C1846F3B6B3F1D975C485A27CA7E4169F7C7B338 C0723F59F54355045EF8C0D347F344F798173FE24A02FE3215A207B97B25D394 2BD82739DDD2792F53C6319B910B7BEA90C8B2C3098743028021667F0FEC302A 44BCDB0CE3BE4D714C562E19BFE923B7FCB5322EBCC5C211A424F5344C43C576 94E1262108F9C18F295327CEF23BEDBD683CBA9DD53A0AD8B27F9FB51AB429F3 64C4F894036FB90C8D9930427650A92B6A6D715BE96D56B1DFAECBC440B233FE 620F98C7860DF4CC29C627E5E1802AD7F0344D54AFECE46A9204144EC69D4290 B760C0AAEA190630FA1C49C2832BE49D337D37EFE703E9992FEA3715C0430E79 312117E460BA1DDF17F83E33802FC88DDB05D98E9E0824F83FE0BFB98ACE5D06 6394FE92A24CA13398CB33BBA67B524F36091D99711F3C7EF8658F50F0290E1F 4ED0D2492410D4F1374BCA39E776470F17B670C97B6ED8E1651C49485D65B9B7 B8F3BF38720E97CC1A004E666DF6874806AA55C6EC27E123ED4923FA86FE4F07 12340C6916F8ADB66A85BB6CA372F940889F8E2BFDA0C7D8BB811B23C683A03B A50C32DCEBBABA9FA78D68156D4774EF07F305E515B5D0033E6086A9A531501D F6EA6824042614A6408D85E98980ED9D5A52DF14F7C559FACB8E3E5AA16F09C0 5FA1082F6B2CAC8EDC75193BD1A4DB3723AE1DAAD1075C4EBD854CD28009C105 51BD273607B769DEA80E0CC0776B7FA8FA5B0F2EB2ED1D213611FF7C5487ADF7 28FEBDF736FA42B8A317F2CF7C49DE6D7A3E82218FADC21FB3108C53E594D933 4DF785270EF2834E632C1B1756DB8074AB1979D42FA7C33D55A65CA8752896CD A4A12335ADA9509CDB5DF1C384368341473BB5AD3F8B2EE1A7A45A12D77A99A3 C5D5FA5A4C754AAE838E7CD32A6037C9943C695AF2E094E9DD0C10958989203A 2725BF0CC71D8F01AF2FE1B514C552BF3A3778DFB3DFBDB0DC6D1198DF64BAD6 20A1211AFE13A0DE1E9EA0C4CD061C5A2FC7B74C6A97DCD323ED3E09AED53962 178BA546D7747CFD2F5D769061925A70C36727DE81F5245B8BC6E0B1CFA927C4 D1B3908DA54CCB4374A8D37F17F9C7CC84BF031D8EA1C693CF0770EC11A12CBE 7C366876CE0E6B5495C60DF8B104E31228BBE0C711D38F78F3F1E158A3688541 1D6EEBF455135C86D5C52F2859023001494FD77263B7C5CB80DE6A5EEE433116 FF64B2E62B2A64F2F989A6D76594D14CA6BF4A2609228FCBDABFCEB94354034A 7380E85569E46C7E6115776776A335308295BF4DE2D773687486175D549A241F 8266059460E75B6D1C7881E39F86C11C9B88D20C9823211A2E84FC9797795EBC 58DCC1D7EB5725E75BB47AA3E9D0DA34BFF64C30420691B02F094A3E4F829C46 71CDC45E95EB76F6BC0C26FA99841E00E4C78EB7C27426999B1244E0D7223C19 D957B118EDCC1A60347B3C723922DCDC3D30131EFD398A31F9DDC603C426CA38 7FB6E88C69A85F84A07193623C5316F10568C80DC66423E7FEC2C562E5F9E5AD 6C0D954C5D7206A5F4A9DE98B96FFD08358FCE1FBC7E8BA070267995C3D919CF 1FB229DE6FC30DCBB9078D2E26D4187F55D850555952354D961E11764585B864 E0AE8323616EBB54F103F27AED2B27E83E46BE814135B6CFC95BA652B84BEE36 49A3845D7FCEAFA4EE3517BFC8F4963F867171EF18136390C9327917042D0389 B66006CDEAA6B1CFCE2B9F7D9420D5C0242BC34E5042D9821E16CADA17FA98EF 5AD0063A140D2765FF6B99AE9C5B65B1B4D8D277653432D8E51E89D9D07CC8C0 289EBA4E228B5BFB6A1E206CB90C983897DC77D9C1189F067DA67DAF6D2E02D7 E151590C8AFFB14106947B98089F6DA44F5E0D6C2B1CC68D94B8469D05E479E6 DE45C966106BB284E3BE13A2056089B8670F00BEDCD3425BFA6FFFEB3B4C96DB 908AE980D08E4430665EDC06DA98BB38D82BF0C9CC2951922A4A6FC5328E38C1 3D1D7FA0F51448C5BF7AC0E0A99DBEDB1CE18A79A641E0F8ED94F473020982C1 886783D8D8349DE2C7B3A06DF6752732558A2B1F2732659B53293FBE7CA5B597 3B428E24BC096DBCB04E1D6F70ACE34D2ED9714BA7C533C5788971965A88D163 AB22FA76FBEBCAFC429BA783CC05F65809D86D6616A00D66B326F2842D69A8EC 9D457EE013C5872F143342681EC3E5FA22CA170B64E865C4367FA5BFA300B0E2 E690E54AE6A9F25A3837072E87D9FF8F0148387A7B7ACFCC610B8D4FD0447FB2 59334F3E397F9A7D05346622B4258E527F2AF52671BA6ADDF130C0D014319C80 B81C7745AD30634B56869F24A23C6D1AF5FBF26051EE1DB29C4043DC87BBEF6E 878650C6385F87864A34C5D9888690D7D2C565AF7266CF81F1B712EB6860B786 B94E2F2E3632FE155540D26E39BE4F0E5A5629750D982B8B60AC530520935528 DEE1882D24D5B8FF177683984CC84D9B8A1506386418D5F36258E7BE93110C08 1FF5D4F9B98DF8C3FCBECCF57ED41C0323436F930AC2F0956C18B713B47A246D 0BBB03AA4B414127BA95431BBCC3902B8E4F545F336A2852A730EAEBADE13502 679A0928B352CC2DAA6D897D77E18C8DB46D11FDD1515AC9D02C929EFCAA7E65 895A95792DA6BF1C6E0D41FAD57AF2C754445B275362BC8D4491B21A5C667CAE 4EC6980F27CDAE03ECFFDBEA87058C8B30A448FFE0FFCAB2A7A6ED3278F82BEA 79BD8EB2D41B27F9DA027F0F8474E1D5D71FD38619D6114175D379D3F6B56E6D F15612152E2B76BA5A2E9538B67D3FD166F99DD4B058977FD2A0BC71C16B4797 1E1CE3F8C88837F725A61174D35EF870E99831D9290DE9398F4BFFDCA7C92642 25523A762D3B1E6A020DBE8ED3011D4E2E1A187B6B070A3C785B10BE2F21C11D B1973E562546BD87647E0C197998F8ECE5BFD6761C9E5FD47EC8397F82159896 C3BB6DA1A4E6A73E435F883D222828EE6E9204B4C89DC179ACC8111522D7AF3B 9371E1109EC7BBE8E5B7138832E580001FF099871913AC1285A1921EFF98F18F 04CCB1A2CC6CAAFD7EA8C82C2BE17CB5E31DBD0A8F00268A42B8CEF2D2C69149 DD529C298890DC1E20DDF626055808B64E167D0CA2F5304B1DCC31CBE4BFD247 847193ECB2F60A6A8490D8A7B37166E81954BA8D41D0058B8729C1235B33FC46 2D32F692146755659E128F566331227C15116CE4951AA721DE69CE5521F6C12E BF579B6C7E77F1D60FCFB1B6D26A4D7DD9DECA256398EF107A5C0E8F3C9EAB5C CCE87AC17C482B4AD191D73C7A7E4E767B053943689A6340CFE779030791634C 3E0A99627EBD8792F4251B6292405151318A5D76FA21C075F654A060B4944DC7 479BAAD3BDB2F31757CF62F0A48EE60257D7FB33618FE58F4AA6C977F2D6D719 BA306075E04FC7B717EECD85E8E74D5F231B3775B7B4FCB02F4100AD25A95825 21F473D68242C4CCC310164FBF7399328FCB9B5FBB9B74B00525143F734514EF 2FBFCD3DB07ED945499425E45F29663A5075B5D5C0A2F2E0EE7090E095E728B5 D6F03C217601C4EDA26E9CB0BEA99EA5B8A1D6E52434A43DB1A30F95822272C6 411DCD660DB9651E457AE16A7046E1326C3EF60CC90B4E8D09C7061B70E112B9 5C839FEF4E074726432D4B45D5A12B791D37C13D38B3E08F39C54ECBC4D51EAB 0EF9F885DD80EF7F17CFA0A47A797DF5B4556F50B7E510D0F38CD79674329AC0 3969FE1F9BF1CF15C6EDC8F295AAA509674E115198FFF6A5C215DB65F7EDA344 84FA2937C0EC5EEE0D6D9C279DFC7A77BAF19A10F8EDEFE62F70133F8B382F26 18FC7B4F2FBE971199A630C688FBE5150E64D5C16DCA035649A646E1E009FD13 F9CFAB2E5909A8F0811FE2D99F1B8EDE8C85E8FE9FD11CAE2F412A5E7DA23FFB 46C8CDB734D69DC9FBD8EF4E6992C452D9BBFDB13B58A51ECF1A3D5294C7F7BB D46E91285263CD5092E20FA5B63EEF3CDD24AEC2581C99EE4018F58DA4E1C6F4 7DC15D557B8F0DB6FE88FB890298B47EA3A9E3BF428E4B15F41FC24790EAD2A2 6C5804C0682277C1480920D41AC7770E89ED73B445C8FBAD71C990865B1A72EA 11EA272C5C3D148A447444C048639132D823839F6845A1C5B5ABB7D7EB0AB213 D6F384C0D7E7CE90FB2D8F6979A6A199589E4F58DAFE52563CA7B0F2A3A6AEBB B55634E77702FF1B15E0BB7A2CFD47C5A281F22848F2F50B2D98BC2DB47E63DA DE563B78DD77950B9DB1D52647D0AC84599178682151B73652F7470B989DF3D0 C2B53EFF1102423F4DB96511846755932FF58AE218B4FE57DE8C13F8B543D1C5 2E87D187F33F2956ED30E3AC0B4EEA88D8D491377BAFA1D4144AEE521E96C528 44A67F11688CDC1F1D78B25DC868138179A7201F43695CE7EA08B1BB1D8B2EDB F65CDF203C372296248D0473511062B376DAC60847B340355A595CFDAC674D1C 8AB0E69875B0207AF46DA4FEDCB524F3A4C74E48438DCD2C6182E86FBD618D70 38E802EE9D88E8098DBA8E9F5C6437CD2E5AEB44C0C3DC787FA539144AD9ED73 A51E25004AD620723FF8C7CB086A1CA13BC98EDA9737C874248D5C9BF1AFD88F 18FED147AA8897F87C040AFC902748231CB4CD1A5E3994AD0528A30692140920 23D46F1C8594C6BF1F6B8B64FCF6E5B43562EF7E5C4717C5690240E712DF8297 8176DE0F3043CB67F1989A662980B3910EA13BE909AD7662038502EBEE081750 31A74E928273FF53422313BAED68BA79619B985E50F8DA42CB868E72DE8749C3 8CD697A2F6DA2E01C2FC577E65E4E72E7B4B574265A679334DE048FA93FA032A C94504EBDBC081423CEB4DAE622A558D258F60CB84B3C9C3326E2541CD56FF3E BA59EDE621C0E51A471095B1C221A3A31FCE65B3F1E049D57EC10A040374E69B 25D35D76581DB889AC72C5310B30D1C2083B6FCCA9CF4C22BAB558451A0F7AC8 B364D58B32B016546A9A7F4C31188D59233A6254CF2702EAF71364B3645C78AA 73B03D911B8EB515044C0A574963B61EE6D0853660E2E82BE4207D19E20DDD15 32E2FB1A1E44D1C7F0752621CE6E6752116FFD57649E52DF1F984B002F7ACB34 1FE343A2A463C320553284CE065B0EE82FD42DB4197BC6B1D59AFD55167439B9 2A40A612EB4ABF873709C7F6BD6B3E3AACC9EA8664C510A13AB02B0C928AA98C EAB0422F3D33706446829F3C162FCE5D3B9A7724874B0D58C1A9EB50D1D498BE E8774122CA9202684C96DED0A3C785E23C6347B4B7421458FB11F9DC34AB3F36 0A382EF21A8D3323D8035825B5D3571880E187B46E9EDAF0E8D2697509E65A46 3652EF0D4ECB5983C6055BAD93E35B5A1E57D1C7F0962611EBD0E8B26B2F6EA1 6FB526A3FE481EAFC16475835A01D01A00ED57BC756B1DF9AF66E08D4C99D445 7EFE04510EB1301D43A7B0E3A49204EF71801A9F1AA2AEB9E6ABBF54FE0010EF 3B5407579B39D94B0178CD54B9E7554F80EB07523349225E6B8E7F89E3D0E20D 42F4AF2B6A5C0F1AA84026DAE8B2B7066780DCBEB65AE47F75AE5E8DC0EB3100 7C9DFCFCCC31D4E78A76ABB5F83CE6A6033709956DCE739544DA16671671547E BE8435310D9A7057CFAFB8E148E0BD54010A9DF87C786F0B64836047AFA9B9F5 0214B08F041572AE2A53CADCDA53DB62F81EEB4C2F2EE325FC3976A23B04497C 4BCC31942ED6E41EF84766D37FFED73548BF6EF9402505D4FA04F43ED9AB6016 F7C311518FD8E40CA0D97C9B6D64CF87D1D5027CC5714F553B5ECA3CCC949360 2F5D485FD43986904394D31088BB59F4B641D517824D0B88B7AB7E9A9CDA9EE5 CB8FF5C33302FA780710B9E52EBCB6C9A63F2955524C074C203962C17FB2B435 E55BBCC08BAA015154D3171FB7A064087A6915EE7167E6513F9C070F8642430E 1EDFFE313CBD96BB067E56BE326BFBA1F9734C08FE0B84B49E3517C5D1412B36 079FD36579D2998A8406E0543A76B93C4DD551AA74775BD4ECFDD968076C2DCC 416B21A62470C466480327F26D306955777993FF5FEE657C851225205DB5E568 2F81F7CB11302969DF4F3483AEBD63044492B69AB87325B8F8F2CE483536802C 979A2F0001A3C740FC2C5D26EB3AC7CA1279BCB9A6A82AFA37AF654B93AE3C23 0CDE952ACF0B776CBEDDB55ACC65D65123424AD4B561848EAE57D790936B17C7 69254865DD1261EEC8EE439BC454340CDB550BA72535A8EF2B9DE42DAFA0B47F 3C5DF3DFB9785FDEEAC3221D8BC31916BC0A2072D4A9D9B8CA750F1213DAB019 97EE40ED08751DC4E71C056087E3B6F97BAB64CBD44400A020AC7F93F0B2C225 D485F7C30D87EA64A98E349DB674D860252ACFC5659C1AF8423AFE3E0102B92C F6C8B996AE3422C8527791586906EEFD50EC514F8EBEBCD73850A96C73D95515 AE45C8B24C90B6257F2585ACC1FEB9A19D76775AE3979371582323705C9E3DD1 5CE0EA685AB9E096BAE4467EC0D2ECDE879E63954C99476DE5D6C371C5AC3E0F 6C70B8532F71129C7A39C52C84D35C5F92142AE5CFE6B9BE5EB223996E2EE6FA 7BD1D6FDED08D68AE2A2CF304E917624E46C0244B5796F9956AA674955D8AE49 0073578A7850878D449997559370053769DB09AC1CCFA090EB963FFCBC7E59A7 D175A31BFBEC847D67C2712B103C2B65D1BD42C2DF709E922EEDFDDBCB7A1C71 DDC0B30DDBFCA5B8F99D7C1CEB2473B65A2D336F62DB56B54315A2FDCB3036DD 61B352D8D780F627CCB85552135F93EA55F4FC35E4FB73979925C0C7C0AB765A 8343F613AE7517EFCD9D921D78C04BB824C889EE633F325658571DB3C9CA9016 37AB24D88458E52C239C3C491D85B9A74163FF4B291097ACF3DB235C25AE8618 280D9BCF5C81BDFF085ADF7A05F06DD512423C5F4871B6B29F53AA44A57ADA6B 1574C01FAD4E653490C4C488267DD3CB685091F8B871C07AE6CA25328445F3ED 5DDF83A3A43FBD3ED377ED340C7D6A32C7289852F0379C947DAB9BC3FDBFAC57 42BCA4463775014E0138034D8F61A591C40354C2036510B126687453B2890D49 439A0516B9BE386D34854FDEDA200CBFEDDCF0D81ED06A9131875554ACD797C3 46878A4FB3E07A2A2D90F36387111DD402419AEBB8A1A452265FD2C196E51C5C FC61D3A972372AC2BA14C068A95187864134FDB299614A666E4480FC9DBE984F 2B4B784364BB5641E758B1C612CC2FCE6D99AEF955120C457013B55E2A870F43 146A26F6C07E01CC79136608E7BC864B2F04263EF8AAD4952E38CBC5C902A48C CBA3F3C52B0393B73D2C7D6C71A15C385349D7A2C6787035D29ECEA044BF426A 6B381A86C4CA5DDDE59D068CF33BDBA49E2C1EC966F0467E16EA1CC0AB3A127E AEA0BE968CF364F35E9BB9F11733FC738AC8891E850B77DCDCF5041CEAA406F7 58FCC24B05B449A516D4DCF4A5B5B085FC31D0821E42D303AD4AAB76A3618725 97016F1C61D9765BEE48222DFB24F7C9CA8ADF7C1992C705CC1A365F99B474B4 FFC890987EA14733A3F885D0E798A0612459167DB9A44723F2585B1E30741756 510CECD50480A4EAFD4532ADD11026D0F8F8A6F7B1D2DAB9623FE158D9DF0B32 487F4BC634993ACAED73FA903704770525D84A6A439FFB40CFCEE89BA987DDD6 978AD90FC0566E281D5A4203AA06A620443DB33CBAF1592F53C57ACC0C07225A 9811A28B538485A3D09AAAB581ED340011500AD629B3FF8FD0B0254C576A4051 CF1E8563F11842B5C31A3AC1A26F5968C19624BFCDACEE117008DA94D05D9CE7 B5C6D50DC817E667822FB474A9122DFFD641BB2A125439A2BFB8D1024D54F8BF 7D83D6A476DA72DDAD4FE5B55C306EA5E7473FAF1B3F7016B808FE5A894F946B 8DC622E464C11B571A6001E35FC3444047FB4777F5E205B13A8538170540B572 0845BAD4A399A7D29A1A8BCD2902D8C847B82AA40ECBBF9E311AA7A1AF812266 80C38B73C63A2697AFDE8DDFF1CAC0BB536403899F782D7C3A60C438D698D570 C754E8C128DE1ABBDBE93DC9FB25D02F7FFBFDC15A8E17F9A5061B024790F9EA C654B17BBA1C7F5E8FF01EDB41290DB5BC26BDFD646FE99D58B18833D4C32E93 66961550D7E74210E36BB5D32F51A1BCCF0D6CABAA889F64F0AED10771ED0B95 888BFB7264A54772F6A8A38FDA212DED50B1EB9ECE5CB3F32AB9DD04A7282493 E731EF10DA71DF104E8F41E210122CFA11FECE107BBD2D937A66B1C037C105D5 56EC2981C09E249724A246997279F08B11F4B23A1E544FFE7540094485B736EC 93E222BB18E0A60B651B00B3B4B0A6717C8BC94200C0A87EFF88D0F60D37AE5A 7B54C7077E83187524F426C097A8A04B3EC82844FD8F46BB3ECFA2F75F1EEDCF 5844EA89459502AFE6964FBE1B89CDD9BFE33AA99315B04C4371AA5D4ABFA1DB D5C18D4B15B6E2B1C42EDE6AC662009E7BE5EDBE41A253C14B346EDD10563645 26630452A50F2318790393F4F431902F16FA66CE105CF35F332833D5D2EADAAF 4807B8B245ADA65D9E6DF7F20101D53FC6334A1A64253ECFFA55D49F95831581 AAAA27D738A48F525F52B789EBEA4CCD41174369D60C3E28BE8D4F2FE92BC39C 95554D5E6873A375B1E2EF04DC605039F586F521385F16DFDDEEA66C0934806C BFDD3908646DB015D62FD2C4CD20D74E36AA9BBD9B2E244FE4B4B4E7EF301815 70A97B12F52C43F8A96D6F110B9BB610559D58AF7F5BF169348675E511C63F01 44F886628301441E180BC4DD59DB8AEEB8DAF2D85F2CEE0E56D694198272AFD1 A088FEF61CDD92552E868C6AA7FA0C05887861E9648905E406C4008897565829 027540758793BDCD4C7D79CBA2171051B8D8C3E3A5801E128C38E2205260E040 8EB21C3A34D9F3EB5EFEEDCEE40AFE2068FC613213ABA512BBD5B74E614A9707 AA1021BB7BF7455558454540063079552C5A7D3521200A47BC1AD7687EA5BD31 83388106551DB342F1EC9CD3F4BE480FEC3A4ABCA93EF94BB8CDFE1D280BEDE6 5BF00B0100BA5FD96E554A28B3A95AA4F392D24A1840218C785822296C7D1756 08DFB328B004EC41A5334B5D4470EBCCA349279CCD650D79A25B8538C71B3CCA 8739139A4C1865054B161BDB2E6D56EE551A51B1163EAF119E1AF6D165F95451 2B6BA2ABC0BDA5DA03D552896A25FC26201F629A40E1A7AF8AD1F3370BEABE19 DD38DD1A102B689CD20A76A9E3BECB3DEC5594FE3B981F10ADB22EDEA1351FD0 A7DE6C0097EC1BC5524C07F5A10BACDEA639D5163C417F55759229E96CBD2CD8 E10FCACD2CE2A7C246424016CF8C43318164377ED8C0776496AA00A7EFED3FCE 39AA3F0F9D06B72FB6BAA97A2936A560C53D9CD0C4C5018C293D640202B0D9B3 F06C153CCB5A1F832CCE332B6E4C90D8055FBF9061251FB7B91741B0CF3AF5B5 363AEC2B82135CFCDC7E65A2306F5B35E6307135E45F8797DC9C4D3C5FC94904 8779E798C384F6287131E04C7095251C16CFA643CA1415062CCD858C8C0A0FC8 59FB38FB6883EEA29CE63E1E07597CD5382CB301A1E7A98ED7CE889EBED2FAD4 33C8D68D0696621DB484F35E677A3EA39AF43E2AD82973E1684DCDA1D36417DA DA0831DB196E7A0B93AB1647DF8EB2DA74C7A5952E251CE1ECADE49EDEECDE12 36F942DAADAB225D79A3740167E34330032BE44DBDAD5C59BD42A05B901BFF31 849BCCAAE9781AB307EA3A8B22CDFA9D10848DA0DB3F23CDBF3C527BA6A9E834 52CA60B04831709618E1510058F9132A3491D8FF64B659E38F9921F99F951F73 37510F39C165F8ECB15C4FAE4DA5C8A85BA75AF1A75B5C0548B46E22829860F8 C24BAB9037396BA8B0F81C4330677EE5C7DCDB7560712CF21569859017099FE4 8A35BAD18A86D4DCE3E691F220B7666EB3409432462C447A18C5FA931ACAE3D4 FC0FD9C4D8169AA1B932DE9C568199076A297BEF0C20D337FB502F59C4844472 2C8F925F9AEBC11FB28E4F3B1F386B141F57270C1061866ACDB28FD0DAD5D367 503A936DE662F7DADFD1026AF13BAE8A4E8505C00412966E353B7E79232FAE9C A763B94A2217FF2C606716B4B9AD32F8620C0587770811727127349594CCA4DB 614C378FC432D5E98A7C89372C6759EB747F00B9D820831C83979866ED1F3D95 00378F171F50ED55A021B92060234F522248989A50514238E19C5F6ABBFC75E5 AD2D05BC5D32B2D263E135AFC41123B013DD48BEA689B6F2DF154EE6929ECCAA 185D38B0725C68ED90BC44D628AC8E1AA7789ED87BE68457B825C6B894F3EF0C F8B834B686EA84B3CE37B590EF10CF756380CB48B27A41DEB28D62D283C7CFE7 B2622D2EB9E4326F03AD761F5415E4838E1D24FDABFE733ECB33D75CB7D0A02F F2D5E87DCAA72E8BB4CCF285BDC2F1FE63593B36097C4FF7F065D104F8678487 B1051351BF474201531D8DD31060D3E28E9D8F42C1FBCED2AFED1967BDAF72F5 459D7478648C2649E1B2AF834B4E7545244182614EEBA61E1B20310D44C92339 FF260B350F89BCE2D80672AAE4A4752F9BDE24CC8919D0C3E70D5122FB7D5E8B A12B7A1FC697A2B0E84DED5FC64E71ED42F3B70D693B5DDAF70008CABB253D3C 9D34A9A4712C9AA073CD3418FB8C56B57D5708F414559916CF6ECE8059922616 BD3F6A827D1B66514F3BE1AAE55E8712310D67A33F9CD6F6341ECB23A8D6EBEC E0F2D4309DB9A55D83163650DACE5A67B747FDA3CCEDD2D058C948D018E8260E 00AA61147DC6CD7AB45CC77EFB87ABFB7CE5B1D5664E4C874AD878301CE2DD61 5A60D18B3FF9F6B2B74C107B677B64DBB99365D27CF4CF32F6B868ECE60AC0DC E98C90BEF371708CB1C05EC98750CCC8A84AD139E4924387814376612C260499 395D690C96A8FD8F04D86D2CAAB1675AAE961BD70940CFEF7364AA0ED52F426D 89F6B047A90F5E2E13CAD8F331A78F9CF176CA63D115FE4457A5294D67115DF3 BFD952EC71680C1EF2C31BF4BA6AA53E007BDD685D66BD12B7F4C4A0877628FA E2198B851B3C83EB251573DB07F296486FE45CB156DF33A210D2E65D210ABB8D DFFC3044FAE04A24057EE1703E604FBCF88021FCD35A10F9844596F76621742C CF192F86DCBBAF0A520CE361EB1BB3E2889DDA05AF4594C4B47B27643732ACFF D565DCF00F7F7AA03A7BF770FBCAF58A7D19009AB66604394586FC70C64B2AD5 7B92A192A1BC1E5800D9F0F5EF63670AD1E0318EBBCF2470D2792B0B5DAA1520 65B28DEF6823E622176CF09485C44EACDB304EC2B76A9334A473EDBD79A04F04 DC1E623CFBA39FAE1784E167590C4BE53C2D819671647AA25138A31B607BB1DC 18DB437C462E92A2283E241FA99CD059B1E59F5436BC768C1EC09E5E8E42A630 B2578118918F97520E9036D6612B3F967AC5045DFCCB2DEDB621F2A31185F3C6 89F0C8590C0ECD33CCA6A6B85CFA0FE23476B73D51C69921A90362AB9673DD1E D7BB9A7399795940056DC035C2BCC71E9E8F02D4401DBD9936FD61EE9E24CBBE F0E1FDDFACD1858580BD83EF1C3691E23F4E55B3943517B3928BFE15EAF920B7 C172D0EE635D687D6145227879085784EEDB432E5CC5AAA1D0B2DFC6DE140DDB A476687F60059E3BA7C87834998289257768C986F31D5F00888D7FF9F46E6D62 19FADFB4B82B2FC7EC47ABAD61797E86542E15D932EA55D27639FECD2B0D6BFE FAC0982B9A857515C3E9021AB8EA874C51295C0FE9F5D04FA0C53CBF9FADD97F F7AFA0594DDDDEF2C3C0056036327D178D9FD169239F7BDFF8DFA039418F82FA 413C8EE84563A729F247FEB4D528E1A285CE748420C8699CE6A939F3C7740E15 4EC984D7B65DE785A0737E3AE3BAC267278DAE680B3EB8F790611FD1C0101B40 7B247E4CE8AEE5BBBD8D13621AA0FCC38829D7955009B67BEEFE4D44F4FE44E9 B0AA9663D0C5A800E7A7C7E5E24441625F1C9CB48ABDC18FB3C292515B3F067A E275750321684EED24287D3DCF3093A3B79282A8F7AAF0915FB321843D492917 BF0004D832AF67E9216BC41BBBBF10B4B7B5088CBE8470FFFBD8CBDF108D8AC6 797B8F8D57A316808A609B71F4C8F8E8F35A932A5B0F7B4334B0D85F3788090B 3166861F6101C28B72DA7E8274574F311FD88D669AF6E7704CBFA28C43421FF5 158A9403A291DB075E0B95414E794C16CAC4CB7BD636D25790D06AFCB5498756 C8F44C4F866C73D0A3508919B9F2A85E86932BB89CE697AB096D6E64A53DAD3C 22C951AE7E14CBA551B7971005BD01A872A98D2A0DE9F07032150E026780019F CC0D57F8BE6FAC4977E741B24E1C7FBC3685388E7BDBD4E6E47856F4543A93AC D87F20A75E62EFF5F9D8B8EC5DE8ED7E59D1DBDD51F1C20DDDB67E5AFB5AFB8A C80F1CB94B6FD00C3FAEFA93AB555948A55D9780CEF294AC5E17AF750C92A3B4 5ECEEED4B3EE7C2E8D2A2D538F48460C28218EBFFABDDD6A66D552F235FB798C 2197C14FCB2286BD96020B73DBF285DB9161EA734C76969B62C6BA0853C43AF3 2EB44F5731565F16F72FA78EF1D6EC0498152B25AC20C35C43F8C5A03670D5C2 8166849DD7885B5CCB012325F22B85BA53C4672B755DD5B5B55E0E931DBD5E2B 69A8FF0C1A2B83F1E4585CAE02092F9982AE38C3334DA5071651FC74CBAB33E4 420855244BB1517BEA5B5214D97A1A0361DB567B7A7122763B13AF0A06ABACF0 7A837A16AC10A3C3D726454EC385F3AAFC6DDAA49B8F46F1CD736B80DA2812EA B8F6965FFC668C7628B4FCC708B189D752BD70848424EC411A6DABBB60EA9DF5 5231726FF3AA2161332011F4475F9E3692319625F27C1455D5B6E0C2CA62D344 05359534A97AA8B9864D4800C3CA163989FB0EC02789DD04CF662902CD9A9423 D73A65A68EEBBEA64DE8B439973E624DBF3BD18C5B64EC956FE13C03F261F968 C4BFD9DC25C47D7B5509D4FE540E035795259ABB2BAEB71819F018431ED9B9FF E344CFAB101F267B83968E0649FE677207A85CF9C706F216E2009FFE57F63778 D692BF834AA98DF8B6C3FF85B32F56EC4126DEAE66B4F49A32723D6F9AB49765 C57D33F82614A5FF63732CBFE583F9B8B9A319702904B72753F53EFF9021D9D4 C4910EF9D9327552554481A249768A9EBA86ADA782F516583F6182F8CFC582B1 AFC94EB84103B3AC573F40E0DB51CED4388D55A0AC3F0E3E34267BAB0EFA791F 136861CC5DC01FCDB9EA619D33652A23DE9497B41E0D56A7E625CE13DEBCD50E EF4FEC3941D1E482205366BE4EBCAE4B0832104E810FAC56071DA3F52E729A21 5225F7EB025024C9016DC50DC33064E82B283AA4D3C0B9A2381E48102E8DEA19 CC3600D52B6F05B87CE712303E15D4EDE570C2A73B1CE682197BE4E8D51BCC36 EB6710AA01276FC0A3AB246806379FB852531461F7365D8F80C8F2E4DD92022F D148726DEAC6ECD912BACB76AE1C943EB424AF9513524EF148BBC2EC02CF53A7 74F4A5B6BE6D3C752111BF7045108C13AB256C661234EF05972442E6569767F9 83CB95836345489CE63C9BEDC911D14FBA6BA7B4DDD85CD175373417417D355E 9232E50190292ECC2979ED5633ADDA90B20A7C06F9A800339A87087574E691F7 9FD06A6E9ED74DFB1B5FB89E1E3D03B45593C93850EE7424DF76361941BB5919 765CF3582251E9B8A00F2D2A3C6A94432ED839CBBA6E5B144B6761CA8350C77A 8D862E1C48E97381C4ED5AAB17310B95A5E1339A9A7C8567548C8C1567C91B17 A3504E7368F7121BEA0847DD7DAA63F338A0A9D593462CF91CBB8BC26258CD90 3A5A8A13D7BF646FCB7F4A9059F47AA765E133CE517F9CFC36C26B75C1B396B3 07390983B2C9672678CB5714AB5FE3E27CC93769DB6910BD452BF5710B6335BE 614181F6FAF46B213A90E56FF2DB670FD1D77F90B0B19961A150B2291C43CC06 0DA40CB619175FF76F1571346ABD5D7C1B7808BC17B8E614D0FBD059DD9181F4 A73F785C7DE4E393A7B722441EC4A8C840C94907FB3434EE1255D60DD9B4CCC5 DCC1BB1135930953FD21E0257924E0A172FE57A88DD3CEFE3B3659E54121F470 B30C0D51E9577F55980513653A83CE847100DC6D0B7C5EF50987A5439F6213ED 582EE6539AE2F4DC6863A414A6779CD854377DF0548F1574E042D0AF12A9B45F F2869ED63B8091D7F537E66AF56C8E4AE4BF84486E696828399668EF11DD9ECB C62DE11C45CA9DABAC481A5AB0439610C103E39890AF5E74AB6E059DBFEAEC9C 9917ED6F0DAE36BBD73CD24DE612FE79301F7D696740585A29D679B65B2C1550 E192F8FBFB6A5F2174328CCB75B5958E2F3E22FAB29DAD3E7C0C75D0CC1A8E8F 520F3850EDC06E2D555CAE1982BA0D1CE3BC9D6B965F6B1DF6EC5C7FDD791214 B3D5F6EEDCABD7F0161C23A60101B4B5D3E7078C5A7E36839BAD382FAFEE06DC C0AD856FCD090D7EE193025ACDBA3B3B340946B2447E168576B2502F05E7D8C1 4199128DB404B3F0C26A9EBDA3AF158C39735BA8D9D52D8584826752024086B6 180E92B2E536DAB27796C6772FC3480EA03964E6BE45B424F8BAB90E745B3F4B 5CB688E53FD9AE453A261EEA8923E618E8B15DC7465857B9456C0697BC278750 320888969C09DC8065FEE54BDDCF91568541E0584568B1A7DCEC9832096FF716 E28183F1D38E7A96FB3F176C66B551AADD4E4B8ED2C8EB62BE067A6697AE899F 13682EAC4B64DD67BA95433E4A5B31E3B229FF11795CF415782FAC6574D09A21 0A21105D0409AEE739DEA6DB5C95788DD952876124C5269CA6429303376B990A 5E61CA345C0B67D36D0E6741D0B11049E6BCC6AB7D7A2B7E782F811740D1CE96 5C16C5C4A3DA9198FF5F445FFAF7084ACBF596ECC8AAAF758758E9489B8BE0EB 9BCC562FACF0A66CBF0144DDCF604438EF73F5E8ECC342E14019316810F54017 BD6BA7CC3102006BA6812D35F46D37625FC01908C102E2CD942AC327394437B4 4E9F9500A38C1248223BEF4EFA6755F6CAA6257B45D25DA3A4F36EBFA79756EB 2A72EB61E16CECE4C85D3491C5F0F808AF6B9AD6AB5C4BF572A10B98AA7C969F B8C56E42C7BF9442A18C201BB6A5C7156381D6365CF824687203248C07AD3D3B DC0C95F61F112592C433FD3AAAC0177C8BC97C174B35E2001A61817758F36ED0 EEBC97E5806FB59A7176F007BD34E353ABA0D374BE415108BF98609ADA3D8ECE 247BCAADAE28BC4F5F12B52EAAD8506DFC97D48716A3D116747E4095EEF8E190 0AC0D4F077E833C89BE01AA3AFE8142894DE0AFD22D157B27566586482180212 67190611528CC1937F6A2A927C5495F8A9C322BA45D4334B245441D0E126B43A C5B46615CC18E10CAFB9ED0E5BA8612A877C0F30302ADC1E233E764307C9C1CD 9F6A31ADD1F0DD209AB98B4AE70C7F1CC1CF6E85BDF41F2355254215E2B91137 191DB4CBF4A31B1FA72EB281C5A5DA19F873BB31A726BA31DA7F189B694B1589 3F1791D4FBF892961E4EF59DA0D63CEC68595BE9AE606DFBAB3DCCCBF298212E 1E7B8FB3CFB69C0FE4C32A50EC13AA1836809EC837017FE9C7C01221B4ED093F 8C6C49D37B50E0611F4FD126A551F0EDABDE65FA637592CA472F0023FEC81616 7C39BE2629A08ACEDC907DD806D5670E2D4B8C02C2C99D0CD20454C7798D1CA0 B5B8D3433F0CA237003713B50CF9FEF18EC7466E107DF7FB32A62A63F5E6CA1B 5D7ADCA7CB8D7D80CCBF3442A60CFD22C36D747DA6ADF03E705123EE53AD0789 09E1C796F316757E9F91DDFCA89F7570FC389FBE3F74EDC1703C6C194F8DAEA3 56D467EE3C32114D015AC16FC59E3E8FD5B38751D836C4F061992BEDC8AF2E73 ADE3E988A251C2D73A82AEACF1CBC7A76B93B8F8C526FAB9DE4DD0DA7C7F4D99 4AE8B3081F030825964961DF0A6D0B441A5453AD9B723A5F90BA347DF1F7A2D7 C293D16B38A78447A22F096E89D71D12C266328D8A8597CB7E081B6F8E7C4376 528AA55B88CA7AFD48E2641CD1EB7932948EDF6112B39D698B83F7355111C1B9 B3C34C91F337161F935844DD56D8E4FF03CE68531A37D7C62C985D4D8C7160DE 728D4B72C2DEBEC2A6A61401E88BEB571FC83E8EDB7928A26162D2358F30378F 2C3FFE0C6CC4BEAA15DB27C94DF5BF1516253DCAC9CFA763C788572EF89BFD5C D6DA412974456CB1AA51C7B305338E4ACA174A951E5626B9FA6A36A966AB18DB F33AC753893AEAC1E103248FB44A56B004EA3E0D89845A6A8D36C22CB41CFD85 45653505D83BBE2A061A9093FF41BDBFECEEEFEB204727AE129FB24BDC87A15F 9E86872A02D17E67BEA8A7AFB4049D6C49A46F1718385127CACE508E116F80A9 4A3A81DA552D69178670F689A87AB65D00F755EDB7678F96A4B3894F4AD368B8 F6C6ACBF2FFFC428A5210201F191F2CAA5D96BBABF88A6F0AF09DBEA00B519D5 684CD5D6658BDD449F3F54E6CF08323C25025A595F6D0A838D14B414AA8FE595 B52919F783362750AB16AD68CF0A950003818F3969A2CD8037D8211E2A90B60F 5CD7CA29311C92DB814A0168749BF58A15B5BAAC11AD7702D6F8F52BA111E6B6 9743192A58DD01B251650BDBDCE3671C175130DE61942D8E769ADCDB7977834A 65ED372F844278CA95467500DCAD40D9E79400C45B1887C2C1B4985DC580FEBA B8A39792AFD17B5251962EB8323CDB6C1621E9BE4A590CE83D68F3B4B498E263 1BA3945674379A76EE2004E14D21B936F3656A9B002E84787E6FF6B66D7C3379 196C6501FDD1E436D29374EB2975EFC3149FB3307A66B6A6688FA05A86642F07 80FEF2E2A5A613715E08E3B8F68ED2E39BA4F4CD2908C88515E837AE4A4710EF 520D2AA8FC5DC78C601A18AFF760F3C2A715824EB35C74EB2D8EE3C47A7BD663 21665F34CBDB59B78905E56B831041DE3381BF2790274E73067A76358AB8CC16 B3C768E64F0D9F88D276F912A37EDB76A631CBF780D3E74D0C267DFC9C440F3B CEE32B1FE899C8F839D2E30B9E3831D12E9729845D827A8844C5D6B5E1EBBE6E F39F24C09992EC1E33C86BA424CC35951C4D26B22313E468EEA45C38C57A3ED0 65C31EE251E63B1DBF7F840840B26582D13278B216164005171BCE00C47368F5 68D355CE23F77BF90D7ED2CB443A3579F568994B389C605FC031816635D787A9 023EDA715E2DF41A168BDC62C71A3EA35AF1AFFD28B39287A85EAF2550250705 1B841F62837B4349D2FF913FCA71A33882C723622F97FBEAEFE03597D3EC2033 74C6CB47A248295BD6DA2ED116FE9DBC2B603EE160E317283FB8FDA06ADBDEAA D4F20C15CFF2184D2E66B4FE16F053C798786608F4CE40EED90F446DF462190D 4040BFE0F0FC9C621991B93AAFAD67780F749B4F38ACDF2E1F9E671BA2670748 DC58FBD3F9FA3FB21F056A4C63D105860924D42BD73F8F5BB25942D65A6A43DD 8D04D09619627C8B756B8FDCDDB7A710B0F06B6F7DF0AD1F826B5158C21F3F13 7C2E3E7C1EB45C103DF1C4F480818FD443FBB649D2AC49A1AE6C7B9F946C2346 689901FC3315B06EA321D73184124512DCD7859B37CD7C50425AB5BA47EC15F6 10EB053FC7C4788729D0DA1F1FF94DE3CEAB2B97B60607D25CFF1C6506F63BFA 3492E2237802CBC1442643B0111711A05003737B5AF2A69BC87C9F84491C2441 05068557170259F811436A43B68F695C5DC892295C22AF62B4FD87D55209D9F4 A2F622DAAE7A5D31C0F7BF90130059011C5538D02E2C362B2966BF2A9517E52A 1B6D9F1F6120CAE298960C4B564E68439F5D3590F9F0FAB03626FAC848501DB4 C74E180804918555BB43C5D6B05C0CEEC78921D501FA9EC00CDD2E1A45C18ED8 9D7DC46AF8A77736465EE7E972AA1DEDF22D8511A5FBF8A92781EAB79E0F534B 8BE59F6194DA9B8F77A2E1811E6C1E8F0DA8C450213C6864A424935F98BCE81C E02C29644B26136A6CC8518B2E3830EE5C6A6F5C280A66D94FB9510853528FA8 22905509BA0DD32244DD02D619C8BF030BD6DAD1AC7C8CD68FCC4118C801B23E E9D15E630B71AD62608A9898F0DE69443D6A6018E8247C33E6D1A23D3C1BE42C 5DBA040AD7D2127060B92FEFE3B4DBBBADEEB453B9460BF3327F897BCFCB97A5 D7985F4145E0F2CF8E44DB63882342537D0AAE4714166609B8F9159FA63E22D6 72AD267F755EAE847C7D3D93177D294E5AAB1BD6C9C94658FA8F60753165B815 1A94301DC2F3A738201F94912D724FF0116EE371F3A2F17BD1899C6BB3E6FB5D 5D1B73F56C7938B353E099FA5B63B698BB7EB1BA6E48D2F67328B8968E71458F 14BC58DE65708FC5FBEAF10E6910D24F3A184764E3FC287D7B950295129E1EE2 78D9217413FD30A85A99D22FBDC0AA6CBD396F87BE3043C5F71B1A6C6EA34C56 F33FFEE5FD7654732A77FCC5DBBC50C1B273D554C72DEFFA69EC35E6046483D6 0197DFE06C86B0EBA8832D6831B614C61C8F8025EA873936EB692AA5BC2EC7E5 15A111B081D276875FB1CDF9CED5A0A3D9AD705A1CD4464D2F5D8F2C34FE22AB 509204E88EF9EF99185B3C8886159B3176F3E5F402B1D02B2D4B609D0CCE351C 2359F2939CD363539092D8FF2224477AE821781268E62501686208667E84330A 2F78BB713985555BD487E9E96E200F3C3F3A4855B3A34AA6538DE19C596975E7 3057991DCE616F8497107AE5BCB9AF4D6A378703FB3CE76DF2AE97D73AADEDD1 CD25EE673645E37DC423D95CDECEC782429A2EAF02ECC7B12AADD0713CBDC651 E329FC54D5B20E59C0D1E3E7D90CE989DAB198781A6F995C870DA857B27E9766 AAFB24789DFE711E3D3E75C63EC1800A271EA373F91F77BFF0F967FB547E0555 04AB52E0BA89A05894EC375949E3B3F93BA44145165A53CF5175354C2644ED9A 229FF9553F5D5D911F077A97BCAFEEA8E34E5C0857B213DF7FC42EA5D5CC2240 7967C88DC72A924D0093E4E2A432C124206601FD9656C5C5F3D7DF198A64F110 7F79098B2E28CC2DDABA7FB57513B220433ED110BDF7B824DA1E1598E4CC1B76 B6709606A1C6B152B62696D200A689B48FF3C014F995063BD65693BD9B3EF06E 9E5958FDB0B958A44CC65F8A4270E98787A494AB15CA3529EC181F51349BFB72 6F7C3710400942018BE111FD9EC31E97A335980736131D6D166C5709BF4C4640 85C234126360D2C8CB7F1A726F65137977FDF9AFE12502D16D60E2F53E64D831 871D64995542ED0F3E75471FCD577812AD41FD32F39445D6651E1DF07B858B77 F13A1280226E1AA6569F024F207E68DAFF3329000BB5667D55D874658DF72A24 0EF3CB37A0D5C588BAA54B57EBC7E86301A1328F025E5F8F79E4D7B1E7A289D6 D7AB9925C312C4DFE30D5FEE14661CCB922853C2C91E57A5713E92EDE9E4D415 E25B398009955FF2DFA3DEF412AB199EC838B237801A8EB023BF6FF1BBF8B43D 25B7AB118DE14A884B63B1D63D5D5F40D2C483E9CE83B0C18FCCF207D85AB1A4 9070BF1C2E2FBD683295EC2772725833B51FBBFDBC358A6C21F3DDA76B8D19C4 988FB00E0F152B55E040DD4BC09CB5A6BAE0D2CEEBC8735BB44137A536705293 0DE35CFA0E7970C47B48BC51977E99F238F8906911115712D40EAFCDFF4B9898 5037A636C2E9BD3C99157F391B338778B2A13D82B4C009872CBB18084B2C4FF7 A15B136FB5C83C6A97CDFE6B8FA51D26DA2905A145FFD1331200A6387413B214 F97487AB29B968392D4259E555333728E4624075BC9B044BBC6971084A773E92 0B8897CAA0D31328632461E27992A1B6D8E8CCEDDA48CD47C1F558A7089CC4A6 68264FB382927F3734ED718BABB1FC3640AFEC29539BC647B5B1B02E08599849 871EAEB1E17E5A58050D399C44AD526072C214EF35722F362CC638A57BDC0349 3FFCF1E23BABF3226136C272DEF994C2709B30F03FD1D5C94CBCFCDE1D8A409D 4EAB4B9E1ADF15523F2754C7056D7FFCD1AF88BF14CB44C2901CF72B631E2FBD A9A75EB424363549E95DE31644435027DB028F396EC572E007C757AB54B7A844 12640FCC8BF2814487C9E55820A4211EB6FFC56DA695FD7341B17BC41249E1D4 F47C90531A3BEB3B02BC120AF5F3335C1270ABF17EAC8C466A5CB7773BCDA6FD 48D0EE661F14BBB97DAFE30F8E0E02 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont TeXDict begin 40258431 52099146 1000 600 600 (./gperf.dvi) @start /Fa 197[25 58[{}1 90.9091 /CMMI10 rf /Fb 197[33 58[{}1 119.552 /CMMI12 rf /Fc 197[21 58[{}1 74.7198 /CMMI9 rf /Fd 133[34 41 41 55 41 43 30 30 30 1[43 38 43 64 21 2[21 43 38 23 34 43 34 43 38 21 10[58 1[43 4[58 70 48 60 39 28 2[50 1[59 55 54 58 7[38 38 38 38 38 38 38 38 38 4[21 4[21 26[43 12[{}49 74.7198 /CMR9 rf /Fe 147[25 10[44 97[{}2 90.9091 /CMB10 rf /Ff 139[52 52 52 3[52 1[52 6[52 101[{}6 99.6264 /CMSLTT10 rf /Fg 214[35 35 40[{}2 90.9091 /CMSS10 rf /Fh 133[52 2[52 1[52 52 52 52 2[52 52 4[52 52 52 1[52 52 52 1[52 1[52 50[52 1[52 42[{}18 99.6264 /CMTT10 rf /Fi 133[48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 51[48 45[{}26 90.9091 /CMSLTT10 rf /Fj 138[56 56 56 56 3[56 4[56 3[56 56 56 99[{}9 109.091 /CMTT12 rf /Fk 134[65 1[89 65 68 48 48 50 1[68 61 68 102 34 2[34 68 61 37 56 68 55 1[60 9[127 1[94 6[96 2[96 1[46 1[96 77 81 94 89 1[93 12[61 61 61 61 2[34 41 45[{}37 109.091 /CMBX12 rf /Fl 141[62 1[62 8[62 62 62 101[{}5 119.552 /CMTT12 rf /Fm 133[37 44 42 1[42 49 30 37 38 1[46 46 51 74 23 42 1[28 46 42 28 42 46 42 42 46 4[47 4[91 1[68 65 51 66 1[62 70 68 82 57 3[68 70 59 62 1[65 1[68 6[28 11[28 33 5[28 4[47 34[{}45 90.9091 /CMTI10 rf /Fn 134[48 1[66 48 51 35 36 36 1[51 45 51 76 25 48 28 25 51 2[40 51 40 1[45 9[93 3[51 8[47 3[59 20[45 3[30 45[{}26 90.9091 /CMSL10 rf /Fo 141[74 1[74 8[74 74 74 101[{}5 143.462 /CMTT12 rf /Fp 130[39 1[39 39 39 39 39 39 39 39 39 39 1[39 39 39 39 39 39 1[39 39 39 39 39 39 39 39 39 39 39 5[39 1[39 1[39 39 39 39 1[39 39 39 39 39 2[39 39 39 39 39 1[39 39 39 5[39 39 2[39 3[39 3[39 39 39 39 2[39 39 39 1[39 37[{}59 74.7198 /CMTT9 rf /Fq 134[39 1[39 39 39 39 39 39 1[39 39 39 39 39 2[39 39 39 39 39 39 1[39 39 50[39 32[39 13[{}22 74.7198 /CMSLTT10 rf /Fr 129[48 48 1[48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 2[48 1[48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 1[48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 20[48 13[{}83 90.9091 /CMTT10 rf /Fs 134[85 85 117 85 90 63 64 66 1[90 81 90 134 45 85 1[45 90 81 49 74 90 72 90 78 11[124 112 90 120 1[110 1[126 1[97 126 1[60 126 127 1[106 124 117 115 122 9[81 81 81 81 81 81 81 3[54 45[{}47 143.462 /CMBX12 rf /Ft 240[45 1[91 13[{}2 90.9091 /CMSY10 rf /Fu 134[71 71 97 71 75 52 53 55 1[75 67 75 112 37 71 1[37 75 67 41 61 75 60 75 65 7[102 3[103 94 75 100 1[92 101 105 128 81 105 69 50 105 106 85 88 103 97 96 102 9[67 67 67 67 67 67 67 2[37 45 7[112 24[75 78 11[{}56 119.552 /CMBX12 rf /Fv 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 45 25 1[68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 47 33 68 71 59 62 69 66 64 68 3[71 1[25 25 45 45 45 45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25 71 1[45 76 45 19[76 51 51 53 11[{}86 90.9091 /CMR10 rf /Fw 141[89 1[89 8[89 89 89 101[{}5 172.154 /CMTT12 rf /Fx 138[108 75 76 79 2[97 5[54 3[88 108 14[149 13[152 19[97 97 3[54 6[54 39[{}14 172.154 /CMBX12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: Letter /setpagedevice where { pop << /PageSize [612 792] >> setpagedevice } { /letter where { pop letter } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 150 1318 a Fx(User's)65 b(Guide)g(to)f Fw(gperf)f Fx(3.2)p 150 1423 3600 34 v 2005 1519 a Fv(The)30 b(GNU)h(P)m(erfect)h(Hash)e(F)-8 b(unction)31 b(Generator)2599 1627 y(Edition)g(3.2,)h(28)f(Octob)s(er)f(2024)150 4950 y Fu(Douglas)46 b(C.)f(Sc)l(hmidt)150 5091 y(Bruno)f(Haible)p 150 5141 3600 17 v eop end %%Page: 2 2 TeXDict begin 2 1 bop 150 4152 a Fv(Cop)m(yrigh)m(t)602 4149 y(c)577 4152 y Ft(\015)30 b Fv(1989-2024)k(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32 b(Inc.)150 4286 y(P)m(ermission)g(is)h(gran)m(ted)g(to)f(mak)m(e)i(and)d (distribute)h(v)m(erbatim)h(copies)g(of)f(this)g(man)m(ual)h(pro)m (vided)f(the)150 4396 y(cop)m(yrigh)m(t)g(notice)f(and)f(this)g(p)s (ermission)g(notice)h(are)g(preserv)m(ed)f(on)h(all)g(copies.)150 4530 y(P)m(ermission)38 b(is)h(gran)m(ted)f(to)h(cop)m(y)g(and)f (distribute)g(mo)s(di\014ed)f(v)m(ersions)h(of)h(this)f(man)m(ual)g (under)f(the)150 4640 y(conditions)44 b(for)f(v)m(erbatim)h(cop)m (ying,)k(pro)m(vided)43 b(also)h(that)h(the)e(section)i(en)m(titled)g (\\GNU)f(General)150 4749 y(Public)27 b(License")g(is)g(included)f (exactly)j(as)e(in)f(the)h(original,)i(and)d(pro)m(vided)h(that)g(the)g (en)m(tire)h(resulting)150 4859 y(deriv)m(ed)i(w)m(ork)h(is)f (distributed)g(under)f(the)h(terms)g(of)h(a)g(p)s(ermission)e(notice)j (iden)m(tical)g(to)f(this)f(one.)150 4994 y(P)m(ermission)j(is)h(gran)m (ted)f(to)h(cop)m(y)g(and)f(distribute)f(translations)i(of)g(this)f (man)m(ual)g(in)m(to)h(another)f(lan-)150 5103 y(guage,)41 b(under)35 b(the)j(ab)s(o)m(v)m(e)g(conditions)g(for)f(mo)s(di\014ed)g (v)m(ersions,)i(except)g(that)e(the)h(section)g(en)m(titled)150 5213 y(\\GNU)e(General)h(Public)e(License")h(ma)m(y)g(b)s(e)e(included) h(in)g(a)h(translation)g(appro)m(v)m(ed)f(b)m(y)h(the)f(author)150 5322 y(instead)c(of)f(in)g(the)h(original)g(English.)p eop end %%Page: 1 3 TeXDict begin 1 2 bop 3705 -116 a Fv(1)150 299 y Fs(GNU)54 b(GENERAL)g(PUBLIC)f(LICENSE)1477 520 y Fv(V)-8 b(ersion)31 b(3,)g(29)g(June)e(2007)390 660 y(Cop)m(yrigh)m(t)842 657 y(c)817 660 y Ft(\015)h Fv(2007)i(F)-8 b(ree)32 b(Soft)m(w)m(are)f (F)-8 b(oundation,)32 b(Inc.)e Fr(http://fsf.org/)390 880 y Fv(Ev)m(ery)m(one)h(is)g(p)s(ermitted)f(to)h(cop)m(y)g(and)f (distribute)g(v)m(erbatim)h(copies)g(of)g(this)390 989 y(license)g(do)s(cumen)m(t,)g(but)e(c)m(hanging)j(it)f(is)f(not)h(allo) m(w)m(ed.)150 1239 y Fu(Pream)l(ble)275 1398 y Fv(The)e(GNU)h(General)h (Public)e(License)h(is)g(a)g(free,)g(cop)m(yleft)i(license)e(for)g (soft)m(w)m(are)h(and)e(other)h(kinds)150 1508 y(of)h(w)m(orks.)275 1648 y(The)c(licenses)i(for)e(most)i(soft)m(w)m(are)g(and)e(other)i (practical)g(w)m(orks)f(are)g(designed)g(to)h(tak)m(e)g(a)m(w)m(a)m(y)h (y)m(our)150 1758 y(freedom)k(to)h(share)e(and)h(c)m(hange)h(the)f(w)m (orks.)51 b(By)35 b(con)m(trast,)h(the)e(GNU)h(General)g(Public)e (License)i(is)150 1867 y(in)m(tended)25 b(to)h(guaran)m(tee)h(y)m(our)e (freedom)g(to)h(share)f(and)f(c)m(hange)j(all)f(v)m(ersions)f(of)h(a)f (program|to)h(mak)m(e)150 1977 y(sure)35 b(it)h(remains)f(free)h(soft)m (w)m(are)h(for)f(all)g(its)g(users.)56 b(W)-8 b(e,)38 b(the)e(F)-8 b(ree)37 b(Soft)m(w)m(are)g(F)-8 b(oundation,)37 b(use)f(the)150 2087 y(GNU)j(General)g(Public)f(License)g(for)g(most)h (of)f(our)f(soft)m(w)m(are;)44 b(it)39 b(applies)f(also)h(to)g(an)m(y)f (other)h(w)m(ork)150 2196 y(released)31 b(this)f(w)m(a)m(y)i(b)m(y)e (its)h(authors.)40 b(Y)-8 b(ou)31 b(can)g(apply)f(it)h(to)g(y)m(our)f (programs,)g(to)s(o.)275 2337 y(When)37 b(w)m(e)g(sp)s(eak)g(of)g(free) h(soft)m(w)m(are,)i(w)m(e)e(are)g(referring)e(to)i(freedom,)h(not)f (price.)61 b(Our)36 b(General)150 2446 y(Public)e(Licenses)g(are)h (designed)f(to)h(mak)m(e)g(sure)f(that)g(y)m(ou)h(ha)m(v)m(e)g(the)g (freedom)f(to)g(distribute)g(copies)150 2556 y(of)e(free)f(soft)m(w)m (are)i(\(and)e(c)m(harge)i(for)e(them)h(if)f(y)m(ou)h(wish\),)f(that)h (y)m(ou)g(receiv)m(e)h(source)f(co)s(de)g(or)f(can)h(get)150 2665 y(it)e(if)f(y)m(ou)g(w)m(an)m(t)i(it,)f(that)g(y)m(ou)f(can)h(c)m (hange)g(the)f(soft)m(w)m(are)i(or)e(use)g(pieces)h(of)f(it)h(in)f(new) g(free)g(programs,)150 2775 y(and)h(that)h(y)m(ou)f(kno)m(w)h(y)m(ou)g (can)f(do)g(these)h(things.)275 2915 y(T)-8 b(o)24 b(protect)h(y)m(our) f(righ)m(ts,)i(w)m(e)f(need)f(to)h(prev)m(en)m(t)g(others)f(from)g(den) m(ying)g(y)m(ou)g(these)h(righ)m(ts)f(or)g(asking)150 3025 y(y)m(ou)37 b(to)g(surrender)d(the)j(righ)m(ts.)60 b(Therefore,)38 b(y)m(ou)f(ha)m(v)m(e)g(certain)h(resp)s(onsibilities)e (if)h(y)m(ou)f(distribute)150 3134 y(copies)30 b(of)f(the)g(soft)m(w)m (are,)i(or)e(if)f(y)m(ou)i(mo)s(dify)e(it:)40 b(resp)s(onsibilities)29 b(to)h(resp)s(ect)f(the)g(freedom)g(of)g(others.)275 3275 y(F)-8 b(or)30 b(example,)g(if)g(y)m(ou)f(distribute)g(copies)i (of)e(suc)m(h)g(a)h(program,)g(whether)e(gratis)j(or)e(for)g(a)h(fee,)h (y)m(ou)150 3384 y(m)m(ust)i(pass)f(on)h(to)h(the)f(recipien)m(ts)h (the)f(same)h(freedoms)e(that)i(y)m(ou)f(receiv)m(ed.)50 b(Y)-8 b(ou)34 b(m)m(ust)f(mak)m(e)h(sure)150 3494 y(that)29 b(they)-8 b(,)29 b(to)s(o,)h(receiv)m(e)g(or)f(can)f(get)i(the)e (source)h(co)s(de.)40 b(And)27 b(y)m(ou)i(m)m(ust)f(sho)m(w)g(them)h (these)f(terms)h(so)150 3604 y(they)i(kno)m(w)f(their)g(righ)m(ts.)275 3744 y(Dev)m(elop)s(ers)i(that)f(use)g(the)g(GNU)h(GPL)f(protect)g(y)m (our)g(righ)m(ts)h(with)e(t)m(w)m(o)j(steps:)41 b(\(1\))32 b(assert)g(cop)m(y-)150 3854 y(righ)m(t)38 b(on)e(the)h(soft)m(w)m (are,)k(and)36 b(\(2\))i(o\013er)g(y)m(ou)f(this)g(License)g(giving)h (y)m(ou)f(legal)i(p)s(ermission)d(to)i(cop)m(y)-8 b(,)150 3963 y(distribute)30 b(and/or)g(mo)s(dify)g(it.)275 4104 y(F)-8 b(or)35 b(the)g(dev)m(elop)s(ers')h(and)e(authors')h (protection,)j(the)d(GPL)g(clearly)h(explains)f(that)h(there)f(is)g(no) 150 4213 y(w)m(arran)m(t)m(y)g(for)f(this)g(free)g(soft)m(w)m(are.)54 b(F)-8 b(or)35 b(b)s(oth)e(users')h(and)g(authors')g(sak)m(e,)i(the)e (GPL)h(requires)e(that)150 4323 y(mo)s(di\014ed)42 b(v)m(ersions)i(b)s (e)f(mark)m(ed)g(as)h(c)m(hanged,)j(so)d(that)g(their)f(problems)g (will)g(not)h(b)s(e)f(attributed)150 4432 y(erroneously)30 b(to)h(authors)f(of)h(previous)f(v)m(ersions.)275 4573 y(Some)e(devices)h(are)f(designed)g(to)h(den)m(y)f(users)g(access)h(to) g(install)g(or)f(run)f(mo)s(di\014ed)g(v)m(ersions)h(of)h(the)150 4682 y(soft)m(w)m(are)34 b(inside)e(them,)g(although)h(the)f(man)m (ufacturer)g(can)h(do)f(so.)46 b(This)32 b(is)g(fundamen)m(tally)g (incom-)150 4792 y(patible)j(with)e(the)h(aim)h(of)f(protecting)h (users')e(freedom)h(to)h(c)m(hange)g(the)f(soft)m(w)m(are.)53 b(The)33 b(systematic)150 4902 y(pattern)j(of)g(suc)m(h)g(abuse)f(o)s (ccurs)h(in)f(the)i(area)f(of)g(pro)s(ducts)f(for)h(individuals)f(to)h (use,)i(whic)m(h)d(is)h(pre-)150 5011 y(cisely)d(where)e(it)h(is)f (most)h(unacceptable.)46 b(Therefore,)32 b(w)m(e)g(ha)m(v)m(e)h (designed)e(this)g(v)m(ersion)h(of)g(the)g(GPL)150 5121 y(to)38 b(prohibit)e(the)i(practice)g(for)f(those)h(pro)s(ducts.)60 b(If)37 b(suc)m(h)f(problems)h(arise)h(substan)m(tially)g(in)f(other) 150 5230 y(domains,)28 b(w)m(e)f(stand)g(ready)g(to)h(extend)f(this)g (pro)m(vision)g(to)h(those)f(domains)g(in)g(future)f(v)m(ersions)i(of)f (the)150 5340 y(GPL,)k(as)f(needed)g(to)h(protect)h(the)e(freedom)h(of) f(users.)p eop end %%Page: 2 4 TeXDict begin 2 3 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(2)275 299 y(Finally)-8 b(,)34 b(ev)m(ery)f(program)f (is)g(threatened)h(constan)m(tly)h(b)m(y)e(soft)m(w)m(are)i(paten)m (ts.)47 b(States)33 b(should)f(not)150 408 y(allo)m(w)25 b(paten)m(ts)e(to)h(restrict)g(dev)m(elopmen)m(t)g(and)f(use)g(of)g (soft)m(w)m(are)h(on)f(general-purp)s(ose)g(computers,)i(but)150 518 y(in)h(those)h(that)g(do,)g(w)m(e)g(wish)f(to)h(a)m(v)m(oid)h(the)e (sp)s(ecial)h(danger)f(that)h(paten)m(ts)h(applied)e(to)h(a)g(free)f (program)150 628 y(could)h(mak)m(e)i(it)f(e\013ectiv)m(ely)i (proprietary)-8 b(.)40 b(T)-8 b(o)28 b(prev)m(en)m(t)g(this,)g(the)g (GPL)f(assures)g(that)h(paten)m(ts)g(cannot)150 737 y(b)s(e)i(used)f (to)i(render)f(the)g(program)g(non-free.)275 880 y(The)f(precise)i (terms)f(and)g(conditions)h(for)f(cop)m(ying,)i(distribution)d(and)h (mo)s(di\014cation)h(follo)m(w.)150 1134 y Fu(TERMS)44 b(AND)h(CONDITIONS)199 1293 y Fv(0.)61 b(De\014nitions.)330 1432 y(\\This)30 b(License")h(refers)f(to)i(v)m(ersion)e(3)h(of)g(the)f (GNU)h(General)g(Public)g(License.)330 1571 y(\\Cop)m(yrigh)m(t")e (also)g(means)e(cop)m(yrigh)m(t-lik)m(e)k(la)m(ws)d(that)g(apply)f(to)h (other)g(kinds)f(of)g(w)m(orks,)h(suc)m(h)g(as)330 1680 y(semiconductor)j(masks.)330 1819 y(\\The)40 b(Program")h(refers)f(to)g (an)m(y)h(cop)m(yrigh)m(table)h(w)m(ork)e(licensed)h(under)e(this)h (License.)70 b(Eac)m(h)330 1929 y(licensee)43 b(is)f(addressed)f(as)h (\\y)m(ou".)76 b(\\Licensees")44 b(and)d(\\recipien)m(ts")i(ma)m(y)g(b) s(e)e(individuals)g(or)330 2038 y(organizations.)330 2177 y(T)-8 b(o)32 b(\\mo)s(dify")g(a)g(w)m(ork)g(means)g(to)h(cop)m(y) f(from)g(or)f(adapt)h(all)h(or)f(part)g(of)g(the)g(w)m(ork)f(in)h(a)g (fashion)330 2287 y(requiring)d(cop)m(yrigh)m(t)h(p)s(ermission,)e (other)i(than)f(the)g(making)g(of)g(an)g(exact)i(cop)m(y)-8 b(.)41 b(The)29 b(resulting)330 2396 y(w)m(ork)f(is)f(called)i(a)f (\\mo)s(di\014ed)f(v)m(ersion")i(of)f(the)g(earlier)g(w)m(ork)g(or)g(a) g(w)m(ork)f(\\based)h(on")g(the)g(earlier)330 2506 y(w)m(ork.)330 2644 y(A)k(\\co)m(v)m(ered)i(w)m(ork")f(means)f(either)g(the)g(unmo)s (di\014ed)e(Program)i(or)g(a)h(w)m(ork)f(based)g(on)g(the)g(Pro-)330 2754 y(gram.)330 2893 y(T)-8 b(o)31 b(\\propagate")i(a)e(w)m(ork)g (means)g(to)h(do)e(an)m(ything)i(with)e(it)h(that,)h(without)f(p)s (ermission,)f(w)m(ould)330 3002 y(mak)m(e)c(y)m(ou)e(directly)i(or)e (secondarily)h(liable)h(for)e(infringemen)m(t)h(under)e(applicable)i (cop)m(yrigh)m(t)h(la)m(w,)330 3112 y(except)34 b(executing)g(it)g(on)e (a)i(computer)f(or)f(mo)s(difying)h(a)g(priv)-5 b(ate)33 b(cop)m(y)-8 b(.)50 b(Propagation)34 b(includes)330 3222 y(cop)m(ying,)39 b(distribution)c(\(with)h(or)h(without)f(mo)s (di\014cation\),)i(making)f(a)m(v)-5 b(ailable)38 b(to)f(the)f(public,) 330 3331 y(and)30 b(in)g(some)h(coun)m(tries)g(other)f(activities)j(as) e(w)m(ell.)330 3470 y(T)-8 b(o)28 b(\\con)m(v)m(ey")j(a)d(w)m(ork)g (means)g(an)m(y)g(kind)f(of)h(propagation)h(that)g(enables)f(other)g (parties)g(to)h(mak)m(e)330 3579 y(or)k(receiv)m(e)j(copies.)50 b(Mere)34 b(in)m(teraction)i(with)d(a)g(user)g(through)g(a)g(computer)h (net)m(w)m(ork,)h(with)e(no)330 3689 y(transfer)d(of)g(a)h(cop)m(y)-8 b(,)32 b(is)e(not)h(con)m(v)m(eying.)330 3828 y(An)25 b(in)m(teractiv)m(e)k(user)c(in)m(terface)j(displa)m(ys)e (\\Appropriate)g(Legal)h(Notices")h(to)f(the)f(exten)m(t)h(that)f(it) 330 3937 y(includes)k(a)g(con)m(v)m(enien)m(t)j(and)c(prominen)m(tly)h (visible)h(feature)g(that)f(\(1\))i(displa)m(ys)e(an)g(appropriate)330 4047 y(cop)m(yrigh)m(t)j(notice,)h(and)d(\(2\))i(tells)f(the)g(user)f (that)i(there)e(is)h(no)g(w)m(arran)m(t)m(y)g(for)g(the)g(w)m(ork)g (\(except)330 4157 y(to)e(the)g(exten)m(t)h(that)f(w)m(arran)m(ties)g (are)g(pro)m(vided\),)g(that)g(licensees)g(ma)m(y)g(con)m(v)m(ey)h(the) f(w)m(ork)f(under)330 4266 y(this)37 b(License,)i(and)e(ho)m(w)g(to)g (view)h(a)f(cop)m(y)h(of)f(this)g(License.)61 b(If)36 b(the)i(in)m(terface)g(presen)m(ts)f(a)g(list)330 4376 y(of)32 b(user)e(commands)h(or)h(options,)g(suc)m(h)f(as)g(a)h(men)m (u,)f(a)h(prominen)m(t)f(item)h(in)f(the)h(list)g(meets)g(this)330 4485 y(criterion.)199 4624 y(1.)61 b(Source)30 b(Co)s(de.)330 4763 y(The)g(\\source)i(co)s(de")f(for)g(a)g(w)m(ork)g(means)g(the)g (preferred)f(form)g(of)h(the)g(w)m(ork)g(for)g(making)g(mo)s(di-)330 4872 y(\014cations)g(to)g(it.)41 b(\\Ob)5 b(ject)31 b(co)s(de")g(means) g(an)m(y)f(non-source)h(form)f(of)g(a)h(w)m(ork.)330 5011 y(A)36 b(\\Standard)f(In)m(terface")i(means)f(an)f(in)m(terface)i (that)g(either)f(is)g(an)f(o\016cial)i(standard)e(de\014ned)330 5121 y(b)m(y)e(a)g(recognized)i(standards)d(b)s(o)s(dy)-8 b(,)33 b(or,)h(in)f(the)g(case)h(of)f(in)m(terfaces)i(sp)s(eci\014ed)d (for)h(a)h(particular)330 5230 y(programming)44 b(language,)49 b(one)c(that)f(is)g(widely)h(used)e(among)i(dev)m(elop)s(ers)f(w)m (orking)h(in)e(that)330 5340 y(language.)p eop end %%Page: 3 5 TeXDict begin 3 4 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(3)330 299 y(The)24 b(\\System)g(Libraries")g(of)g(an)g (executable)i(w)m(ork)e(include)f(an)m(ything,)j(other)f(than)e(the)i (w)m(ork)f(as)330 408 y(a)k(whole,)g(that)g(\(a\))g(is)f(included)g(in) g(the)g(normal)g(form)g(of)h(pac)m(k)-5 b(aging)29 b(a)e(Ma)5 b(jor)28 b(Comp)s(onen)m(t,)g(but)330 518 y(whic)m(h)33 b(is)g(not)h(part)f(of)h(that)g(Ma)5 b(jor)34 b(Comp)s(onen)m(t,)g(and) e(\(b\))i(serv)m(es)g(only)f(to)h(enable)g(use)f(of)h(the)330 628 y(w)m(ork)c(with)g(that)g(Ma)5 b(jor)31 b(Comp)s(onen)m(t,)e(or)h (to)h(implemen)m(t)g(a)f(Standard)f(In)m(terface)i(for)e(whic)m(h)h(an) 330 737 y(implemen)m(tation)g(is)e(a)m(v)-5 b(ailable)30 b(to)f(the)f(public)g(in)f(source)i(co)s(de)f(form.)39 b(A)29 b(\\Ma)5 b(jor)29 b(Comp)s(onen)m(t",)330 847 y(in)38 b(this)g(con)m(text,)k(means)c(a)g(ma)5 b(jor)38 b(essen)m(tial)i(comp)s(onen)m(t)e(\(k)m(ernel,)j(windo)m(w)d(system,)i (and)e(so)330 956 y(on\))c(of)g(the)g(sp)s(eci\014c)f(op)s(erating)h (system)g(\(if)g(an)m(y\))h(on)e(whic)m(h)h(the)g(executable)h(w)m(ork) f(runs,)f(or)h(a)330 1066 y(compiler)d(used)f(to)h(pro)s(duce)e(the)h (w)m(ork,)h(or)f(an)h(ob)5 b(ject)31 b(co)s(de)g(in)m(terpreter)f(used) g(to)h(run)e(it.)330 1212 y(The)f(\\Corresp)s(onding)g(Source")h(for)f (a)h(w)m(ork)g(in)g(ob)5 b(ject)29 b(co)s(de)g(form)g(means)f(all)i (the)f(source)g(co)s(de)330 1322 y(needed)35 b(to)h(generate,)i (install,)f(and)e(\(for)g(an)h(executable)g(w)m(ork\))g(run)e(the)h(ob) 5 b(ject)36 b(co)s(de)g(and)e(to)330 1431 y(mo)s(dify)39 b(the)g(w)m(ork,)j(including)d(scripts)g(to)i(con)m(trol)f(those)g (activities.)71 b(Ho)m(w)m(ev)m(er,)44 b(it)c(do)s(es)f(not)330 1541 y(include)i(the)h(w)m(ork's)g(System)g(Libraries,)i(or)e (general-purp)s(ose)f(to)s(ols)i(or)f(generally)h(a)m(v)-5 b(ailable)330 1650 y(free)31 b(programs)g(whic)m(h)g(are)h(used)e(unmo) s(di\014ed)f(in)i(p)s(erforming)f(those)h(activities)j(but)d(whic)m(h)g (are)330 1760 y(not)g(part)f(of)h(the)g(w)m(ork.)42 b(F)-8 b(or)32 b(example,)f(Corresp)s(onding)e(Source)i(includes)f(in)m (terface)i(de\014nition)330 1870 y(\014les)g(asso)s(ciated)i(with)d (source)i(\014les)f(for)g(the)g(w)m(ork,)h(and)f(the)g(source)g(co)s (de)h(for)e(shared)h(libraries)330 1979 y(and)g(dynamically)g(link)m (ed)h(subprograms)e(that)h(the)h(w)m(ork)f(is)g(sp)s(eci\014cally)h (designed)f(to)h(require,)330 2089 y(suc)m(h)k(as)g(b)m(y)g(in)m (timate)i(data)e(comm)m(unication)i(or)e(con)m(trol)h(\015o)m(w)f(b)s (et)m(w)m(een)h(those)f(subprograms)330 2198 y(and)30 b(other)g(parts)g(of)h(the)g(w)m(ork.)330 2345 y(The)h(Corresp)s (onding)f(Source)i(need)f(not)h(include)f(an)m(ything)i(that)f(users)f (can)h(regenerate)h(auto-)330 2454 y(matically)e(from)e(other)h(parts)f (of)h(the)f(Corresp)s(onding)f(Source.)330 2600 y(The)h(Corresp)s (onding)e(Source)j(for)f(a)h(w)m(ork)f(in)g(source)h(co)s(de)f(form)g (is)h(that)f(same)h(w)m(ork.)199 2746 y(2.)61 b(Basic)32 b(P)m(ermissions.)330 2892 y(All)44 b(righ)m(ts)f(gran)m(ted)g(under)f (this)h(License)g(are)g(gran)m(ted)h(for)f(the)g(term)g(of)g(cop)m (yrigh)m(t)h(on)f(the)330 3002 y(Program,)29 b(and)e(are)i(irrev)m(o)s (cable)g(pro)m(vided)f(the)g(stated)h(conditions)g(are)f(met.)40 b(This)28 b(License)g(ex-)330 3112 y(plicitly)h(a\016rms)e(y)m(our)h (unlimited)g(p)s(ermission)e(to)j(run)d(the)i(unmo)s(di\014ed)e (Program.)40 b(The)27 b(output)330 3221 y(from)37 b(running)e(a)j(co)m (v)m(ered)h(w)m(ork)e(is)g(co)m(v)m(ered)i(b)m(y)e(this)h(License)f (only)h(if)f(the)g(output,)i(giv)m(en)g(its)330 3331 y(con)m(ten)m(t,)33 b(constitutes)f(a)g(co)m(v)m(ered)g(w)m(ork.)42 b(This)31 b(License)g(ac)m(kno)m(wledges)i(y)m(our)e(righ)m(ts)g(of)g (fair)g(use)330 3440 y(or)f(other)h(equiv)-5 b(alen)m(t,)32 b(as)f(pro)m(vided)f(b)m(y)g(cop)m(yrigh)m(t)i(la)m(w.)330 3587 y(Y)-8 b(ou)41 b(ma)m(y)h(mak)m(e,)i(run)c(and)g(propagate)i(co)m (v)m(ered)g(w)m(orks)f(that)g(y)m(ou)h(do)e(not)h(con)m(v)m(ey)-8 b(,)46 b(without)330 3696 y(conditions)30 b(so)f(long)h(as)g(y)m(our)f (license)h(otherwise)g(remains)f(in)g(force.)41 b(Y)-8 b(ou)30 b(ma)m(y)f(con)m(v)m(ey)i(co)m(v)m(ered)330 3806 y(w)m(orks)40 b(to)g(others)g(for)g(the)g(sole)g(purp)s(ose)e(of)i(ha)m (ving)h(them)e(mak)m(e)i(mo)s(di\014cations)f(exclusiv)m(ely)330 3915 y(for)45 b(y)m(ou,)50 b(or)45 b(pro)m(vide)h(y)m(ou)f(with)g (facilities)j(for)d(running)f(those)h(w)m(orks,)50 b(pro)m(vided)45 b(that)h(y)m(ou)330 4025 y(comply)34 b(with)f(the)h(terms)f(of)h(this)f (License)i(in)e(con)m(v)m(eying)i(all)g(material)g(for)e(whic)m(h)g(y)m (ou)h(do)g(not)330 4134 y(con)m(trol)i(cop)m(yrigh)m(t.)55 b(Those)35 b(th)m(us)f(making)h(or)g(running)e(the)i(co)m(v)m(ered)h(w) m(orks)f(for)f(y)m(ou)h(m)m(ust)g(do)330 4244 y(so)29 b(exclusiv)m(ely)h(on)e(y)m(our)g(b)s(ehalf,)h(under)d(y)m(our)j (direction)g(and)f(con)m(trol,)i(on)e(terms)h(that)g(prohibit)330 4354 y(them)35 b(from)g(making)g(an)m(y)h(copies)g(of)f(y)m(our)h(cop)m (yrigh)m(ted)g(material)h(outside)e(their)h(relationship)330 4463 y(with)30 b(y)m(ou.)330 4609 y(Con)m(v)m(eying)46 b(under)d(an)m(y)i(other)g(circumstances)g(is)g(p)s(ermitted)g(solely)g (under)f(the)g(conditions)330 4719 y(stated)31 b(b)s(elo)m(w.)41 b(Sublicensing)30 b(is)g(not)h(allo)m(w)m(ed;)h(section)g(10)f(mak)m (es)g(it)g(unnecessary)-8 b(.)199 4865 y(3.)61 b(Protecting)32 b(Users')e(Legal)i(Righ)m(ts)f(F)-8 b(rom)31 b(An)m(ti-Circum)m(v)m(en) m(tion)i(La)m(w.)330 5011 y(No)44 b(co)m(v)m(ered)i(w)m(ork)d(shall)h (b)s(e)g(deemed)f(part)h(of)g(an)f(e\013ectiv)m(e)k(tec)m(hnological)g (measure)c(under)330 5121 y(an)m(y)30 b(applicable)h(la)m(w)f (ful\014lling)g(obligations)h(under)e(article)i(11)g(of)f(the)g(WIPO)f (cop)m(yrigh)m(t)i(treat)m(y)330 5230 y(adopted)e(on)f(20)i(Decem)m(b)s (er)f(1996,)i(or)e(similar)g(la)m(ws)g(prohibiting)f(or)h(restricting)g (circum)m(v)m(en)m(tion)330 5340 y(of)i(suc)m(h)f(measures.)p eop end %%Page: 4 6 TeXDict begin 4 5 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(4)330 299 y(When)25 b(y)m(ou)h(con)m(v)m(ey)g(a)g(co)m (v)m(ered)h(w)m(ork,)f(y)m(ou)g(w)m(aiv)m(e)h(an)m(y)e(legal)i(p)s(o)m (w)m(er)f(to)g(forbid)e(circum)m(v)m(en)m(tion)j(of)330 408 y(tec)m(hnological)j(measures)d(to)g(the)g(exten)m(t)h(suc)m(h)e (circum)m(v)m(en)m(tion)j(is)d(e\013ected)i(b)m(y)f(exercising)g(righ)m (ts)330 518 y(under)35 b(this)h(License)h(with)e(resp)s(ect)i(to)g(the) f(co)m(v)m(ered)i(w)m(ork,)g(and)d(y)m(ou)i(disclaim)g(an)m(y)f(in)m (ten)m(tion)330 628 y(to)41 b(limit)g(op)s(eration)g(or)f(mo)s (di\014cation)h(of)g(the)f(w)m(ork)h(as)f(a)h(means)f(of)h(enforcing,)i (against)f(the)330 737 y(w)m(ork's)28 b(users,)f(y)m(our)h(or)f(third)g (parties')h(legal)h(righ)m(ts)f(to)g(forbid)f(circum)m(v)m(en)m(tion)i (of)e(tec)m(hnological)330 847 y(measures.)199 982 y(4.)61 b(Con)m(v)m(eying)31 b(V)-8 b(erbatim)32 b(Copies.)330 1117 y(Y)-8 b(ou)28 b(ma)m(y)g(con)m(v)m(ey)h(v)m(erbatim)f(copies)g (of)g(the)f(Program's)h(source)g(co)s(de)f(as)h(y)m(ou)f(receiv)m(e)j (it,)f(in)e(an)m(y)330 1226 y(medium,)33 b(pro)m(vided)g(that)h(y)m(ou) f(conspicuously)g(and)g(appropriately)g(publish)f(on)h(eac)m(h)h(cop)m (y)g(an)330 1336 y(appropriate)e(cop)m(yrigh)m(t)i(notice;)g(k)m(eep)f (in)m(tact)h(all)f(notices)g(stating)h(that)e(this)g(License)h(and)f (an)m(y)330 1445 y(non-p)s(ermissiv)m(e)d(terms)g(added)f(in)h(accord)h (with)f(section)h(7)f(apply)g(to)h(the)f(co)s(de;)h(k)m(eep)g(in)m (tact)h(all)330 1555 y(notices)37 b(of)f(the)g(absence)g(of)g(an)m(y)g (w)m(arran)m(t)m(y;)j(and)c(giv)m(e)i(all)g(recipien)m(ts)f(a)h(cop)m (y)f(of)g(this)f(License)330 1665 y(along)c(with)f(the)h(Program.)330 1799 y(Y)-8 b(ou)27 b(ma)m(y)g(c)m(harge)h(an)m(y)f(price)g(or)f(no)h (price)f(for)h(eac)m(h)g(cop)m(y)h(that)f(y)m(ou)g(con)m(v)m(ey)-8 b(,)29 b(and)d(y)m(ou)h(ma)m(y)h(o\013er)330 1909 y(supp)s(ort)h(or)h (w)m(arran)m(t)m(y)h(protection)h(for)e(a)h(fee.)199 2044 y(5.)61 b(Con)m(v)m(eying)31 b(Mo)s(di\014ed)f(Source)g(V)-8 b(ersions.)330 2179 y(Y)g(ou)27 b(ma)m(y)g(con)m(v)m(ey)h(a)f(w)m(ork)g (based)f(on)h(the)g(Program,)g(or)g(the)g(mo)s(di\014cations)g(to)g (pro)s(duce)e(it)i(from)330 2288 y(the)36 b(Program,)h(in)e(the)g(form) g(of)g(source)h(co)s(de)g(under)d(the)j(terms)f(of)h(section)g(4,)h (pro)m(vided)e(that)330 2398 y(y)m(ou)c(also)g(meet)g(all)h(of)e(these) h(conditions:)379 2533 y(a.)61 b(The)28 b(w)m(ork)h(m)m(ust)f(carry)h (prominen)m(t)f(notices)i(stating)g(that)f(y)m(ou)g(mo)s(di\014ed)e (it,)j(and)e(giving)i(a)510 2642 y(relev)-5 b(an)m(t)32 b(date.)374 2777 y(b.)60 b(The)34 b(w)m(ork)h(m)m(ust)f(carry)h (prominen)m(t)f(notices)i(stating)g(that)f(it)g(is)g(released)g(under)e (this)i(Li-)510 2887 y(cense)i(and)f(an)m(y)h(conditions)h(added)e (under)f(section)j(7.)60 b(This)36 b(requiremen)m(t)h(mo)s(di\014es)f (the)510 2996 y(requiremen)m(t)31 b(in)f(section)h(4)g(to)g(\\k)m(eep)h (in)m(tact)g(all)f(notices".)384 3131 y(c.)61 b(Y)-8 b(ou)36 b(m)m(ust)g(license)g(the)g(en)m(tire)h(w)m(ork,)g(as)f(a)g (whole,)h(under)d(this)i(License)g(to)h(an)m(y)m(one)f(who)510 3241 y(comes)31 b(in)m(to)g(p)s(ossession)e(of)h(a)h(cop)m(y)-8 b(.)41 b(This)29 b(License)i(will)f(therefore)h(apply)-8 b(,)30 b(along)h(with)f(an)m(y)510 3351 y(applicable)k(section)f(7)g (additional)h(terms,)f(to)h(the)e(whole)h(of)g(the)g(w)m(ork,)g(and)f (all)i(its)f(parts,)510 3460 y(regardless)h(of)g(ho)m(w)g(they)g(are)g (pac)m(k)-5 b(aged.)52 b(This)33 b(License)h(giv)m(es)h(no)f(p)s (ermission)e(to)j(license)510 3570 y(the)c(w)m(ork)h(in)f(an)m(y)g (other)h(w)m(a)m(y)-8 b(,)33 b(but)d(it)i(do)s(es)f(not)g(in)m(v)-5 b(alidate)33 b(suc)m(h)e(p)s(ermission)f(if)h(y)m(ou)h(ha)m(v)m(e)510 3679 y(separately)g(receiv)m(ed)f(it.)374 3814 y(d.)60 b(If)36 b(the)h(w)m(ork)g(has)g(in)m(teractiv)m(e)j(user)c(in)m (terfaces,)k(eac)m(h)e(m)m(ust)f(displa)m(y)g(Appropriate)g(Legal)510 3924 y(Notices;)49 b(ho)m(w)m(ev)m(er,)c(if)c(the)h(Program)f(has)g(in) m(teractiv)m(e)j(in)m(terfaces)e(that)g(do)f(not)h(displa)m(y)510 4033 y(Appropriate)30 b(Legal)i(Notices,)g(y)m(our)f(w)m(ork)f(need)g (not)h(mak)m(e)g(them)g(do)f(so.)330 4194 y(A)38 b(compilation)h(of)f (a)g(co)m(v)m(ered)h(w)m(ork)f(with)f(other)h(separate)h(and)e(indep)s (enden)m(t)f(w)m(orks,)k(whic)m(h)330 4303 y(are)c(not)g(b)m(y)g(their) g(nature)f(extensions)h(of)g(the)g(co)m(v)m(ered)i(w)m(ork,)f(and)e (whic)m(h)h(are)g(not)g(com)m(bined)330 4413 y(with)27 b(it)i(suc)m(h)e(as)h(to)h(form)e(a)h(larger)h(program,)f(in)f(or)h(on) g(a)g(v)m(olume)g(of)g(a)h(storage)g(or)f(distribution)330 4522 y(medium,)43 b(is)f(called)g(an)g(\\aggregate")j(if)c(the)h (compilation)h(and)e(its)g(resulting)h(cop)m(yrigh)m(t)h(are)330 4632 y(not)31 b(used)f(to)h(limit)h(the)e(access)i(or)f(legal)h(righ)m (ts)f(of)g(the)g(compilation's)h(users)e(b)s(ey)m(ond)g(what)h(the)330 4741 y(individual)j(w)m(orks)h(p)s(ermit.)54 b(Inclusion)34 b(of)h(a)h(co)m(v)m(ered)g(w)m(ork)f(in)g(an)g(aggregate)j(do)s(es)c (not)h(cause)330 4851 y(this)30 b(License)h(to)g(apply)f(to)h(the)g (other)g(parts)f(of)g(the)h(aggregate.)199 4986 y(6.)61 b(Con)m(v)m(eying)31 b(Non-Source)g(F)-8 b(orms.)330 5121 y(Y)g(ou)29 b(ma)m(y)h(con)m(v)m(ey)g(a)f(co)m(v)m(ered)i(w)m(ork) e(in)f(ob)5 b(ject)30 b(co)s(de)f(form)f(under)g(the)h(terms)f(of)h (sections)h(4)g(and)330 5230 y(5,)42 b(pro)m(vided)d(that)g(y)m(ou)h (also)g(con)m(v)m(ey)g(the)g(mac)m(hine-readable)g(Corresp)s(onding)e (Source)g(under)330 5340 y(the)31 b(terms)f(of)g(this)h(License,)g(in)f (one)h(of)f(these)h(w)m(a)m(ys:)p eop end %%Page: 5 7 TeXDict begin 5 6 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(5)379 299 y(a.)61 b(Con)m(v)m(ey)32 b(the)f(ob)5 b(ject)31 b(co)s(de)g(in,)g(or)g(em)m(b)s(o)s(died)f(in,)h(a)g(ph)m (ysical)h(pro)s(duct)d(\(including)i(a)g(ph)m(ys-)510 408 y(ical)37 b(distribution)d(medium\),)j(accompanied)f(b)m(y)f(the)h (Corresp)s(onding)d(Source)j(\014xed)e(on)i(a)510 518 y(durable)30 b(ph)m(ysical)h(medium)e(customarily)i(used)f(for)g(soft)m (w)m(are)i(in)m(terc)m(hange.)374 655 y(b.)60 b(Con)m(v)m(ey)30 b(the)f(ob)5 b(ject)30 b(co)s(de)f(in,)g(or)g(em)m(b)s(o)s(died)f(in,)h (a)g(ph)m(ysical)g(pro)s(duct)f(\(including)h(a)g(ph)m(ysi-)510 765 y(cal)k(distribution)e(medium\),)h(accompanied)h(b)m(y)e(a)i (written)f(o\013er,)g(v)-5 b(alid)33 b(for)e(at)i(least)g(three)510 874 y(y)m(ears)i(and)f(v)-5 b(alid)35 b(for)f(as)g(long)h(as)g(y)m(ou)g (o\013er)f(spare)h(parts)f(or)g(customer)h(supp)s(ort)d(for)i(that)510 984 y(pro)s(duct)c(mo)s(del,)i(to)g(giv)m(e)g(an)m(y)m(one)h(who)d(p)s (ossesses)h(the)h(ob)5 b(ject)32 b(co)s(de)f(either)h(\(1\))g(a)g(cop)m (y)g(of)510 1093 y(the)24 b(Corresp)s(onding)e(Source)i(for)g(all)h (the)f(soft)m(w)m(are)h(in)f(the)g(pro)s(duct)f(that)i(is)f(co)m(v)m (ered)h(b)m(y)f(this)510 1203 y(License,)30 b(on)g(a)f(durable)g(ph)m (ysical)h(medium)e(customarily)i(used)f(for)g(soft)m(w)m(are)i(in)m (terc)m(hange,)510 1313 y(for)k(a)g(price)h(no)f(more)g(than)g(y)m(our) g(reasonable)h(cost)g(of)f(ph)m(ysically)h(p)s(erforming)e(this)h(con-) 510 1422 y(v)m(eying)f(of)f(source,)g(or)g(\(2\))h(access)g(to)g(cop)m (y)f(the)g(Corresp)s(onding)e(Source)i(from)f(a)h(net)m(w)m(ork)510 1532 y(serv)m(er)e(at)g(no)f(c)m(harge.)384 1669 y(c.)61 b(Con)m(v)m(ey)40 b(individual)e(copies)h(of)g(the)g(ob)5 b(ject)40 b(co)s(de)f(with)g(a)g(cop)m(y)g(of)g(the)g(written)g (o\013er)g(to)510 1778 y(pro)m(vide)e(the)g(Corresp)s(onding)e(Source.) 59 b(This)36 b(alternativ)m(e)k(is)c(allo)m(w)m(ed)j(only)e(o)s (ccasionally)510 1888 y(and)29 b(noncommercially)-8 b(,)31 b(and)e(only)g(if)h(y)m(ou)f(receiv)m(ed)i(the)e(ob)5 b(ject)31 b(co)s(de)e(with)g(suc)m(h)g(an)g(o\013er,)510 1998 y(in)h(accord)h(with)f(subsection)h(6b.)374 2134 y(d.)60 b(Con)m(v)m(ey)37 b(the)f(ob)5 b(ject)37 b(co)s(de)f(b)m(y)g (o\013ering)g(access)i(from)d(a)i(designated)f(place)h(\(gratis)g(or)f (for)510 2244 y(a)j(c)m(harge\),)k(and)c(o\013er)g(equiv)-5 b(alen)m(t)41 b(access)f(to)g(the)f(Corresp)s(onding)e(Source)i(in)f (the)i(same)510 2354 y(w)m(a)m(y)30 b(through)f(the)g(same)h(place)h (at)f(no)f(further)f(c)m(harge.)41 b(Y)-8 b(ou)30 b(need)f(not)h (require)f(recipien)m(ts)510 2463 y(to)42 b(cop)m(y)h(the)f(Corresp)s (onding)e(Source)h(along)i(with)f(the)g(ob)5 b(ject)42 b(co)s(de.)75 b(If)42 b(the)f(place)i(to)510 2573 y(cop)m(y)c(the)g(ob) 5 b(ject)39 b(co)s(de)g(is)g(a)g(net)m(w)m(ork)g(serv)m(er,)i(the)e (Corresp)s(onding)e(Source)h(ma)m(y)h(b)s(e)f(on)510 2682 y(a)45 b(di\013eren)m(t)g(serv)m(er)f(\(op)s(erated)h(b)m(y)f(y)m (ou)h(or)g(a)f(third)g(part)m(y\))h(that)g(supp)s(orts)d(equiv)-5 b(alen)m(t)510 2792 y(cop)m(ying)35 b(facilities,)i(pro)m(vided)c(y)m (ou)h(main)m(tain)h(clear)g(directions)f(next)g(to)h(the)f(ob)5 b(ject)35 b(co)s(de)510 2902 y(sa)m(ying)h(where)f(to)h(\014nd)d(the)i (Corresp)s(onding)f(Source.)55 b(Regardless)35 b(of)h(what)f(serv)m(er) g(hosts)510 3011 y(the)e(Corresp)s(onding)e(Source,)j(y)m(ou)f(remain)f (obligated)j(to)e(ensure)f(that)i(it)f(is)g(a)m(v)-5 b(ailable)35 b(for)510 3121 y(as)c(long)g(as)f(needed)g(to)h(satisfy)g (these)g(requiremen)m(ts.)384 3258 y(e.)61 b(Con)m(v)m(ey)24 b(the)g(ob)5 b(ject)24 b(co)s(de)f(using)g(p)s(eer-to-p)s(eer)h (transmission,)g(pro)m(vided)f(y)m(ou)h(inform)f(other)510 3367 y(p)s(eers)d(where)g(the)h(ob)5 b(ject)22 b(co)s(de)f(and)f (Corresp)s(onding)f(Source)i(of)g(the)g(w)m(ork)g(are)g(b)s(eing)g (o\013ered)510 3477 y(to)31 b(the)g(general)g(public)f(at)h(no)f(c)m (harge)i(under)d(subsection)h(6d.)330 3641 y(A)35 b(separable)f(p)s (ortion)g(of)h(the)g(ob)5 b(ject)35 b(co)s(de,)h(whose)e(source)h(co)s (de)g(is)f(excluded)g(from)g(the)h(Cor-)330 3751 y(resp)s(onding)c (Source)h(as)h(a)g(System)f(Library)-8 b(,)33 b(need)f(not)h(b)s(e)e (included)h(in)g(con)m(v)m(eying)i(the)f(ob)5 b(ject)330 3861 y(co)s(de)31 b(w)m(ork.)330 3998 y(A)h(\\User)g(Pro)s(duct")f(is)h (either)g(\(1\))g(a)g(\\consumer)g(pro)s(duct",)f(whic)m(h)h(means)f (an)m(y)h(tangible)h(p)s(er-)330 4107 y(sonal)g(prop)s(ert)m(y)g(whic)m (h)f(is)h(normally)h(used)e(for)h(p)s(ersonal,)g(family)-8 b(,)35 b(or)e(household)f(purp)s(oses,)g(or)330 4217 y(\(2\))26 b(an)m(ything)f(designed)f(or)h(sold)g(for)f(incorp)s (oration)h(in)m(to)h(a)f(dw)m(elling.)39 b(In)24 b(determining)h (whether)330 4326 y(a)30 b(pro)s(duct)e(is)h(a)h(consumer)f(pro)s (duct,)f(doubtful)h(cases)h(shall)g(b)s(e)e(resolv)m(ed)j(in)e(fa)m(v)m (or)h(of)g(co)m(v)m(erage.)330 4436 y(F)-8 b(or)42 b(a)g(particular)g (pro)s(duct)f(receiv)m(ed)i(b)m(y)e(a)h(particular)g(user,)i (\\normally)f(used")e(refers)g(to)i(a)330 4545 y(t)m(ypical)e(or)e (common)h(use)e(of)i(that)g(class)g(of)f(pro)s(duct,)h(regardless)g(of) f(the)h(status)f(of)h(the)f(par-)330 4655 y(ticular)d(user)e(or)h(of)h (the)f(w)m(a)m(y)h(in)f(whic)m(h)f(the)i(particular)f(user)g(actually)h (uses,)g(or)f(exp)s(ects)h(or)f(is)330 4765 y(exp)s(ected)d(to)g(use,)g (the)g(pro)s(duct.)43 b(A)32 b(pro)s(duct)f(is)g(a)h(consumer)f(pro)s (duct)g(regardless)h(of)g(whether)330 4874 y(the)h(pro)s(duct)f(has)h (substan)m(tial)g(commercial,)j(industrial)c(or)h(non-consumer)g(uses,) g(unless)f(suc)m(h)330 4984 y(uses)e(represen)m(t)g(the)h(only)f (signi\014can)m(t)i(mo)s(de)e(of)g(use)g(of)h(the)f(pro)s(duct.)330 5121 y(\\Installation)h(Information")e(for)g(a)g(User)g(Pro)s(duct)f (means)g(an)m(y)i(metho)s(ds,)e(pro)s(cedures,)g(autho-)330 5230 y(rization)d(k)m(eys,)g(or)f(other)f(information)h(required)f(to)h (install)g(and)f(execute)i(mo)s(di\014ed)d(v)m(ersions)i(of)g(a)330 5340 y(co)m(v)m(ered)h(w)m(ork)e(in)g(that)h(User)f(Pro)s(duct)f(from)h (a)h(mo)s(di\014ed)e(v)m(ersion)h(of)h(its)f(Corresp)s(onding)f (Source.)p eop end %%Page: 6 8 TeXDict begin 6 7 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(6)330 299 y(The)30 b(information)h(m)m(ust)f(su\016ce)g (to)i(ensure)d(that)i(the)g(con)m(tin)m(ued)g(functioning)g(of)f(the)h (mo)s(di\014ed)330 408 y(ob)5 b(ject)34 b(co)s(de)f(is)g(in)f(no)h (case)h(prev)m(en)m(ted)f(or)g(in)m(terfered)g(with)g(solely)h(b)s (ecause)f(mo)s(di\014cation)g(has)330 518 y(b)s(een)d(made.)330 650 y(If)38 b(y)m(ou)i(con)m(v)m(ey)g(an)f(ob)5 b(ject)40 b(co)s(de)f(w)m(ork)g(under)e(this)i(section)h(in,)h(or)e(with,)i(or)e (sp)s(eci\014cally)g(for)330 759 y(use)g(in,)i(a)e(User)g(Pro)s(duct,)i (and)e(the)g(con)m(v)m(eying)i(o)s(ccurs)d(as)i(part)f(of)g(a)g (transaction)h(in)f(whic)m(h)330 869 y(the)d(righ)m(t)g(of)g(p)s (ossession)f(and)g(use)h(of)f(the)h(User)g(Pro)s(duct)f(is)g (transferred)g(to)i(the)e(recipien)m(t)i(in)330 978 y(p)s(erp)s(etuit)m (y)43 b(or)g(for)g(a)h(\014xed)e(term)i(\(regardless)g(of)f(ho)m(w)h (the)f(transaction)i(is)e(c)m(haracterized\),)330 1088 y(the)c(Corresp)s(onding)e(Source)i(con)m(v)m(ey)m(ed)i(under)c(this)i (section)h(m)m(ust)f(b)s(e)f(accompanied)i(b)m(y)f(the)330 1198 y(Installation)d(Information.)52 b(But)35 b(this)f(requiremen)m(t) g(do)s(es)g(not)h(apply)f(if)g(neither)g(y)m(ou)h(nor)f(an)m(y)330 1307 y(third)28 b(part)m(y)i(retains)f(the)g(abilit)m(y)i(to)e(install) h(mo)s(di\014ed)e(ob)5 b(ject)30 b(co)s(de)f(on)g(the)h(User)f(Pro)s (duct)f(\(for)330 1417 y(example,)j(the)g(w)m(ork)f(has)g(b)s(een)g (installed)h(in)f(R)m(OM\).)330 1548 y(The)38 b(requiremen)m(t)g(to)h (pro)m(vide)g(Installation)g(Information)g(do)s(es)f(not)g(include)g(a) h(requiremen)m(t)330 1658 y(to)32 b(con)m(tin)m(ue)h(to)f(pro)m(vide)g (supp)s(ort)e(service,)j(w)m(arran)m(t)m(y)-8 b(,)33 b(or)f(up)s(dates)e(for)i(a)g(w)m(ork)f(that)h(has)g(b)s(een)330 1767 y(mo)s(di\014ed)37 b(or)h(installed)h(b)m(y)g(the)f(recipien)m(t,) k(or)c(for)g(the)g(User)h(Pro)s(duct)e(in)h(whic)m(h)g(it)h(has)f(b)s (een)330 1877 y(mo)s(di\014ed)29 b(or)h(installed.)42 b(Access)31 b(to)g(a)g(net)m(w)m(ork)g(ma)m(y)g(b)s(e)e(denied)h(when)f (the)i(mo)s(di\014cation)f(itself)330 1987 y(materially)i(and)e(adv)m (ersely)h(a\013ects)h(the)e(op)s(eration)h(of)g(the)f(net)m(w)m(ork)h (or)g(violates)h(the)f(rules)f(and)330 2096 y(proto)s(cols)h(for)f (comm)m(unication)i(across)f(the)g(net)m(w)m(ork.)330 2228 y(Corresp)s(onding)26 b(Source)h(con)m(v)m(ey)m(ed,)j(and)d (Installation)i(Information)f(pro)m(vided,)g(in)f(accord)h(with)330 2337 y(this)d(section)i(m)m(ust)e(b)s(e)g(in)g(a)h(format)g(that)f(is)h (publicly)f(do)s(cumen)m(ted)g(\(and)g(with)g(an)h(implemen)m(ta-)330 2447 y(tion)i(a)m(v)-5 b(ailable)29 b(to)f(the)g(public)e(in)h(source)h (co)s(de)f(form\),)h(and)f(m)m(ust)g(require)g(no)g(sp)s(ecial)h(passw) m(ord)330 2556 y(or)i(k)m(ey)i(for)e(unpac)m(king,)g(reading)h(or)f (cop)m(ying.)199 2688 y(7.)61 b(Additional)31 b(T)-8 b(erms.)330 2819 y(\\Additional)29 b(p)s(ermissions")e(are)h(terms)f (that)h(supplemen)m(t)f(the)h(terms)g(of)f(this)h(License)g(b)m(y)g (mak-)330 2929 y(ing)41 b(exceptions)h(from)e(one)h(or)g(more)g(of)g (its)g(conditions.)72 b(Additional)42 b(p)s(ermissions)d(that)j(are)330 3039 y(applicable)31 b(to)f(the)g(en)m(tire)h(Program)f(shall)g(b)s(e)f (treated)i(as)f(though)f(they)h(w)m(ere)h(included)e(in)g(this)330 3148 y(License,)36 b(to)e(the)g(exten)m(t)i(that)e(they)g(are)g(v)-5 b(alid)34 b(under)f(applicable)i(la)m(w.)52 b(If)33 b(additional)i(p)s (ermis-)330 3258 y(sions)27 b(apply)h(only)f(to)h(part)g(of)f(the)h (Program,)h(that)f(part)f(ma)m(y)h(b)s(e)f(used)g(separately)h(under)e (those)330 3367 y(p)s(ermissions,)31 b(but)g(the)h(en)m(tire)h(Program) f(remains)f(go)m(v)m(erned)i(b)m(y)f(this)g(License)g(without)g(regard) 330 3477 y(to)f(the)g(additional)g(p)s(ermissions.)330 3608 y(When)45 b(y)m(ou)g(con)m(v)m(ey)i(a)e(cop)m(y)h(of)f(a)g(co)m(v) m(ered)i(w)m(ork,)h(y)m(ou)e(ma)m(y)f(at)h(y)m(our)f(option)g(remo)m(v) m(e)i(an)m(y)330 3718 y(additional)30 b(p)s(ermissions)e(from)h(that)h (cop)m(y)-8 b(,)31 b(or)f(from)e(an)m(y)i(part)f(of)h(it.)41 b(\(Additional)30 b(p)s(ermissions)330 3828 y(ma)m(y)41 b(b)s(e)f(written)g(to)h(require)f(their)h(o)m(wn)f(remo)m(v)-5 b(al)42 b(in)e(certain)h(cases)g(when)f(y)m(ou)g(mo)s(dify)g(the)330 3937 y(w)m(ork.\))48 b(Y)-8 b(ou)33 b(ma)m(y)g(place)h(additional)f(p)s (ermissions)e(on)i(material,)i(added)d(b)m(y)g(y)m(ou)h(to)g(a)g(co)m (v)m(ered)330 4047 y(w)m(ork,)e(for)f(whic)m(h)g(y)m(ou)h(ha)m(v)m(e)g (or)g(can)f(giv)m(e)i(appropriate)f(cop)m(yrigh)m(t)g(p)s(ermission.) 330 4178 y(Not)m(withstanding)e(an)m(y)g(other)g(pro)m(vision)f(of)h (this)f(License,)h(for)f(material)i(y)m(ou)f(add)f(to)h(a)f(co)m(v)m (ered)330 4288 y(w)m(ork,)40 b(y)m(ou)e(ma)m(y)g(\(if)g(authorized)g(b) m(y)g(the)g(cop)m(yrigh)m(t)h(holders)e(of)h(that)g(material\))h (supplemen)m(t)330 4398 y(the)31 b(terms)f(of)g(this)h(License)g(with)f (terms:)379 4529 y(a.)61 b(Disclaiming)31 b(w)m(arran)m(t)m(y)f(or)g (limiting)g(liabilit)m(y)h(di\013eren)m(tly)f(from)f(the)g(terms)g(of)h (sections)g(15)510 4639 y(and)g(16)h(of)g(this)f(License;)h(or)374 4770 y(b.)60 b(Requiring)30 b(preserv)-5 b(ation)31 b(of)g(sp)s (eci\014ed)f(reasonable)h(legal)i(notices)f(or)e(author)h(attributions) 510 4880 y(in)24 b(that)i(material)g(or)f(in)f(the)h(Appropriate)g (Legal)h(Notices)h(displa)m(y)m(ed)e(b)m(y)g(w)m(orks)f(con)m(taining) 510 4989 y(it;)31 b(or)384 5121 y(c.)61 b(Prohibiting)23 b(misrepresen)m(tation)i(of)e(the)h(origin)g(of)f(that)i(material,)h (or)d(requiring)g(that)h(mo)s(d-)510 5230 y(i\014ed)30 b(v)m(ersions)h(of)f(suc)m(h)g(material)i(b)s(e)e(mark)m(ed)h(in)f (reasonable)h(w)m(a)m(ys)g(as)g(di\013eren)m(t)g(from)f(the)510 5340 y(original)i(v)m(ersion;)f(or)p eop end %%Page: 7 9 TeXDict begin 7 8 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(7)374 299 y(d.)60 b(Limiting)42 b(the)f(use)g(for)g (publicit)m(y)h(purp)s(oses)d(of)i(names)g(of)h(licensors)f(or)h (authors)e(of)i(the)510 408 y(material;)32 b(or)384 543 y(e.)61 b(Declining)29 b(to)f(gran)m(t)g(righ)m(ts)f(under)f(trademark) h(la)m(w)h(for)f(use)g(of)g(some)h(trade)f(names,)h(trade-)510 653 y(marks,)i(or)h(service)g(marks;)f(or)397 788 y(f.)60 b(Requiring)26 b(indemni\014cation)g(of)g(licensors)h(and)f(authors)f (of)i(that)f(material)i(b)m(y)e(an)m(y)m(one)h(who)510 897 y(con)m(v)m(eys)45 b(the)e(material)h(\(or)g(mo)s(di\014ed)e(v)m (ersions)h(of)h(it\))g(with)e(con)m(tractual)k(assumptions)510 1007 y(of)40 b(liabilit)m(y)h(to)f(the)f(recipien)m(t,)k(for)c(an)m(y)h (liabilit)m(y)h(that)f(these)g(con)m(tractual)i(assumptions)510 1117 y(directly)31 b(imp)s(ose)f(on)g(those)h(licensors)g(and)f (authors.)330 1277 y(All)i(other)h(non-p)s(ermissiv)m(e)e(additional)i (terms)e(are)i(considered)e(\\further)g(restrictions")i(within)330 1386 y(the)j(meaning)f(of)h(section)g(10.)57 b(If)35 b(the)h(Program)f(as)h(y)m(ou)g(receiv)m(ed)g(it,)i(or)d(an)m(y)h(part) f(of)h(it,)h(con-)330 1496 y(tains)f(a)g(notice)h(stating)g(that)f(it)g (is)g(go)m(v)m(erned)h(b)m(y)e(this)h(License)g(along)h(with)e(a)h (term)g(that)g(is)g(a)330 1606 y(further)24 b(restriction,)k(y)m(ou)e (ma)m(y)g(remo)m(v)m(e)h(that)f(term.)39 b(If)26 b(a)g(license)g(do)s (cumen)m(t)g(con)m(tains)g(a)g(further)330 1715 y(restriction)33 b(but)f(p)s(ermits)g(relicensing)h(or)g(con)m(v)m(eying)h(under)d(this) i(License,)g(y)m(ou)g(ma)m(y)g(add)f(to)i(a)330 1825 y(co)m(v)m(ered)g(w)m(ork)e(material)h(go)m(v)m(erned)h(b)m(y)e(the)g (terms)g(of)g(that)h(license)g(do)s(cumen)m(t,)g(pro)m(vided)e(that)330 1934 y(the)g(further)e(restriction)i(do)s(es)f(not)h(surviv)m(e)f(suc)m (h)g(relicensing)h(or)g(con)m(v)m(eying.)330 2069 y(If)f(y)m(ou)g(add)g (terms)g(to)h(a)g(co)m(v)m(ered)h(w)m(ork)e(in)g(accord)h(with)f(this)g (section,)i(y)m(ou)e(m)m(ust)g(place,)i(in)e(the)330 2179 y(relev)-5 b(an)m(t)31 b(source)f(\014les,)g(a)g(statemen)m(t)h (of)f(the)g(additional)g(terms)g(that)g(apply)f(to)i(those)f(\014les,)g (or)g(a)330 2288 y(notice)i(indicating)f(where)f(to)h(\014nd)e(the)h (applicable)i(terms.)330 2423 y(Additional)37 b(terms,)h(p)s(ermissiv)m (e)e(or)h(non-p)s(ermissiv)m(e,)h(ma)m(y)f(b)s(e)e(stated)j(in)e(the)h (form)f(of)g(a)h(sep-)330 2533 y(arately)i(written)f(license,)i(or)e (stated)h(as)e(exceptions;)43 b(the)38 b(ab)s(o)m(v)m(e)h(requiremen)m (ts)e(apply)g(either)330 2642 y(w)m(a)m(y)-8 b(.)199 2777 y(8.)61 b(T)-8 b(ermination.)330 2912 y(Y)g(ou)40 b(ma)m(y)g(not)f(propagate)i(or)e(mo)s(dify)g(a)g(co)m(v)m(ered)i(w)m (ork)f(except)g(as)g(expressly)f(pro)m(vided)g(un-)330 3022 y(der)d(this)h(License.)62 b(An)m(y)37 b(attempt)h(otherwise)f(to) h(propagate)g(or)f(mo)s(dify)f(it)i(is)f(v)m(oid,)i(and)e(will)330 3131 y(automatically)g(terminate)d(y)m(our)g(righ)m(ts)g(under)f(this)g (License)i(\(including)e(an)m(y)h(paten)m(t)h(licenses)330 3241 y(gran)m(ted)c(under)e(the)h(third)g(paragraph)g(of)g(section)i (11\).)330 3376 y(Ho)m(w)m(ev)m(er,)j(if)e(y)m(ou)f(cease)i(all)f (violation)i(of)d(this)g(License,)i(then)e(y)m(our)h(license)g(from)f (a)h(particular)330 3485 y(cop)m(yrigh)m(t)k(holder)e(is)h(reinstated)h (\(a\))f(pro)m(visionally)-8 b(,)39 b(unless)c(and)g(un)m(til)h(the)g (cop)m(yrigh)m(t)h(holder)330 3595 y(explicitly)42 b(and)e(\014nally)h (terminates)g(y)m(our)g(license,)j(and)c(\(b\))h(p)s(ermanen)m(tly)-8 b(,)43 b(if)e(the)g(cop)m(yrigh)m(t)330 3705 y(holder)34 b(fails)h(to)g(notify)g(y)m(ou)g(of)f(the)h(violation)h(b)m(y)e(some)h (reasonable)g(means)g(prior)e(to)i(60)h(da)m(ys)330 3814 y(after)31 b(the)f(cessation.)330 3949 y(Moreo)m(v)m(er,)k(y)m(our)d (license)i(from)e(a)h(particular)f(cop)m(yrigh)m(t)i(holder)e(is)h (reinstated)g(p)s(ermanen)m(tly)f(if)330 4059 y(the)d(cop)m(yrigh)m(t)h (holder)f(noti\014es)g(y)m(ou)g(of)g(the)g(violation)h(b)m(y)f(some)g (reasonable)h(means,)f(this)g(is)g(the)330 4168 y(\014rst)f(time)i(y)m (ou)f(ha)m(v)m(e)h(receiv)m(ed)g(notice)g(of)f(violation)i(of)e(this)f (License)i(\(for)f(an)m(y)g(w)m(ork\))g(from)f(that)330 4278 y(cop)m(yrigh)m(t)33 b(holder,)g(and)e(y)m(ou)h(cure)g(the)g (violation)i(prior)d(to)i(30)f(da)m(ys)h(after)f(y)m(our)g(receipt)h (of)f(the)330 4387 y(notice.)330 4522 y(T)-8 b(ermination)28 b(of)g(y)m(our)f(righ)m(ts)h(under)e(this)i(section)g(do)s(es)f(not)h (terminate)h(the)e(licenses)i(of)f(parties)330 4632 y(who)38 b(ha)m(v)m(e)h(receiv)m(ed)h(copies)e(or)h(righ)m(ts)f(from)g(y)m(ou)g (under)f(this)h(License.)64 b(If)38 b(y)m(our)g(righ)m(ts)h(ha)m(v)m(e) 330 4741 y(b)s(een)f(terminated)h(and)e(not)i(p)s(ermanen)m(tly)f (reinstated,)j(y)m(ou)e(do)f(not)h(qualify)f(to)h(receiv)m(e)h(new)330 4851 y(licenses)31 b(for)f(the)h(same)g(material)h(under)c(section)k (10.)199 4986 y(9.)61 b(Acceptance)32 b(Not)g(Required)d(for)i(Ha)m (ving)g(Copies.)330 5121 y(Y)-8 b(ou)38 b(are)g(not)g(required)f(to)h (accept)h(this)f(License)g(in)f(order)g(to)h(receiv)m(e)i(or)e(run)e(a) i(cop)m(y)g(of)g(the)330 5230 y(Program.)i(Ancillary)27 b(propagation)g(of)g(a)g(co)m(v)m(ered)h(w)m(ork)e(o)s(ccurring)g (solely)i(as)f(a)g(consequence)g(of)330 5340 y(using)i(p)s(eer-to-p)s (eer)g(transmission)g(to)h(receiv)m(e)h(a)e(cop)m(y)h(lik)m(ewise)h(do) s(es)d(not)i(require)e(acceptance.)p eop end %%Page: 8 10 TeXDict begin 8 9 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(8)330 299 y(Ho)m(w)m(ev)m(er,)28 b(nothing)c(other)g (than)g(this)f(License)i(gran)m(ts)g(y)m(ou)f(p)s(ermission)f(to)i (propagate)g(or)f(mo)s(dify)330 408 y(an)m(y)34 b(co)m(v)m(ered)g(w)m (ork.)50 b(These)32 b(actions)j(infringe)e(cop)m(yrigh)m(t)h(if)f(y)m (ou)h(do)f(not)g(accept)i(this)e(License.)330 518 y(Therefore,)f(b)m(y) f(mo)s(difying)g(or)g(propagating)h(a)g(co)m(v)m(ered)h(w)m(ork,)f(y)m (ou)g(indicate)g(y)m(our)g(acceptance)330 628 y(of)f(this)f(License)h (to)g(do)f(so.)154 759 y(10.)61 b(Automatic)32 b(Licensing)f(of)f(Do)m (wnstream)i(Recipien)m(ts.)330 891 y(Eac)m(h)39 b(time)g(y)m(ou)g(con)m (v)m(ey)h(a)f(co)m(v)m(ered)h(w)m(ork,)h(the)d(recipien)m(t)i (automatically)h(receiv)m(es)f(a)f(license)330 1000 y(from)e(the)h (original)h(licensors,)h(to)f(run,)f(mo)s(dify)f(and)g(propagate)i (that)f(w)m(ork,)i(sub)5 b(ject)38 b(to)g(this)330 1110 y(License.)60 b(Y)-8 b(ou)38 b(are)f(not)g(resp)s(onsible)e(for)i (enforcing)g(compliance)h(b)m(y)f(third)f(parties)h(with)f(this)330 1219 y(License.)330 1351 y(An)43 b(\\en)m(tit)m(y)i(transaction")g(is)f (a)f(transaction)i(transferring)e(con)m(trol)h(of)g(an)f(organization,) 49 b(or)330 1461 y(substan)m(tially)24 b(all)f(assets)g(of)g(one,)i(or) e(sub)s(dividing)d(an)j(organization,)j(or)d(merging)g(organizations.) 330 1570 y(If)28 b(propagation)i(of)f(a)h(co)m(v)m(ered)g(w)m(ork)f (results)g(from)f(an)h(en)m(tit)m(y)i(transaction,)f(eac)m(h)g(part)m (y)g(to)f(that)330 1680 y(transaction)g(who)d(receiv)m(es)k(a)d(cop)m (y)i(of)e(the)h(w)m(ork)f(also)i(receiv)m(es)g(whatev)m(er)f(licenses)g (to)g(the)g(w)m(ork)330 1789 y(the)d(part)m(y's)g(predecessor)g(in)g (in)m(terest)h(had)e(or)h(could)g(giv)m(e)h(under)e(the)h(previous)f (paragraph,)i(plus)330 1899 y(a)31 b(righ)m(t)g(to)h(p)s(ossession)e (of)h(the)g(Corresp)s(onding)e(Source)i(of)g(the)f(w)m(ork)h(from)g (the)g(predecessor)f(in)330 2008 y(in)m(terest,)i(if)e(the)h (predecessor)f(has)g(it)h(or)f(can)h(get)h(it)e(with)h(reasonable)g (e\013orts.)330 2140 y(Y)-8 b(ou)36 b(ma)m(y)g(not)g(imp)s(ose)f(an)m (y)h(further)e(restrictions)j(on)e(the)h(exercise)g(of)g(the)g(righ)m (ts)g(gran)m(ted)g(or)330 2250 y(a\016rmed)27 b(under)f(this)h (License.)40 b(F)-8 b(or)28 b(example,)h(y)m(ou)f(ma)m(y)g(not)g(imp)s (ose)f(a)h(license)g(fee,)h(ro)m(y)m(alt)m(y)-8 b(,)31 b(or)330 2359 y(other)d(c)m(harge)g(for)g(exercise)h(of)e(righ)m(ts)h (gran)m(ted)g(under)e(this)i(License,)h(and)d(y)m(ou)i(ma)m(y)g(not)g (initiate)330 2469 y(litigation)f(\(including)d(a)g(cross-claim)i(or)e (coun)m(terclaim)i(in)e(a)g(la)m(wsuit\))i(alleging)g(that)e(an)m(y)h (paten)m(t)330 2578 y(claim)j(is)g(infringed)e(b)m(y)i(making,)g (using,)g(selling,)h(o\013ering)f(for)f(sale,)i(or)e(imp)s(orting)g (the)h(Program)330 2688 y(or)i(an)m(y)h(p)s(ortion)f(of)h(it.)154 2819 y(11.)61 b(P)m(aten)m(ts.)330 2951 y(A)41 b(\\con)m(tributor")h (is)f(a)g(cop)m(yrigh)m(t)i(holder)d(who)h(authorizes)g(use)g(under)e (this)i(License)h(of)f(the)330 3061 y(Program)35 b(or)f(a)h(w)m(ork)g (on)f(whic)m(h)g(the)h(Program)f(is)h(based.)53 b(The)34 b(w)m(ork)g(th)m(us)g(licensed)h(is)g(called)330 3170 y(the)c(con)m(tributor's)f(\\con)m(tributor)i(v)m(ersion".)330 3302 y(A)g(con)m(tributor's)g(\\essen)m(tial)i(paten)m(t)e(claims")h (are)f(all)h(paten)m(t)f(claims)h(o)m(wned)e(or)h(con)m(trolled)h(b)m (y)330 3411 y(the)21 b(con)m(tributor,)j(whether)d(already)g(acquired)g (or)h(hereafter)f(acquired,)j(that)d(w)m(ould)g(b)s(e)g(infringed)330 3521 y(b)m(y)27 b(some)h(manner,)g(p)s(ermitted)f(b)m(y)g(this)h (License,)h(of)e(making,)i(using,)f(or)f(selling)i(its)f(con)m (tributor)330 3630 y(v)m(ersion,)40 b(but)c(do)i(not)f(include)g (claims)i(that)f(w)m(ould)f(b)s(e)f(infringed)h(only)g(as)h(a)g (consequence)g(of)330 3740 y(further)33 b(mo)s(di\014cation)h(of)g(the) g(con)m(tributor)g(v)m(ersion.)52 b(F)-8 b(or)34 b(purp)s(oses)e(of)i (this)g(de\014nition,)h(\\con-)330 3850 y(trol")40 b(includes)f(the)g (righ)m(t)h(to)f(gran)m(t)h(paten)m(t)g(sublicenses)f(in)g(a)g(manner)g (consisten)m(t)h(with)f(the)330 3959 y(requiremen)m(ts)30 b(of)h(this)f(License.)330 4091 y(Eac)m(h)44 b(con)m(tributor)h(gran)m (ts)f(y)m(ou)g(a)h(non-exclusiv)m(e,)j(w)m(orldwide,)f(ro)m(y)m(alt)m (y-free)g(paten)m(t)e(license)330 4200 y(under)26 b(the)h(con)m (tributor's)g(essen)m(tial)i(paten)m(t)f(claims,)h(to)f(mak)m(e,)h (use,)f(sell,)g(o\013er)g(for)f(sale,)i(imp)s(ort)330 4310 y(and)h(otherwise)h(run,)e(mo)s(dify)g(and)h(propagate)i(the)e (con)m(ten)m(ts)i(of)f(its)g(con)m(tributor)f(v)m(ersion.)330 4441 y(In)e(the)h(follo)m(wing)h(three)e(paragraphs,)h(a)g(\\paten)m(t) h(license")g(is)e(an)m(y)h(express)f(agreemen)m(t)j(or)d(com-)330 4551 y(mitmen)m(t,)g(ho)m(w)m(ev)m(er)g(denominated,)f(not)f(to)h (enforce)g(a)f(paten)m(t)i(\(suc)m(h)e(as)g(an)g(express)g(p)s (ermission)330 4661 y(to)32 b(practice)h(a)f(paten)m(t)h(or)e(co)m(v)m (enan)m(t)j(not)e(to)g(sue)f(for)h(paten)m(t)g(infringemen)m(t\).)45 b(T)-8 b(o)32 b(\\gran)m(t")h(suc)m(h)330 4770 y(a)i(paten)m(t)h (license)f(to)h(a)f(part)m(y)g(means)f(to)i(mak)m(e)f(suc)m(h)g(an)f (agreemen)m(t)j(or)d(commitmen)m(t)i(not)f(to)330 4880 y(enforce)c(a)g(paten)m(t)g(against)h(the)e(part)m(y)-8 b(.)330 5011 y(If)36 b(y)m(ou)h(con)m(v)m(ey)h(a)f(co)m(v)m(ered)h(w)m (ork,)h(kno)m(wingly)e(relying)g(on)f(a)h(paten)m(t)h(license,)h(and)d (the)h(Corre-)330 5121 y(sp)s(onding)21 b(Source)h(of)h(the)g(w)m(ork)g (is)f(not)h(a)m(v)-5 b(ailable)25 b(for)e(an)m(y)m(one)g(to)h(cop)m(y) -8 b(,)25 b(free)e(of)g(c)m(harge)g(and)f(under)330 5230 y(the)32 b(terms)f(of)h(this)f(License,)i(through)e(a)h(publicly)f(a)m (v)-5 b(ailable)34 b(net)m(w)m(ork)e(serv)m(er)g(or)g(other)g(readily) 330 5340 y(accessible)38 b(means,)g(then)e(y)m(ou)h(m)m(ust)f(either)h (\(1\))h(cause)e(the)h(Corresp)s(onding)e(Source)h(to)h(b)s(e)f(so)p eop end %%Page: 9 11 TeXDict begin 9 10 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2052 b(9)330 299 y(a)m(v)-5 b(ailable,)32 b(or)e(\(2\))g (arrange)g(to)h(depriv)m(e)e(y)m(ourself)h(of)g(the)g(b)s(ene\014t)e (of)i(the)g(paten)m(t)g(license)h(for)e(this)330 408 y(particular)35 b(w)m(ork,)g(or)f(\(3\))i(arrange,)g(in)d(a)i(manner)e (consisten)m(t)j(with)e(the)g(requiremen)m(ts)h(of)f(this)330 518 y(License,)j(to)f(extend)g(the)f(paten)m(t)h(license)h(to)f(do)m (wnstream)f(recipien)m(ts.)56 b(\\Kno)m(wingly)36 b(relying")330 628 y(means)31 b(y)m(ou)h(ha)m(v)m(e)g(actual)h(kno)m(wledge)f(that,)g (but)f(for)g(the)g(paten)m(t)i(license,)f(y)m(our)g(con)m(v)m(eying)h (the)330 737 y(co)m(v)m(ered)40 b(w)m(ork)e(in)g(a)g(coun)m(try)-8 b(,)41 b(or)e(y)m(our)f(recipien)m(t's)h(use)f(of)g(the)h(co)m(v)m (ered)g(w)m(ork)g(in)e(a)i(coun)m(try)-8 b(,)330 847 y(w)m(ould)35 b(infringe)g(one)g(or)g(more)g(iden)m(ti\014able)h(paten) m(ts)g(in)f(that)h(coun)m(try)f(that)h(y)m(ou)f(ha)m(v)m(e)i(reason)330 956 y(to)31 b(b)s(eliev)m(e)h(are)e(v)-5 b(alid.)330 1121 y(If,)31 b(pursuan)m(t)e(to)j(or)e(in)h(connection)h(with)e(a)h (single)h(transaction)g(or)f(arrangemen)m(t,)h(y)m(ou)f(con)m(v)m(ey)-8 b(,)330 1230 y(or)35 b(propagate)h(b)m(y)e(pro)s(curing)g(con)m(v)m(ey) m(ance)j(of,)g(a)e(co)m(v)m(ered)h(w)m(ork,)g(and)f(gran)m(t)g(a)g (paten)m(t)h(license)330 1340 y(to)c(some)f(of)h(the)f(parties)h (receiving)g(the)f(co)m(v)m(ered)i(w)m(ork)e(authorizing)h(them)f(to)h (use,)g(propagate,)330 1450 y(mo)s(dify)26 b(or)h(con)m(v)m(ey)h(a)g (sp)s(eci\014c)e(cop)m(y)i(of)f(the)g(co)m(v)m(ered)i(w)m(ork,)f(then)e (the)h(paten)m(t)h(license)g(y)m(ou)f(gran)m(t)330 1559 y(is)j(automatically)k(extended)c(to)h(all)g(recipien)m(ts)h(of)e(the)h (co)m(v)m(ered)h(w)m(ork)e(and)g(w)m(orks)g(based)g(on)h(it.)330 1724 y(A)d(paten)m(t)g(license)h(is)e(\\discriminatory")i(if)e(it)h(do) s(es)f(not)h(include)f(within)g(the)h(scop)s(e)f(of)h(its)g(co)m(v)m (er-)330 1833 y(age,)f(prohibits)c(the)h(exercise)h(of,)h(or)d(is)h (conditioned)h(on)f(the)g(non-exercise)h(of)f(one)g(or)g(more)g(of)g (the)330 1943 y(righ)m(ts)32 b(that)g(are)g(sp)s(eci\014cally)h(gran)m (ted)f(under)e(this)i(License.)45 b(Y)-8 b(ou)32 b(ma)m(y)g(not)g(con)m (v)m(ey)h(a)f(co)m(v)m(ered)330 2052 y(w)m(ork)d(if)g(y)m(ou)g(are)h(a) f(part)m(y)g(to)h(an)f(arrangemen)m(t)h(with)e(a)i(third)e(part)m(y)h (that)g(is)g(in)g(the)g(business)f(of)330 2162 y(distributing)i(soft)m (w)m(are,)i(under)d(whic)m(h)h(y)m(ou)h(mak)m(e)g(pa)m(ymen)m(t)g(to)g (the)g(third)f(part)m(y)g(based)g(on)h(the)330 2271 y(exten)m(t)f(of)g (y)m(our)f(activit)m(y)i(of)e(con)m(v)m(eying)i(the)e(w)m(ork,)h(and)e (under)g(whic)m(h)g(the)i(third)e(part)m(y)h(gran)m(ts,)330 2381 y(to)35 b(an)m(y)g(of)f(the)h(parties)f(who)g(w)m(ould)g(receiv)m (e)i(the)f(co)m(v)m(ered)h(w)m(ork)e(from)g(y)m(ou,)i(a)f (discriminatory)330 2491 y(paten)m(t)g(license)h(\(a\))f(in)f (connection)h(with)f(copies)h(of)g(the)f(co)m(v)m(ered)i(w)m(ork)f(con) m(v)m(ey)m(ed)h(b)m(y)e(y)m(ou)h(\(or)330 2600 y(copies)k(made)e(from)h (those)g(copies\),)j(or)d(\(b\))g(primarily)f(for)h(and)f(in)h (connection)h(with)e(sp)s(eci\014c)330 2710 y(pro)s(ducts)32 b(or)i(compilations)h(that)f(con)m(tain)h(the)f(co)m(v)m(ered)i(w)m (ork,)e(unless)f(y)m(ou)h(en)m(tered)h(in)m(to)f(that)330 2819 y(arrangemen)m(t,)e(or)e(that)h(paten)m(t)g(license)h(w)m(as)e (gran)m(ted,)i(prior)d(to)j(28)f(Marc)m(h)g(2007.)330 2984 y(Nothing)23 b(in)e(this)h(License)h(shall)f(b)s(e)f(construed)h (as)g(excluding)g(or)g(limiting)h(an)m(y)f(implied)g(license)h(or)330 3093 y(other)k(defenses)f(to)h(infringemen)m(t)g(that)g(ma)m(y)g (otherwise)g(b)s(e)e(a)m(v)-5 b(ailable)29 b(to)e(y)m(ou)g(under)e (applicable)330 3203 y(paten)m(t)31 b(la)m(w.)154 3367 y(12.)61 b(No)31 b(Surrender)d(of)i(Others')g(F)-8 b(reedom.)330 3532 y(If)24 b(conditions)g(are)h(imp)s(osed)f(on)g(y)m(ou)g(\(whether) g(b)m(y)g(court)h(order,)g(agreemen)m(t)h(or)e(otherwise\))h(that)330 3641 y(con)m(tradict)35 b(the)f(conditions)h(of)e(this)h(License,)h (they)f(do)g(not)g(excuse)g(y)m(ou)g(from)g(the)f(conditions)330 3751 y(of)k(this)f(License.)59 b(If)36 b(y)m(ou)h(cannot)g(con)m(v)m (ey)h(a)e(co)m(v)m(ered)i(w)m(ork)f(so)g(as)f(to)h(satisfy)g(sim)m (ultaneously)330 3861 y(y)m(our)44 b(obligations)i(under)c(this)i (License)h(and)e(an)m(y)i(other)f(p)s(ertinen)m(t)g(obligations,)49 b(then)44 b(as)h(a)330 3970 y(consequence)40 b(y)m(ou)f(ma)m(y)g(not)g (con)m(v)m(ey)i(it)e(at)h(all.)67 b(F)-8 b(or)40 b(example,)i(if)d(y)m (ou)g(agree)h(to)g(terms)e(that)330 4080 y(obligate)32 b(y)m(ou)e(to)h(collect)h(a)f(ro)m(y)m(alt)m(y)h(for)e(further)e(con)m (v)m(eying)k(from)e(those)g(to)h(whom)e(y)m(ou)h(con)m(v)m(ey)330 4189 y(the)h(Program,)h(the)f(only)g(w)m(a)m(y)h(y)m(ou)g(could)f (satisfy)g(b)s(oth)g(those)g(terms)g(and)g(this)g(License)g(w)m(ould) 330 4299 y(b)s(e)f(to)h(refrain)f(en)m(tirely)h(from)f(con)m(v)m(eying) i(the)f(Program.)154 4463 y(13.)61 b(Use)31 b(with)f(the)g(GNU)h (A\013ero)g(General)h(Public)e(License.)330 4628 y(Not)m(withstanding) 39 b(an)m(y)g(other)f(pro)m(vision)h(of)f(this)g(License,)k(y)m(ou)c (ha)m(v)m(e)i(p)s(ermission)d(to)i(link)f(or)330 4737 y(com)m(bine)h(an)m(y)g(co)m(v)m(ered)i(w)m(ork)e(with)f(a)h(w)m(ork)g (licensed)g(under)e(v)m(ersion)i(3)g(of)g(the)g(GNU)g(A\013ero)330 4847 y(General)29 b(Public)f(License)h(in)m(to)h(a)f(single)g(com)m (bined)f(w)m(ork,)h(and)f(to)h(con)m(v)m(ey)h(the)f(resulting)g(w)m (ork.)330 4956 y(The)f(terms)g(of)g(this)h(License)f(will)h(con)m(tin)m (ue)g(to)g(apply)f(to)h(the)g(part)f(whic)m(h)g(is)g(the)h(co)m(v)m (ered)h(w)m(ork,)330 5066 y(but)38 b(the)h(sp)s(ecial)g(requiremen)m (ts)f(of)h(the)g(GNU)g(A\013ero)g(General)g(Public)g(License,)i (section)f(13,)330 5176 y(concerning)31 b(in)m(teraction)h(through)e(a) h(net)m(w)m(ork)g(will)f(apply)g(to)i(the)e(com)m(bination)i(as)e(suc)m (h.)154 5340 y(14.)61 b(Revised)31 b(V)-8 b(ersions)30 b(of)h(this)f(License.)p eop end %%Page: 10 12 TeXDict begin 10 11 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2006 b(10)330 299 y(The)35 b(F)-8 b(ree)36 b(Soft)m(w)m(are)g (F)-8 b(oundation)36 b(ma)m(y)g(publish)d(revised)i(and/or)g(new)g(v)m (ersions)h(of)f(the)g(GNU)330 408 y(General)f(Public)f(License)g(from)g (time)g(to)h(time.)49 b(Suc)m(h)33 b(new)f(v)m(ersions)h(will)h(b)s(e)e (similar)h(in)g(spirit)330 518 y(to)e(the)g(presen)m(t)f(v)m(ersion,)h (but)f(ma)m(y)h(di\013er)f(in)g(detail)i(to)f(address)e(new)h(problems) g(or)g(concerns.)330 662 y(Eac)m(h)37 b(v)m(ersion)g(is)f(giv)m(en)h(a) g(distinguishing)e(v)m(ersion)i(n)m(um)m(b)s(er.)57 b(If)36 b(the)g(Program)g(sp)s(eci\014es)g(that)330 772 y(a)31 b(certain)h(n)m(um)m(b)s(ered)d(v)m(ersion)i(of)g(the)g(GNU)g(General)h (Public)e(License)h(\\or)g(an)m(y)g(later)h(v)m(ersion")330 881 y(applies)h(to)g(it,)h(y)m(ou)e(ha)m(v)m(e)i(the)f(option)g(of)f (follo)m(wing)i(the)f(terms)f(and)g(conditions)h(either)g(of)f(that)330 991 y(n)m(um)m(b)s(ered)h(v)m(ersion)h(or)g(of)g(an)m(y)g(later)h(v)m (ersion)g(published)d(b)m(y)i(the)g(F)-8 b(ree)35 b(Soft)m(w)m(are)g(F) -8 b(oundation.)330 1101 y(If)28 b(the)h(Program)g(do)s(es)g(not)g(sp)s (ecify)f(a)h(v)m(ersion)g(n)m(um)m(b)s(er)f(of)h(the)g(GNU)g(General)h (Public)e(License,)330 1210 y(y)m(ou)j(ma)m(y)g(c)m(ho)s(ose)g(an)m(y)g (v)m(ersion)g(ev)m(er)g(published)d(b)m(y)j(the)f(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation.)330 1354 y(If)39 b(the)h(Program)g(sp)s(eci\014es)f(that)h(a)g(pro)m(xy)g(can)g (decide)g(whic)m(h)f(future)g(v)m(ersions)h(of)f(the)h(GNU)330 1464 y(General)34 b(Public)e(License)i(can)f(b)s(e)f(used,)h(that)h (pro)m(xy's)e(public)h(statemen)m(t)h(of)f(acceptance)j(of)d(a)330 1573 y(v)m(ersion)e(p)s(ermanen)m(tly)f(authorizes)h(y)m(ou)g(to)g(c)m (ho)s(ose)g(that)g(v)m(ersion)g(for)f(the)h(Program.)330 1718 y(Later)37 b(license)g(v)m(ersions)f(ma)m(y)h(giv)m(e)g(y)m(ou)g (additional)g(or)f(di\013eren)m(t)h(p)s(ermissions.)56 b(Ho)m(w)m(ev)m(er,)40 b(no)330 1827 y(additional)25 b(obligations)i(are)e(imp)s(osed)f(on)g(an)m(y)h(author)f(or)h(cop)m (yrigh)m(t)h(holder)e(as)h(a)g(result)f(of)h(y)m(our)330 1937 y(c)m(ho)s(osing)31 b(to)g(follo)m(w)h(a)f(later)g(v)m(ersion.)154 2081 y(15.)61 b(Disclaimer)32 b(of)f(W)-8 b(arran)m(t)m(y)g(.)330 2225 y(THERE)47 b(IS)f(NO)h(W)-10 b(ARRANTY)48 b(F)m(OR)f(THE)g(PR)m (OGRAM,)h(TO)f(THE)g(EXTENT)f(PER-)330 2335 y(MITTED)g(BY)i(APPLICABLE) e(LA)-10 b(W.)47 b(EX)m(CEPT)f(WHEN)i(OTHER)-10 b(WISE)45 b(ST)-8 b(A)g(TED)47 b(IN)330 2444 y(WRITING)34 b(THE)f(COPYRIGHT)g (HOLDERS)g(AND/OR)i(OTHER)e(P)-8 b(AR)g(TIES)33 b(PR)m(O)m(VIDE)330 2554 y(THE)d(PR)m(OGRAM)i(\\AS)e(IS")h(WITHOUT)f(W)-10 b(ARRANTY)31 b(OF)g(ANY)g(KIND,)g(EITHER)f(EX-)330 2663 y(PRESSED)k(OR)h(IMPLIED,)g(INCLUDING,)g(BUT)h(NOT)e(LIMITED)h(TO,)f (THE)h(IMPLIED)330 2773 y(W)-10 b(ARRANTIES)38 b(OF)g(MER)m(CHANT)-8 b(ABILITY)39 b(AND)g(FITNESS)e(F)m(OR)i(A)f(P)-8 b(AR)g(TICULAR)330 2883 y(PURPOSE.)39 b(THE)h(ENTIRE)f(RISK)g(AS)h(TO)f(THE)g(QUALITY)h (AND)h(PERF)m(ORMANCE)330 2992 y(OF)29 b(THE)g(PR)m(OGRAM)h(IS)f(WITH)g (YOU.)h(SHOULD)f(THE)g(PR)m(OGRAM)h(PR)m(O)m(VE)g(DEFEC-)330 3102 y(TIVE,)24 b(YOU)g(ASSUME)f(THE)h(COST)f(OF)h(ALL)g(NECESSAR)-8 b(Y)23 b(SER)-10 b(VICING,)23 b(REP)-8 b(AIR)24 b(OR)330 3211 y(CORRECTION.)154 3356 y(16.)61 b(Limitation)32 b(of)e(Liabilit)m(y)-8 b(.)330 3500 y(IN)26 b(NO)g(EVENT)g(UNLESS)f (REQUIRED)h(BY)h(APPLICABLE)f(LA)-10 b(W)26 b(OR)g(A)m(GREED)h(TO)f(IN) 330 3609 y(WRITING)37 b(WILL)f(ANY)i(COPYRIGHT)e(HOLDER,)h(OR)f(ANY)h (OTHER)f(P)-8 b(AR)g(TY)38 b(WHO)330 3719 y(MODIFIES)33 b(AND/OR)h(CONVEYS)e(THE)h(PR)m(OGRAM)h(AS)e(PERMITTED)h(ABO)m(VE,)h (BE)330 3829 y(LIABLE)d(TO)e(YOU)i(F)m(OR)g(D)m(AMA)m(GES,)i(INCLUDING) e(ANY)g(GENERAL,)g(SPECIAL,)f(IN-)330 3938 y(CIDENT)-8 b(AL)32 b(OR)f(CONSEQUENTIAL)f(D)m(AMA)m(GES)j(ARISING)f(OUT)f(OF)h (THE)f(USE)g(OR)330 4048 y(INABILITY)47 b(TO)f(USE)g(THE)g(PR)m(OGRAM)i (\(INCLUDING)f(BUT)g(NOT)f(LIMITED)h(TO)330 4157 y(LOSS)28 b(OF)h(D)m(A)-8 b(T)g(A)31 b(OR)e(D)m(A)-8 b(T)g(A)31 b(BEING)f(RENDERED)f(INA)m(CCURA)-8 b(TE)30 b(OR)e(LOSSES)g(SUS-)330 4267 y(T)-8 b(AINED)43 b(BY)g(YOU)f(OR)g(THIRD)h(P)-8 b(AR)g(TIES)42 b(OR)g(A)g(F)-10 b(AILURE)43 b(OF)f(THE)g(PR)m(OGRAM)330 4376 y(TO)30 b(OPERA)-8 b(TE)29 b(WITH)i(ANY)f(OTHER)g(PR)m(OGRAMS\),)h (EVEN)f(IF)h(SUCH)e(HOLDER)h(OR)330 4486 y(OTHER)36 b(P)-8 b(AR)g(TY)37 b(HAS)g(BEEN)f(AD)m(VISED)i(OF)f(THE)f(POSSIBILITY)f(OF)h (SUCH)g(D)m(AM-)330 4596 y(A)m(GES.)154 4740 y(17.)61 b(In)m(terpretation)31 b(of)g(Sections)g(15)g(and)f(16.)330 4884 y(If)d(the)h(disclaimer)g(of)f(w)m(arran)m(t)m(y)i(and)d (limitation)k(of)d(liabilit)m(y)j(pro)m(vided)d(ab)s(o)m(v)m(e)h (cannot)g(b)s(e)f(giv)m(en)330 4994 y(lo)s(cal)35 b(legal)h(e\013ect)g (according)f(to)f(their)h(terms,)g(reviewing)f(courts)g(shall)h(apply)e (lo)s(cal)j(la)m(w)e(that)330 5103 y(most)j(closely)i(appro)m(ximates)f (an)f(absolute)g(w)m(aiv)m(er)i(of)e(all)g(civil)i(liabilit)m(y)f(in)f (connection)h(with)330 5213 y(the)d(Program,)i(unless)d(a)h(w)m(arran)m (t)m(y)h(or)f(assumption)g(of)g(liabilit)m(y)i(accompanies)f(a)g(cop)m (y)g(of)f(the)330 5322 y(Program)c(in)f(return)f(for)h(a)h(fee.)p eop end %%Page: 11 13 TeXDict begin 11 12 bop 150 -116 a Fv(GNU)31 b(GENERAL)f(PUBLIC)h (LICENSE)2006 b(11)150 299 y Fu(END)45 b(OF)g(TERMS)f(AND)h(CONDITIONS) 150 565 y(Ho)l(w)h(to)f(Apply)f(These)h(T)-11 b(erms)45 b(to)g(Y)-11 b(our)44 b(New)i(Programs)275 724 y Fv(If)38 b(y)m(ou)i(dev)m(elop)g(a)f(new)g(program,)j(and)c(y)m(ou)i(w)m(an)m(t) g(it)f(to)h(b)s(e)f(of)g(the)h(greatest)h(p)s(ossible)d(use)h(to)150 834 y(the)i(public,)i(the)f(b)s(est)e(w)m(a)m(y)i(to)g(ac)m(hiev)m(e)h (this)e(is)g(to)h(mak)m(e)g(it)g(free)f(soft)m(w)m(are)h(whic)m(h)f(ev) m(ery)m(one)i(can)150 943 y(redistribute)30 b(and)g(c)m(hange)h(under)e (these)i(terms.)275 1078 y(T)-8 b(o)29 b(do)h(so,)g(attac)m(h)h(the)f (follo)m(wing)h(notices)f(to)h(the)e(program.)40 b(It)30 b(is)g(safest)g(to)g(attac)m(h)h(them)f(to)g(the)150 1187 y(start)38 b(of)g(eac)m(h)g(source)g(\014le)f(to)h(most)g (e\013ectiv)m(ely)i(state)f(the)f(exclusion)g(of)f(w)m(arran)m(t)m(y;) 42 b(and)37 b(eac)m(h)i(\014le)150 1297 y(should)29 b(ha)m(v)m(e)j(at)f (least)h(the)e(\\cop)m(yrigh)m(t")j(line)e(and)e(a)i(p)s(oin)m(ter)g (to)g(where)f(the)g(full)g(notice)i(is)e(found.)390 1409 y Fq(one)40 b(line)g(to)g(give)g(the)g(program\015s)h(name)f(and)g(a)g (brief)g(idea)g(of)g(what)g(it)g(does.)390 1496 y Fp(Copyright)h(\(C\)) f Fq(year)g(name)g(of)g(author)390 1670 y Fp(This)g(program)h(is)f (free)g(software:)h(you)f(can)g(redistribute)i(it)e(and/or)g(modify)390 1758 y(it)g(under)g(the)g(terms)g(of)g(the)g(GNU)g(General)h(Public)f (License)h(as)f(published)h(by)390 1845 y(the)f(Free)g(Software)h (Foundation,)h(either)e(version)h(3)f(of)f(the)h(License,)h(or)f(\(at) 390 1932 y(your)g(option\))h(any)f(later)g(version.)390 2106 y(This)g(program)h(is)f(distributed)h(in)f(the)g(hope)g(that)g(it) g(will)g(be)g(useful,)h(but)390 2193 y(WITHOUT)g(ANY)f(WARRANTY;)h (without)g(even)f(the)g(implied)h(warranty)g(of)390 2281 y(MERCHANTABILITY)i(or)c(FITNESS)i(FOR)f(A)g(PARTICULAR)h(PURPOSE.)80 b(See)40 b(the)g(GNU)390 2368 y(General)h(Public)f(License)h(for)f (more)g(details.)390 2542 y(You)g(should)g(have)h(received)g(a)e(copy)h (of)g(the)g(GNU)g(General)h(Public)f(License)390 2629 y(along)g(with)g(this)h(program.)80 b(If)40 b(not,)g(see)g (http://www.gnu.org/licenses/.)275 2764 y Fv(Also)31 b(add)e(information)i(on)f(ho)m(w)h(to)g(con)m(tact)i(y)m(ou)d(b)m(y)g (electronic)j(and)d(pap)s(er)f(mail.)275 2898 y(If)e(the)i(program)f (do)s(es)f(terminal)i(in)m(teraction,)i(mak)m(e)e(it)g(output)f(a)g (short)g(notice)i(lik)m(e)f(this)f(when)f(it)150 3008 y(starts)k(in)f(an)g(in)m(teractiv)m(e)j(mo)s(de:)390 3120 y Fq(program)41 b Fp(Copyright)g(\(C\))f Fq(year)g(name)g(of)g (author)390 3207 y Fp(This)g(program)h(comes)f(with)g(ABSOLUTELY)i(NO)e (WARRANTY;)h(for)f(details)h(type)f(`show)g(w'.)390 3294 y(This)g(is)g(free)g(software,)h(and)f(you)g(are)g(welcome)h(to)e (redistribute)j(it)390 3381 y(under)e(certain)h(conditions;)h(type)e (`show)g(c')g(for)g(details.)275 3516 y Fv(The)27 b(h)m(yp)s(othetical) i(commands)f(`)p Fr(show)h(w)p Fv(')f(and)f(`)p Fr(show)j(c)p Fv(')d(should)g(sho)m(w)h(the)g(appropriate)g(parts)g(of)150 3626 y(the)i(General)h(Public)f(License.)41 b(Of)30 b(course,)h(y)m (our)f(program's)g(commands)f(migh)m(t)i(b)s(e)f(di\013eren)m(t;)h(for) f(a)150 3735 y(GUI)h(in)m(terface,)h(y)m(ou)f(w)m(ould)f(use)g(an)g (\\ab)s(out)h(b)s(o)m(x".)275 3870 y(Y)-8 b(ou)34 b(should)f(also)i (get)g(y)m(our)e(emplo)m(y)m(er)i(\(if)g(y)m(ou)f(w)m(ork)g(as)g(a)g (programmer\))g(or)g(sc)m(ho)s(ol,)i(if)d(an)m(y)-8 b(,)36 b(to)150 3979 y(sign)d(a)g(\\cop)m(yrigh)m(t)h(disclaimer")g(for)e(the) h(program,)g(if)f(necessary)-8 b(.)48 b(F)-8 b(or)34 b(more)e(information)h(on)g(this,)150 4089 y(and)d(ho)m(w)g(to)h(apply) f(and)g(follo)m(w)i(the)e(GNU)h(GPL,)g(see)g Fr (http://www.gnu.org/licen)o(ses)o(/)p Fv(.)275 4223 y(The)26 b(GNU)i(General)h(Public)e(License)h(do)s(es)f(not)g(p)s(ermit)g (incorp)s(orating)g(y)m(our)h(program)f(in)m(to)h(pro-)150 4333 y(prietary)f(programs.)39 b(If)26 b(y)m(our)h(program)g(is)g(a)g (subroutine)e(library)-8 b(,)28 b(y)m(ou)f(ma)m(y)h(consider)e(it)i (more)f(useful)150 4443 y(to)32 b(p)s(ermit)e(linking)h(proprietary)f (applications)i(with)f(the)g(library)-8 b(.)42 b(If)31 b(this)g(is)f(what)h(y)m(ou)g(w)m(an)m(t)h(to)g(do,)150 4552 y(use)h(the)g(GNU)h(Lesser)f(General)h(Public)f(License)h(instead) g(of)f(this)g(License.)50 b(But)34 b(\014rst,)f(please)h(read)150 4662 y Fr(http://www.gnu.org/philo)o(soph)o(y/wh)o(y-n)o(ot-l)o(gpl.)o (htm)o(l)p Fv(.)p eop end %%Page: 12 14 TeXDict begin 12 13 bop 3659 -116 a Fv(12)150 299 y Fs(Con)l(tributors) 50 b(to)j(GNU)h Fo(gperf)f Fs(Utilit)l(y)225 533 y Ft(\017)60 b Fv(The)45 b(GNU)h Fr(gperf)d Fv(p)s(erfect)j(hash)e(function)h (generator)i(utilit)m(y)f(w)m(as)g(written)f(in)g(GNU)h(C)p Fr(++)330 643 y Fv(b)m(y)e(Douglas)i(C.)f(Sc)m(hmidt.)83 b(The)44 b(general)i(idea)f(for)f(the)h(p)s(erfect)g(hash)e(function)i (generator)330 752 y(w)m(as)34 b(inspired)e(b)m(y)h(Keith)g(Bostic's)j (algorithm)e(written)f(in)g(C,)g(and)g(distributed)f(to)i(net.sources) 330 862 y(around)42 b(1984.)79 b(The)42 b(curren)m(t)g(program)h(is)g (a)g(hea)m(vily)h(mo)s(di\014ed,)g(enhanced,)i(and)c(extended)330 971 y(implemen)m(tation)d(of)e(Keith's)g(basic)h(idea,)h(created)f(at)g (the)f(Univ)m(ersit)m(y)h(of)g(California,)h(Irvine.)330 1081 y(Bugs,)31 b(patc)m(hes,)g(and)f(suggestions)h(should)f(b)s(e)f (rep)s(orted)h(to)h Fr()p Fv(.)225 1215 y Ft(\017)60 b Fv(Sp)s(ecial)33 b(thanks)g(is)g(extended)g(to)h (Mic)m(hael)h(Tiemann)e(and)g(Doug)h(Lea,)g(for)f(pro)m(viding)g(a)h (useful)330 1325 y(compiler,)d(and)f(for)g(giving)h(me)g(a)g(forum)e (to)i(exhibit)g(m)m(y)f(creation.)330 1460 y(In)22 b(addition,)i(Adam)f (de)f(Bo)s(or)h(and)f(Nels)i(Olson)e(pro)m(vided)g(man)m(y)h(tips)f (and)g(insigh)m(ts)h(that)g(greatly)330 1569 y(help)s(ed)29 b(impro)m(v)m(e)j(the)e(qualit)m(y)i(and)e(functionalit)m(y)h(of)g Fr(gperf)p Fv(.)225 1704 y Ft(\017)60 b Fv(Bruno)26 b(Haible)i (enhanced)f(and)f(optimized)i(the)f(searc)m(h)h(algorithm.)41 b(He)27 b(also)h(rewrote)g(the)f(input)330 1813 y(routines)j(and)g(the) h(output)f(routines)g(for)g(b)s(etter)g(reliabilit)m(y)-8 b(,)33 b(and)d(added)g(a)h(testsuite.)p eop end %%Page: 13 15 TeXDict begin 13 14 bop 3659 -116 a Fv(13)150 299 y Fs(1)80 b(In)l(tro)t(duction)275 533 y Fr(gperf)31 b Fv(is)j(a)f(p)s(erfect)h (hash)e(function)h(generator)i(written)e(in)g(C)p Fr(++)p Fv(.)49 b(It)33 b(transforms)g(an)g Fn(n)f Fv(elemen)m(t)150 643 y(user-sp)s(eci\014ed)j(k)m(eyw)m(ord)h(set)g Fn(W)48 b Fv(in)m(to)37 b(a)f(p)s(erfect)f(hash)g(function)h Fn(F)p Fv(.)57 b Fn(F)42 b Fv(uniquely)35 b(maps)h(k)m(eyw)m(ords)150 752 y(in)f Fn(W)47 b Fv(on)m(to)36 b(the)f(range)g(0..)p Fn(k)p Fv(,)j(where)c Fn(k)40 b Fr(>)p Fv(=)35 b Fn(n-1)p Fv(.)54 b(If)35 b Fn(k)40 b Fv(=)35 b Fn(n-1)42 b Fv(then)35 b Fn(F)42 b Fv(is)35 b(a)g Fm(minimal)46 b Fv(p)s(erfect)35 b(hash)150 862 y(function.)68 b Fr(gperf)39 b Fv(generates)i(a)f(0..)p Fn(k)46 b Fv(elemen)m(t)41 b(static)g(lo)s(okup)f(table)g(and)f(a)i (pair)e(of)h(C)f(functions.)150 971 y(These)34 b(functions)g(determine) g(whether)g(a)h(giv)m(en)g(c)m(haracter)h(string)e Fn(s)k Fv(o)s(ccurs)c(in)g Fn(W)p Fv(,)i(using)e(at)h(most)150 1081 y(one)c(prob)s(e)e(in)m(to)i(the)g(lo)s(okup)f(table.)275 1215 y Fr(gperf)22 b Fv(curren)m(tly)h(generates)j(the)d(reserv)m(ed)h (k)m(eyw)m(ord)g(recognizer)i(for)d(lexical)j(analyzers)e(in)g(sev)m (eral)150 1325 y(pro)s(duction)30 b(and)g(researc)m(h)h(compilers)g (and)g(language)h(pro)s(cessing)e(to)s(ols,)i(including)e(GNU)i(C,)e (GNU)150 1435 y(C)p Fr(++)p Fv(,)24 b(GNU)f(Ja)m(v)-5 b(a,)26 b(GNU)d(P)m(ascal,)j(GNU)e(Mo)s(dula)f(3,)i(and)d(GNU)h(inden)m (t.)38 b(Complete)24 b(C)p Fr(++)e Fv(source)h(co)s(de)150 1544 y(for)37 b Fr(gperf)f Fv(is)h(a)m(v)-5 b(ailable)40 b(from)d Fr(https://ftp.gnu.org/pub/g)o(nu/)o(gper)o(f/)p Fv(.)55 b(A)38 b(pap)s(er)e(describing)150 1654 y Fr(gperf)p Fv('s)23 b(design)h(and)g(implemen)m(tation)i(in)e(greater)i(detail)f (is)g(a)m(v)-5 b(ailable)26 b(in)e(the)h(Second)f(USENIX)g(C)p Fr(++)150 1763 y Fv(Conference)30 b(pro)s(ceedings)h(or)f(from)g Fr(http://www.cs.wustl.edu/)o(~sc)o(hmid)o(t/re)o(sum)o(e.ht)o(ml)p Fv(.)p eop end %%Page: 14 16 TeXDict begin 14 15 bop 3659 -116 a Fv(14)150 299 y Fs(2)80 b(Static)53 b(searc)l(h)g(structures)e(and)j(GNU)f Fo(gperf)275 533 y Fv(A)24 b Fn(static)i(searc)m(h)f(structure)k Fv(is)c(an)f (Abstract)h(Data)i(T)m(yp)s(e)c(with)i(certain)g(fundamen)m(tal)f(op)s (erations,)150 643 y(e.g.,)32 b Fm(initialize)p Fv(,)g Fm(insert)p Fv(,)f(and)f Fm(r)-5 b(etrieve)p Fv(.)42 b(Conceptually)-8 b(,)32 b(all)g(insertions)f(o)s(ccur)f(b)s(efore)h (an)m(y)g(retriev)-5 b(als.)150 752 y(In)20 b(practice,)25 b Fr(gperf)19 b Fv(generates)k(a)e Fm(static)27 b Fv(arra)m(y)22 b(con)m(taining)g(searc)m(h)g(set)f(k)m(eyw)m(ords)h(and)e(an)m(y)h (asso)s(ciated)150 862 y(attributes)37 b(sp)s(eci\014ed)f(b)m(y)h(the)f (user.)59 b(Th)m(us,)37 b(there)g(is)g(essen)m(tially)h(no)f (execution-time)i(cost)e(for)g(the)150 971 y(insertions.)j(It)27 b(is)g(a)g(useful)g(data)g(structure)g(for)g(represen)m(ting)g Fm(static)j(se)-5 b(ar)g(ch)32 b(sets)p Fv(.)40 b(Static)28 b(searc)m(h)g(sets)150 1081 y(o)s(ccur)c(frequen)m(tly)h(in)f(soft)m(w) m(are)i(system)e(applications.)40 b(T)m(ypical)25 b(static)h(searc)m(h) f(sets)g(include)f(compiler)150 1191 y(reserv)m(ed)42 b(w)m(ords,)j(assem)m(bler)e(instruction)f(op)s(co)s(des,)j(and)c (built-in)h(shell)h(in)m(terpreter)f(commands.)150 1300 y(Searc)m(h)g(set)g(mem)m(b)s(ers,)h(called)g Fn(k)m(eyw)m(ords)p Fv(,)i(are)c(inserted)h(in)m(to)g(the)g(structure)f(only)g(once,)k (usually)150 1410 y(during)29 b(program)h(initialization,)k(and)c(are)g (not)h(generally)h(mo)s(di\014ed)d(at)i(run-time.)275 1544 y(Numerous)c(static)i(searc)m(h)g(structure)e(implemen)m(tations)i (exist,)h(e.g.,)f(arra)m(ys,)g(link)m(ed)g(lists,)g(binary)150 1654 y(searc)m(h)45 b(trees,)j(digital)d(searc)m(h)g(tries,)j(and)43 b(hash)g(tables.)83 b(Di\013eren)m(t)45 b(approac)m(hes)g(o\013er)f (trade-o\013s)150 1763 y(b)s(et)m(w)m(een)e(space)h(utilization)g(and)f (searc)m(h)g(time)g(e\016ciency)-8 b(.)77 b(F)-8 b(or)42 b(example,)k(an)41 b Fn(n)h Fv(elemen)m(t)h(sorted)150 1873 y(arra)m(y)d(is)g(space)h(e\016cien)m(t,)i(though)d(the)g(a)m(v)m (erage-case)k(time)c(complexit)m(y)i(for)e(retriev)-5 b(al)41 b(op)s(erations)150 1983 y(using)31 b(binary)f(searc)m(h)i(is)f (prop)s(ortional)g(to)g(log)i Fn(n)p Fv(.)42 b(Con)m(v)m(ersely)-8 b(,)33 b(hash)d(table)i(implemen)m(tations)h(often)150 2092 y(lo)s(cate)27 b(a)f(table)g(en)m(try)g(in)f(constan)m(t)i(time,)g (but)e(t)m(ypically)i(imp)s(ose)e(additional)i(memory)e(o)m(v)m(erhead) i(and)150 2202 y(exhibit)k(p)s(o)s(or)e(w)m(orst)i(case)g(p)s (erformance.)275 2336 y Fm(Minimal)26 b(p)-5 b(erfe)g(ct)28 b(hash)f(functions)32 b Fv(pro)m(vide)24 b(an)f(optimal)i(solution)f (for)f(a)h(particular)g(class)h(of)e(static)150 2446 y(searc)m(h)31 b(sets.)41 b(A)31 b(minimal)f(p)s(erfect)g(hash)g (function)g(is)h(de\014ned)e(b)m(y)h(t)m(w)m(o)i(prop)s(erties:)225 2580 y Ft(\017)60 b Fv(It)34 b(allo)m(ws)i(k)m(eyw)m(ord)f(recognition) h(in)e(a)h(static)h(searc)m(h)f(set)g(using)f(at)h(most)g Fm(one)41 b Fv(prob)s(e)33 b(in)m(to)j(the)330 2690 y(hash)30 b(table.)41 b(This)30 b(represen)m(ts)g(the)h(\\p)s(erfect")g(prop)s (ert)m(y)-8 b(.)225 2824 y Ft(\017)60 b Fv(The)35 b(actual)j(memory)e (allo)s(cated)i(to)e(store)h(the)f(k)m(eyw)m(ords)h(is)f(precisely)g (large)h(enough)f(for)g(the)330 2934 y(k)m(eyw)m(ord)31 b(set,)g(and)f Fm(no)j(lar)-5 b(ger)p Fv(.)42 b(This)29 b(is)i(the)f(\\minimal")i(prop)s(ert)m(y)-8 b(.)275 3093 y(F)g(or)38 b(most)g(applications)h(it)f(is)g(far)f(easier)i(to)f (generate)h Fm(p)-5 b(erfe)g(ct)47 b Fv(hash)37 b(functions)g(than)h Fm(minimal)150 3203 y(p)-5 b(erfe)g(ct)47 b Fv(hash)36 b(functions.)60 b(Moreo)m(v)m(er,)41 b(non-minimal)c(p)s(erfect)g(hash) f(functions)g(frequen)m(tly)i(execute)150 3313 y(faster)44 b(than)g(minimal)g(ones)g(in)f(practice.)83 b(This)43 b(phenomena)g(o)s(ccurs)g(since)h(searc)m(hing)h(a)f(sparse)150 3422 y(k)m(eyw)m(ord)34 b(table)g(increases)g(the)g(probabilit)m(y)f (of)h(lo)s(cating)h(a)e(\\n)m(ull")i(en)m(try)-8 b(,)35 b(thereb)m(y)e(reducing)g(string)150 3532 y(comparisons.)56 b Fr(gperf)p Fv('s)34 b(default)h(b)s(eha)m(vior)g(generates)i Fm(ne)-5 b(ar-minimal)47 b Fv(p)s(erfect)35 b(hash)f(functions)h(for) 150 3641 y(k)m(eyw)m(ord)40 b(sets.)68 b(Ho)m(w)m(ev)m(er,)44 b Fr(gperf)39 b Fv(pro)m(vides)g(man)m(y)h(options)f(that)h(p)s(ermit)f (user)g(con)m(trol)i(o)m(v)m(er)g(the)150 3751 y(degree)31 b(of)g(minimalit)m(y)g(and)f(p)s(erfection.)275 3885 y(Static)37 b(searc)m(h)f(sets)g(often)g(exhibit)g(relativ)m(e)i (stabilit)m(y)f(o)m(v)m(er)g(time.)58 b(F)-8 b(or)36 b(example,)i(Ada's)e(63)h(re-)150 3995 y(serv)m(ed)31 b(w)m(ords)f(ha)m(v)m(e)i(remained)e(constan)m(t)i(for)f(nearly)g(a)g (decade.)42 b(It)31 b(is)g(therefore)g(frequen)m(tly)g(w)m(orth-)150 4105 y(while)22 b(to)h(exp)s(end)e(concerted)i(e\013ort)g(building)e (an)h(optimal)i(searc)m(h)e(structure)g Fm(onc)-5 b(e)p Fv(,)25 b(if)d(it)g(subsequen)m(tly)150 4214 y(receiv)m(es)j(hea)m(vy)f (use)e(m)m(ultiple)i(times.)39 b Fr(gperf)22 b Fv(remo)m(v)m(es)i(the)f (drudgery)f(asso)s(ciated)j(with)d(constructing)150 4324 y(time-)38 b(and)f(space-e\016cien)m(t)j(searc)m(h)d(structures)g(b)m (y)g(hand.)61 b(It)37 b(has)g(pro)m(v)m(en)h(a)f(useful)g(and)f (practical)150 4433 y(to)s(ol)29 b(for)f(serious)g(programming)g(pro)5 b(jects.)40 b(Output)27 b(from)h Fr(gperf)e Fv(is)i(curren)m(tly)h (used)e(in)h(sev)m(eral)h(pro-)150 4543 y(duction)d(and)e(researc)m(h)j (compilers,)g(including)e(GNU)h(C,)g(GNU)g(C)p Fr(++)p Fv(,)g(GNU)g(Ja)m(v)-5 b(a,)28 b(GNU)e(P)m(ascal,)j(and)150 4653 y(GNU)38 b(Mo)s(dula)f(3.)63 b(The)36 b(latter)j(t)m(w)m(o)g (compilers)f(are)f(not)h(y)m(et)h(part)e(of)g(the)h(o\016cial)h(GNU)f (distribu-)150 4762 y(tion.)51 b(Eac)m(h)34 b(compiler)g(utilizes)h Fr(gperf)d Fv(to)i(automatically)i(generate)f(static)g(searc)m(h)f (structures)f(that)150 4872 y(e\016cien)m(tly)f(iden)m(tify)f(their)f (resp)s(ectiv)m(e)i(reserv)m(ed)e(k)m(eyw)m(ords.)p eop end %%Page: 15 17 TeXDict begin 15 16 bop 3659 -116 a Fv(15)150 299 y Fs(3)80 b(High-Lev)l(el)52 b(Description)f(of)j(GNU)g Fo(gperf)275 553 y Fv(The)29 b(p)s(erfect)h(hash)g(function)g(generator)h Fr(gperf)e Fv(reads)h(a)h(set)g(of)f(\\k)m(eyw)m(ords")i(from)d(an)i (input)e(\014le)150 662 y(\(or)34 b(from)g(the)g(standard)f(input)g(b)m (y)h(default\).)52 b(It)34 b(attempts)h(to)f(deriv)m(e)h(a)f(p)s (erfect)g(hashing)f(function)150 772 y(that)k(recognizes)i(a)e(mem)m(b) s(er)f(of)h(the)g Fn(static)h(k)m(eyw)m(ord)f(set)j Fv(with)c(at)i (most)f(a)g(single)g(prob)s(e)f(in)m(to)i(the)150 881 y(lo)s(okup)26 b(table.)41 b(If)26 b Fr(gperf)f Fv(succeeds)i(in)g (generating)h(suc)m(h)e(a)h(function)f(it)i(pro)s(duces)d(a)i(pair)g (of)f(C)h(source)150 991 y(co)s(de)39 b(routines)g(that)h(p)s(erform)d (hashing)i(and)f(table)i(lo)s(okup)e(recognition.)69 b(All)39 b(generated)h(C)f(co)s(de)150 1101 y(is)f(directed)g(to)g(the) g(standard)f(output.)62 b(Command-line)38 b(options)g(describ)s(ed)e(b) s(elo)m(w)i(allo)m(w)h(y)m(ou)f(to)150 1210 y(mo)s(dify)30 b(the)g(input)g(and)f(output)h(format)h(to)g Fr(gperf)p Fv(.)275 1351 y(By)23 b(default,)i Fr(gperf)d Fv(attempts)i(to)g(pro)s (duce)e(time-e\016cien)m(t)k(co)s(de,)f(with)e(less)h(emphasis)e(on)h (e\016cien)m(t)150 1461 y(space)31 b(utilization.)43 b(Ho)m(w)m(ev)m(er,)33 b(sev)m(eral)e(options)g(exist)g(that)g(p)s (ermit)f(trading-o\013)h(execution)h(time)f(for)150 1570 y(storage)i(space)f(and)g(vice)g(v)m(ersa.)46 b(In)31 b(particular,)h(expanding)f(the)h(generated)h(table)g(size)f(pro)s (duces)f(a)150 1680 y(sparse)26 b(searc)m(h)g(structure,)h(generally)g (yielding)f(faster)h(searc)m(hes.)40 b(Con)m(v)m(ersely)-8 b(,)28 b(y)m(ou)f(can)f(direct)g Fr(gperf)150 1790 y Fv(to)21 b(utilize)h(a)f(C)f Fr(switch)f Fv(statemen)m(t)k(sc)m(heme)e (that)g(minimizes)g(data)g(space)g(storage)h(size.)39 b(F)-8 b(urthermore,)150 1899 y(using)40 b(a)g(C)g Fr(switch)e Fv(ma)m(y)i(actually)i(sp)s(eed)d(up)g(the)h(k)m(eyw)m(ord)h(retriev)-5 b(al)41 b(time)g(somewhat.)70 b(Actual)150 2009 y(results)30 b(dep)s(end)f(on)h(y)m(our)g(C)g(compiler,)i(of)e(course.)275 2150 y(In)44 b(general,)50 b Fr(gperf)44 b Fv(assigns)h(v)-5 b(alues)46 b(to)g(the)f(b)m(ytes)h(it)g(is)f(using)g(for)g(hashing)f (un)m(til)i(some)f(set)150 2259 y(of)d(v)-5 b(alues)43 b(giv)m(es)g(eac)m(h)h(k)m(eyw)m(ord)e(a)h(unique)e(v)-5 b(alue.)77 b(A)42 b(helpful)f(heuristic)i(is)f(that)h(the)f(larger)h (the)150 2369 y(hash)36 b(v)-5 b(alue)37 b(range,)i(the)e(easier)h(it)f (is)g(for)f Fr(gperf)f Fv(to)j(\014nd)d(and)h(generate)i(a)f(p)s (erfect)g(hash)f(function.)150 2479 y(Exp)s(erimen)m(tation)31 b(is)f(the)h(k)m(ey)g(to)g(getting)h(the)f(most)g(from)e Fr(gperf)p Fv(.)150 2729 y Fu(3.1)68 b(Input)44 b(F)-11 b(ormat)46 b(to)f Fl(gperf)275 2889 y Fv(Y)-8 b(ou)38 b(can)g(con)m(trol)i(the)e(input)f(\014le)h(format)g(b)m(y)g(v)-5 b(arying)38 b(certain)g(command-line)h(argumen)m(ts,)h(in)150 2998 y(particular)f(the)g(`)p Fr(-t)p Fv(')g(option.)66 b(The)38 b(input's)g(app)s(earance)h(is)g(similar)g(to)g(GNU)h (utilities)g Fr(flex)e Fv(and)150 3108 y Fr(bison)29 b Fv(\(or)i(UNIX)f(utilities)i Fr(lex)e Fv(and)f Fr(yacc)p Fv(\).)40 b(Here's)31 b(an)g(outline)g(of)f(the)h(general)g(format:)390 3249 y Fr(declarations)390 3359 y(\045\045)390 3468 y(keywords)390 3578 y(\045\045)390 3687 y(functions)275 3828 y Fm(Unlike)41 b Fr(flex)35 b Fv(or)g Fr(bison)p Fv(,)h(the)g(declarations)g(section)h (and)e(the)h(functions)f(section)i(are)f(optional.)150 3938 y(The)30 b(follo)m(wing)i(sections)f(describ)s(e)f(the)g(input)g (format)h(for)f(eac)m(h)h(section.)275 4079 y(It)h(is)g(p)s(ossible)g (to)h(omit)g(the)g(declaration)h(section)f(en)m(tirely)-8 b(,)35 b(if)d(the)h(`)p Fr(-t)p Fv(')f(option)h(is)f(not)h(giv)m(en.)48 b(In)150 4189 y(this)30 b(case)i(the)e(input)g(\014le)g(b)s(egins)g (directly)h(with)f(the)h(\014rst)e(k)m(eyw)m(ord)i(line,)g(e.g.:)390 4330 y Fr(january)390 4439 y(february)390 4549 y(march)390 4658 y(april)390 4768 y(...)150 4974 y Fk(3.1.1)63 b(Declarations)275 5121 y Fv(The)33 b(k)m(eyw)m(ord)i(input)f(\014le)g(optionally)i(con)m (tains)g(a)f(section)g(for)f(including)g(arbitrary)h(C)f(declara-)150 5230 y(tions)d(and)e(de\014nitions,)h Fr(gperf)f Fv(declarations)j (that)f(act)g(lik)m(e)h(command-line)f(options,)g(as)f(w)m(ell)i(as)e (for)150 5340 y(pro)m(viding)g(a)h(user-supplied)e Fr(struct)p Fv(.)p eop end %%Page: 16 18 TeXDict begin 16 17 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(16)150 299 y Fk(3.1.1.1)63 b(User-supplied)43 b Fj(struct)275 446 y Fv(If)24 b(the)h(`)p Fr(-t)p Fv(')f(option)h(\(or,) i(equiv)-5 b(alen)m(tly)d(,)28 b(the)d(`)p Fr(\045struct-type)p Fv(')d(declaration\))k Fm(is)32 b Fv(enabled,)26 b(y)m(ou)f Fm(must)150 555 y Fv(pro)m(vide)37 b(a)f(C)h Fr(struct)d Fv(as)j(the)g(last)g(comp)s(onen)m(t)g(in)f(the)h(declaration)h (section)f(from)f(the)h(input)f(\014le.)150 665 y(The)26 b(\014rst)f(\014eld)h(in)g(this)g(struct)g(m)m(ust)g(b)s(e)g(of)g(t)m (yp)s(e)g Fr(char)j(*)d Fv(or)g Fr(const)j(char)h(*)25 b Fv(if)h(the)h(`)p Fr(-P)p Fv(')f(option)g(is)h(not)150 775 y(giv)m(en,)k(or)g(of)f(t)m(yp)s(e)g Fr(int)g Fv(if)g(the)g(option) h(`)p Fr(-P)p Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)32 b(the)f(`)p Fr(\045pic)p Fv(')e(declaration\))j(is)f(enabled.)150 884 y(This)k(\014rst)f(\014eld)h(m)m(ust)h(b)s(e)e(called)j(`)p Fr(name)p Fv(',)f(although)g(it)g(is)g(p)s(ossible)f(to)h(mo)s(dify)e (its)i(name)g(with)f(the)150 994 y(`)p Fr(-K)p Fv(')30 b(option)h(\(or,)g(equiv)-5 b(alen)m(tly)d(,)33 b(the)d(`)p Fr(\045define)f(slot-name)p Fv(')f(declaration\))k(describ)s(ed)e(b)s (elo)m(w.)275 1139 y(Here)g(is)h(a)g(simple)f(example,)h(using)f(mon)m (ths)g(of)h(the)f(y)m(ear)i(and)d(their)i(attributes)g(as)f(input:)390 1284 y Fr(struct)46 b(month)g({)i(char)f(*name;)f(int)h(number;)e(int)i (days;)g(int)g(leap_days;)e(};)390 1393 y(\045\045)390 1503 y(january,)141 b(1,)47 b(31,)g(31)390 1612 y(february,)93 b(2,)47 b(28,)g(29)390 1722 y(march,)237 b(3,)47 b(31,)g(31)390 1832 y(april,)237 b(4,)47 b(30,)g(30)390 1941 y(may,)333 b(5,)47 b(31,)g(31)390 2051 y(june,)285 b(6,)47 b(30,)g(30)390 2160 y(july,)285 b(7,)47 b(31,)g(31)390 2270 y(august,)189 b(8,)47 b(31,)g(31)390 2380 y(september,)e(9,)i(30,)g(30)390 2489 y(october,)93 b(10,)47 b(31,)g(31)390 2599 y(november,)e(11,)i (30,)g(30)390 2708 y(december,)e(12,)i(31,)g(31)275 2853 y Fv(Separating)25 b(the)g Fr(struct)f Fv(declaration)i(from)f(the)g (list)h(of)f(k)m(eyw)m(ords)h(and)e(other)h(\014elds)g(are)g(a)h(pair)f (of)150 2963 y(consecutiv)m(e)33 b(p)s(ercen)m(t)f(signs,)f(`)p Fr(\045\045)p Fv(',)h(app)s(earing)f(left)h(justi\014ed)e(in)h(the)h (\014rst)e(column,)i(as)f(in)g(the)h(UNIX)150 3072 y(utilit)m(y)g Fr(lex)p Fv(.)275 3217 y(If)k(the)i Fr(struct)d Fv(has)i(already)h(b)s (een)f(declared)h(in)f(an)g(include)g(\014le,)i(it)f(can)g(b)s(e)e(men) m(tioned)i(in)f(an)150 3327 y(abbreviated)31 b(form,)f(lik)m(e)i(this:) 390 3472 y Fr(struct)46 b(month;)390 3581 y(\045\045)390 3691 y(january,)141 b(1,)47 b(31,)g(31)390 3801 y(...)150 4010 y Fk(3.1.1.2)63 b(Gp)s(erf)43 b(Declarations)275 4157 y Fv(The)31 b(declaration)j(section)g(can)e(con)m(tain)i Fr(gperf)c Fv(declarations.)48 b(They)32 b(in\015uence)g(the)g(w)m(a)m (y)h Fr(gperf)150 4267 y Fv(w)m(orks,)43 b(lik)m(e)f(command)f(line)g (options)g(do.)72 b(In)40 b(fact,)k(ev)m(ery)e(suc)m(h)e(declaration)i (is)f(equiv)-5 b(alen)m(t)42 b(to)g(a)150 4376 y(command)30 b(line)h(option.)41 b(There)30 b(are)h(three)f(forms)g(of)h (declarations:)199 4521 y(1.)61 b(Declarations)33 b(without)d(argumen)m (t,)h(lik)m(e)h(`)p Fr(\045compare-lengths)p Fv('.)199 4661 y(2.)61 b(Declarations)33 b(with)d(an)g(argumen)m(t,)h(lik)m(e)h (`)p Fr(\045switch=)p Fi(count)p Fv('.)199 4801 y(3.)61 b(Declarations)114 b(of)e(names)g(of)g(en)m(tities)i(in)d(the)h(output) g(\014le,)132 b(lik)m(e)114 b(`)p Fr(\045define)330 4910 y(lookup-function-name)25 b Fi(name)p Fv('.)275 5085 y(When)35 b(a)h(declaration)h(is)f(giv)m(en)g(b)s(oth)f(in)h(the)f (input)g(\014le)h(and)f(as)h(a)g(command)f(line)h(option,)i(the)150 5195 y(command-line)31 b(option's)g(v)-5 b(alue)31 b(prev)-5 b(ails.)275 5340 y(The)29 b(follo)m(wing)j Fr(gperf)d Fv(declarations)j(are)f(a)m(v)-5 b(ailable.)p eop end %%Page: 17 19 TeXDict begin 17 18 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(17)150 299 y(`)p Fr(\045delimiters=)p Fi(delimiter-lis)o(t)p Fv(')630 408 y(Allo)m(ws)30 b(y)m(ou)f(to)g(pro)m(vide)g(a)g(string)g (con)m(taining)h(delimiters)g(used)d(to)j(separate)g(k)m(eyw)m(ords)630 518 y(from)k(their)h(attributes.)54 b(The)34 b(default)g(is)h Fr(")p Fv(,)p Fr(")p Fv(.)53 b(This)34 b(option)h(is)f(essen)m(tial)j (if)d(y)m(ou)h(w)m(an)m(t)630 628 y(to)c(use)f(k)m(eyw)m(ords)h(that)g (ha)m(v)m(e)g(em)m(b)s(edded)f(commas)h(or)f(newlines.)150 774 y(`)p Fr(\045struct-type)p Fv(')630 883 y(Allo)m(ws)i(y)m(ou)e(to)i (include)e(a)h Fr(struct)d Fv(t)m(yp)s(e)j(declaration)h(for)e (generated)i(co)s(de;)f(see)g(ab)s(o)m(v)m(e)630 993 y(for)f(an)g(example.)150 1139 y(`)p Fr(\045ignore-case)p Fv(')630 1249 y(Consider)43 b(upp)s(er)f(and)i(lo)m(w)m(er)h(case)g (ASCI)s(I)e(c)m(haracters)i(as)f(equiv)-5 b(alen)m(t.)83 b(The)44 b(string)630 1358 y(comparison)28 b(will)h(use)f(a)h(case)g (insigni\014can)m(t)g(c)m(haracter)h(comparison.)40 b(Note)29 b(that)g(lo)s(cale)630 1468 y(dep)s(enden)m(t)g(case)j(mappings)d(are)i (ignored.)150 1614 y(`)p Fr(\045language=)p Fi(language-name)p Fv(')630 1724 y(Instructs)i Fr(gperf)f Fv(to)i(generate)h(co)s(de)f(in) f(the)h(language)h(sp)s(eci\014ed)d(b)m(y)i(the)g(option's)g(ar-)630 1833 y(gumen)m(t.)41 b(Languages)31 b(handled)f(are)h(curren)m(tly:)630 1979 y(`)p Fr(KR-C)p Fv(')238 b(Old-st)m(yle)27 b(K&R)f(C.)g(This)f (language)j(is)f(understo)s(o)s(d)d(b)m(y)i(old-st)m(yle)i(C)e(com-) 1110 2089 y(pilers)e(and)g(ANSI)f(C)h(compilers,)i(but)e(ANSI)f(C)h (compilers)h(ma)m(y)f(\015ag)h(w)m(arn-)1110 2198 y(ings)30 b(\(or)h(ev)m(en)g(errors\))f(b)s(ecause)h(of)f(lac)m(king)i(`)p Fr(const)p Fv('.)630 2345 y(`)p Fr(C)p Fv(')382 b(Common)23 b(C.)f(This)h(language)h(is)f(understo)s(o)s(d)e(b)m(y)i(ANSI)g(C)f (compilers,)k(and)1110 2454 y(also)k(b)m(y)e(old-st)m(yle)i(C)f (compilers,)g(pro)m(vided)f(that)i(y)m(ou)f Fr(#define)f(const)f Fv(to)1110 2564 y(empt)m(y)k(for)f(compilers)h(whic)m(h)f(don't)g(kno)m (w)h(ab)s(out)f(this)g(k)m(eyw)m(ord.)630 2710 y(`)p Fr(ANSI-C)p Fv(')142 b(ANSI)32 b(C.)g(This)f(language)j(is)e(understo)s (o)s(d)e(b)m(y)i(ANSI)g(C)f(\(C89,)j(ISO)d(C90\))1110 2819 y(compilers,)g(ISO)e(C99)i(compilers,)g(and)f(C)p Fr(++)f Fv(compilers.)630 2966 y(`)p Fr(C++)p Fv(')286 b(C)p Fr(++)p Fv(.)40 b(This)29 b(language)j(is)f(understo)s(o)s(d)d(b) m(y)i(C)p Fr(++)g Fv(compilers.)630 3112 y(The)g(default)g(is)h (ANSI-C.)150 3258 y(`)p Fr(\045define)e(slot-name)e Fi(name)p Fv(')630 3367 y(This)65 b(declaration)j(is)e(only)g(useful)f(when)g (option)h(`)p Fr(-t)p Fv(')g(\(or,)76 b(equiv)-5 b(alen)m(tly)d(,)77 b(the)630 3477 y(`)p Fr(\045struct-type)p Fv(')27 b(declaration\))32 b(has)e(b)s(een)g(giv)m(en.)41 b(By)31 b(default,)f(the)g(program)g (assumes)630 3587 y(the)48 b(structure)g(comp)s(onen)m(t)h(iden)m (ti\014er)f(for)g(the)g(k)m(eyw)m(ord)h(is)f(`)p Fr(name)p Fv('.)94 b(This)47 b(option)630 3696 y(allo)m(ws)f(an)e(arbitrary)g(c)m (hoice)i(of)f(iden)m(ti\014er)f(for)h(this)f(comp)s(onen)m(t,)k (although)d(it)g(still)630 3806 y(m)m(ust)30 b(o)s(ccur)g(as)h(the)g (\014rst)e(\014eld)h(in)g(y)m(our)h(supplied)e Fr(struct)p Fv(.)150 3952 y(`)p Fr(\045define)g(initializer-suffix)c Fi(initializers)p Fv(')630 4061 y(This)65 b(declaration)j(is)e(only)g (useful)f(when)g(option)h(`)p Fr(-t)p Fv(')g(\(or,)76 b(equiv)-5 b(alen)m(tly)d(,)77 b(the)630 4171 y(`)p Fr(\045struct-type) p Fv(')33 b(declaration\))38 b(has)d(b)s(een)g(giv)m(en.)58 b(It)36 b(p)s(ermits)f(to)i(sp)s(ecify)e(initializers)630 4281 y(for)44 b(the)g(structure)g(mem)m(b)s(ers)f(follo)m(wing)i Fn(slot-name)51 b Fv(in)43 b(empt)m(y)i(hash)e(table)i(en)m(tries.)630 4390 y(The)d(list)g(of)h(initializers)g(should)e(start)i(with)f(a)g (comma.)77 b(By)42 b(default,)k(the)c(emitted)630 4500 y(co)s(de)31 b(will)f(zero-initialize)k(structure)c(mem)m(b)s(ers)g (follo)m(wing)i Fn(slot-name)p Fv(.)150 4646 y(`)p Fr(\045define)d (hash-function-name)c Fi(name)p Fv(')630 4756 y(Allo)m(ws)31 b(y)m(ou)f(to)g(sp)s(ecify)g(the)g(name)g(for)f(the)h(generated)h(hash) e(function.)40 b(Default)31 b(name)630 4865 y(is)f(`)p Fr(hash)p Fv('.)40 b(This)30 b(option)h(p)s(ermits)e(the)i(use)f(of)h (t)m(w)m(o)g(hash)f(tables)h(in)f(the)h(same)g(\014le.)150 5011 y(`)p Fr(\045define)e(lookup-function-name)24 b Fi(name)p Fv(')630 5121 y(Allo)m(ws)43 b(y)m(ou)f(to)h(sp)s(ecify)e (the)i(name)f(for)f(the)h(generated)h(lo)s(okup)f(function.)75 b(Default)630 5230 y(name)28 b(is)g(`)p Fr(in_word_set)p Fv('.)37 b(This)27 b(option)h(p)s(ermits)f(m)m(ultiple)i(generated)f (hash)f(functions)630 5340 y(to)k(b)s(e)f(used)f(in)h(the)h(same)g (application.)p eop end %%Page: 18 20 TeXDict begin 18 19 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(18)150 299 y(`)p Fr(\045define)29 b(class-name)e Fi(name)p Fv(')630 408 y(This)66 b(option)i(is)f(only)h(useful)e(when)h (option)g(`)p Fr(-L)30 b(C++)p Fv(')67 b(\(or,)77 b(equiv)-5 b(alen)m(tly)d(,)79 b(the)630 518 y(`)p Fr(\045language=C++)p Fv(')43 b(declaration\))k(has)f(b)s(een)f(giv)m(en.)88 b(It)46 b(allo)m(ws)h(y)m(ou)f(to)g(sp)s(ecify)g(the)630 628 y(name)30 b(of)h(generated)g(C)p Fr(++)f Fv(class.)41 b(Default)32 b(name)e(is)h Fr(Perfect_Hash)p Fv(.)150 792 y(`)p Fr(\0457bit)p Fv(')190 b(This)36 b(option)i(sp)s(eci\014es)f (that)g(all)h(strings)f(that)h(will)f(b)s(e)g(passed)f(as)i(argumen)m (ts)f(to)h(the)630 902 y(generated)e(hash)e(function)g(and)h(the)g (generated)g(lo)s(okup)g(function)f(will)h(solely)h(consist)630 1011 y(of)d(7-bit)h(ASCI)s(I)e(c)m(haracters)j(\(b)m(ytes)f(in)f(the)g (range)h(0..127\).)51 b(\(Note)35 b(that)f(the)g(ANSI)e(C)630 1121 y(functions)f Fr(isalnum)f Fv(and)i Fr(isgraph)e Fv(do)i Fm(not)41 b Fv(guaran)m(tee)33 b(that)g(a)f(b)m(yte)h(is)f(in)f (this)h(range.)630 1230 y(Only)e(an)g(explicit)i(test)f(lik)m(e)h(`)p Fr(c)e(>=)g(\015A\015)f(&&)h(c)g(<=)g(\015Z\015)p Fv(')f(guaran)m(tees) j(this.\))150 1395 y(`)p Fr(\045compare-lengths)p Fv(')630 1504 y(Compare)40 b(k)m(eyw)m(ord)g(lengths)g(b)s(efore)f(trying)h(a)h (string)e(comparison.)70 b(This)39 b(option)h(is)630 1614 y(mandatory)32 b(for)h(binary)e(comparisons)i(\(see)g(Section)h (3.3)f([Binary)g(Strings],)g(page)g(22\).)630 1724 y(It)g(also)h(migh)m (t)g(cut)f(do)m(wn)f(on)h(the)g(n)m(um)m(b)s(er)f(of)h(string)g (comparisons)g(made)g(during)f(the)630 1833 y(lo)s(okup,)i(since)g(k)m (eyw)m(ords)f(with)g(di\013eren)m(t)h(lengths)g(are)f(nev)m(er)h (compared)f(via)h Fr(strcmp)p Fv(.)630 1943 y(Ho)m(w)m(ev)m(er,)d (using)d(`)p Fr(\045compare-lengths)p Fv(')c(migh)m(t)29 b(greatly)h(increase)f(the)g(size)g(of)g(the)f(gen-)630 2052 y(erated)j(C)f(co)s(de)h(if)f(the)h(lo)s(okup)f(table)i(range)e (is)h(large)g(\(whic)m(h)g(implies)g(that)g(the)f(switc)m(h)630 2162 y(option)24 b(`)p Fr(-S)p Fv(')g(or)g(`)p Fr(\045switch)p Fv(')f(is)h(not)g(enabled\),)i(since)e(the)g(length)h(table)f(con)m (tains)i(as)e(man)m(y)630 2271 y(elemen)m(ts)32 b(as)e(there)h(are)g (en)m(tries)g(in)f(the)g(lo)s(okup)g(table.)150 2436 y(`)p Fr(\045compare-strncmp)p Fv(')630 2545 y(Generates)22 b(C)f(co)s(de)g(that)h(uses)e(the)i Fr(strncmp)d Fv(function)h(to)i(p)s (erform)e(string)h(comparisons.)630 2655 y(The)30 b(default)g(action)i (is)f(to)g(use)f Fr(strcmp)p Fv(.)150 2819 y(`)p Fr (\045readonly-tables)p Fv(')630 2929 y(Mak)m(es)41 b(the)f(con)m(ten)m (ts)h(of)f(all)h(generated)f(lo)s(okup)f(tables)i(constan)m(t,)i(i.e.,) h(\\readonly".)630 3039 y(Man)m(y)31 b(compilers)g(can)g(generate)h (more)e(e\016cien)m(t)i(co)s(de)f(for)f(this)h(b)m(y)f(putting)g(the)h (tables)630 3148 y(in)f(readonly)h(memory)-8 b(.)150 3313 y(`)p Fr(\045enum)p Fv(')190 b(De\014ne)31 b(constan)m(t)g(v)-5 b(alues)31 b(using)f(an)g(en)m(um)g(lo)s(cal)i(to)f(the)g(lo)s(okup)f (function)g(rather)g(than)630 3422 y(with)37 b(#de\014nes.)60 b(This)36 b(also)i(means)g(that)f(di\013eren)m(t)h(lo)s(okup)f (functions)g(can)g(reside)g(in)630 3532 y(the)31 b(same)f(\014le.)41 b(Thanks)29 b(to)j(James)e(Clark)g Fr()p Fv(.)150 3696 y(`)p Fr(\045includes)p Fv(')630 3806 y(Include)g(the)h (necessary)h(system)f(include)g(\014le,)g Fr()p Fv(,)e(at)i(the)g(b)s(eginning)g(of)g(the)630 3915 y(co)s(de.)39 b(By)27 b(default,)g(this)f(is)g(not)g(done;)i(the)e(user)f(m)m(ust)h (include)g(this)f(header)h(\014le)g(himself)630 4025 y(to)31 b(allo)m(w)h(compilation)g(of)e(the)h(co)s(de.)150 4189 y(`)p Fr(\045global-table)p Fv(')630 4299 y(Generate)38 b(the)f(static)h(table)f(of)g(k)m(eyw)m(ords)g(as)g(a)g(static)h (global)g(v)-5 b(ariable,)39 b(rather)d(than)630 4408 y(hiding)30 b(it)h(inside)f(of)g(the)h(lo)s(okup)f(function)g(\(whic)m (h)g(is)h(the)f(default)h(b)s(eha)m(vior\).)150 4573 y(`)p Fr(\045pic)p Fv(')238 b(Optimize)42 b(the)f(generated)h(table)g (for)f(inclusion)g(in)g(shared)f(libraries.)73 b(This)40 b(reduces)630 4682 y(the)35 b(startup)g(time)h(of)f(programs)g(using)g (a)h(shared)e(library)h(con)m(taining)i(the)e(generated)630 4792 y(co)s(de.)j(If)21 b(the)h(`)p Fr(\045struct-type)p Fv(')d(declaration)24 b(\(or,)g(equiv)-5 b(alen)m(tly)d(,)26 b(the)c(option)g(`)p Fr(-t)p Fv('\))g(is)g(also)630 4902 y(giv)m(en,)32 b(the)f(\014rst)e(\014eld)i(of)f(the)h(user-de\014ned)e (struct)i(m)m(ust)f(b)s(e)g(of)h(t)m(yp)s(e)g(`)p Fr(int)p Fv(',)f(not)h(`)p Fr(char)630 5011 y(*)p Fv(',)h(b)s(ecause)f(it)i (will)e(con)m(tain)i(o\013sets)g(in)m(to)f(the)g(string)f(p)s(o)s(ol)h (instead)f(of)h(actual)h(strings.)630 5121 y(T)-8 b(o)33 b(con)m(v)m(ert)h(suc)m(h)f(an)f(o\013set)i(to)f(a)g(string,)h(y)m(ou)f (can)g(use)f(the)h(expression)f(`)p Fr(stringpool)630 5230 y(+)e Fi(o)p Fv(',)k(where)f Fn(o)38 b Fv(is)33 b(the)g(o\013set.)51 b(The)32 b(string)h(p)s(o)s(ol)g(name)g(can)h(b)s (e)e(c)m(hanged)i(through)f(the)630 5340 y(`)p Fr(\045define)c (string-pool-name)p Fv(')d(declaration.)p eop end %%Page: 19 21 TeXDict begin 19 20 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(19)150 299 y(`)p Fr(\045define)29 b(string-pool-name)d Fi(name)p Fv(')630 408 y(Allo)m(ws)42 b(y)m(ou)f(to)h(sp)s(ecify)f(the) g(name)g(of)g(the)g(generated)h(string)f(p)s(o)s(ol)g(created)h(b)m(y)f (the)630 518 y(declaration)48 b(`)p Fr(\045pic)p Fv(')e(\(or,)51 b(equiv)-5 b(alen)m(tly)d(,)53 b(the)47 b(option)f(`)p Fr(-P)p Fv('\).)90 b(The)46 b(default)g(name)h(is)630 628 y(`)p Fr(stringpool)p Fv('.)38 b(This)29 b(declaration)i(p)s (ermits)e(the)h(use)g(of)g(t)m(w)m(o)h(hash)e(tables)h(in)g(the)g(same) 630 737 y(\014le,)39 b(with)d(`)p Fr(\045pic)p Fv(')g(and)g(ev)m(en)h (when)f(the)h(`)p Fr(\045global-table)p Fv(')c(declaration)38 b(\(or,)h(equiv)-5 b(a-)630 847 y(len)m(tly)d(,)32 b(the)f(option)g(`)p Fr(-G)p Fv('\))f(is)h(giv)m(en.)150 1024 y(`)p Fr(\045null-strings)p Fv(')630 1133 y(Use)39 b(NULL)g(strings)f(instead)i(of)e(empt)m(y)i (strings)e(for)h(empt)m(y)g(k)m(eyw)m(ord)g(table)h(en)m(tries.)630 1243 y(This)e(reduces)g(the)h(startup)g(time)g(of)g(programs)g(using)f (a)h(shared)f(library)g(con)m(taining)630 1352 y(the)29 b(generated)g(co)s(de)g(\(but)f(not)g(as)h(m)m(uc)m(h)g(as)f(the)h (declaration)h(`)p Fr(\045pic)p Fv('\),)f(at)g(the)f(exp)s(ense)630 1462 y(of)j(one)f(more)h(test-and-branc)m(h)g(instruction)f(at)h(run)e (time.)150 1639 y(`)p Fr(\045define)g(constants-prefix)d Fi(prefix)p Fv(')630 1748 y(Allo)m(ws)37 b(y)m(ou)g(to)g(sp)s(ecify)f (a)g(pre\014x)g(for)g(the)g(constan)m(ts)h Fr(TOTAL_KEYWORDS)p Fv(,)d Fr(MIN_WORD_)630 1858 y(LENGTH)p Fv(,)45 b Fr(MAX_WORD_LENGTH)p Fv(,)e(and)g(so)g(on.)80 b(This)43 b(option)h(p)s(ermits)e(the)i(use)f (of)h(t)m(w)m(o)630 1968 y(hash)50 b(tables)i(in)f(the)g(same)g (\014le,)57 b(ev)m(en)51 b(when)f(the)i(option)f(`)p Fr(-E)p Fv(')g(\(or,)57 b(equiv)-5 b(alen)m(tly)d(,)630 2077 y(the)39 b(`)p Fr(\045enum)p Fv(')e(declaration\))j(is)f(not)f (giv)m(en)i(or)e(the)h(option)g(`)p Fr(-G)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)43 b(the)630 2187 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 2364 y(`)p Fr(\045define)f(word-array-name)d Fi(name)p Fv(')630 2473 y(Allo)m(ws)41 b(y)m(ou)f(to)h(sp)s(ecify)f(the)g(name)g(for)f (the)i(generated)g(arra)m(y)f(con)m(taining)i(the)e(hash)630 2583 y(table.)106 b(Default)53 b(name)e(is)h(`)p Fr(wordlist)p Fv('.)103 b(This)51 b(option)h(p)s(ermits)f(the)h(use)g(of)g(t)m(w)m(o) 630 2692 y(hash)37 b(tables)h(in)g(the)g(same)g(\014le,)i(ev)m(en)e (when)f(the)h(option)g(`)p Fr(-G)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)630 2802 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 2979 y(`)p Fr(\045define)f(length-table-name)c Fi(name)p Fv(')630 3088 y(Allo)m(ws)36 b(y)m(ou)e(to)i(sp)s(ecify)e(the)h(name)f(for)g (the)h(generated)h(arra)m(y)f(con)m(taining)h(the)f(length)630 3198 y(table.)77 b(Default)43 b(name)g(is)f(`)p Fr(lengthtable)p Fv('.)74 b(This)41 b(option)i(p)s(ermits)e(the)h(use)g(of)h(t)m(w)m(o) 630 3308 y(length)33 b(tables)h(in)f(the)g(same)g(\014le,)h(ev)m(en)g (when)e(the)h(option)h(`)p Fr(-G)p Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)36 b(the)630 3417 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 3594 y(`)p Fr(\045switch=)p Fi(count)p Fv(')630 3704 y(Causes)35 b(the)h(generated)h(C)e(co)s(de)h(to)h(use)e(a)h Fr(switch)e Fv(statemen)m(t)k(sc)m(heme,)g(rather)d(than)630 3813 y(an)j(arra)m(y)g(lo)s(okup)g(table.)64 b(This)37 b(can)h(lead)h(to)f (a)h(reduction)f(in)f(b)s(oth)g(time)i(and)e(space)630 3923 y(requiremen)m(ts)43 b(for)h(some)f(input)g(\014les.)80 b(The)43 b(argumen)m(t)h(to)g(this)f(option)h(determines)630 4032 y(ho)m(w)33 b(man)m(y)f Fr(switch)f Fv(statemen)m(ts)k(are)e (generated.)49 b(A)32 b(v)-5 b(alue)34 b(of)e(1)i(generates)g(1)f Fr(switch)630 4142 y Fv(con)m(taining)25 b(all)e(the)h(elemen)m(ts,)i (a)d(v)-5 b(alue)23 b(of)h(2)f(generates)h(2)g(tables)f(with)g(1/2)h (the)g(elemen)m(ts)630 4252 y(in)38 b(eac)m(h)h Fr(switch)p Fv(,)g(etc.)65 b(This)37 b(is)h(useful)g(since)g(man)m(y)h(C)e (compilers)i(cannot)g(correctly)630 4361 y(generate)29 b(co)s(de)f(for)f(large)h Fr(switch)e Fv(statemen)m(ts.)41 b(This)27 b(option)h(w)m(as)g(inspired)e(in)h(part)g(b)m(y)630 4471 y(Keith)k(Bostic's)h(original)f(C)f(program.)150 4648 y(`)p Fr(\045omit-struct-type)p Fv(')630 4757 y(Prev)m(en)m(ts)f (the)e(transfer)h(of)f(the)h(t)m(yp)s(e)g(declaration)h(to)g(the)f (output)f(\014le.)40 b(Use)28 b(this)f(option)630 4867 y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g(de\014ned)e(elsewhere.)150 5083 y Fk(3.1.1.3)63 b(C)41 b(Co)s(de)g(Inclusion)275 5230 y Fv(Using)26 b(a)g(syn)m(tax)h(similar)f(to)h(GNU)f(utilities)i Fr(flex)d Fv(and)g Fr(bison)p Fv(,)h(it)g(is)g(p)s(ossible)g(to)g (directly)h(include)150 5340 y(C)i(source)h(text)g(and)f(commen)m(ts)h (v)m(erbatim)g(in)m(to)h(the)e(generated)i(output)e(\014le.)40 b(This)29 b(is)g(accomplished)p eop end %%Page: 20 22 TeXDict begin 20 21 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(20)150 299 y(b)m(y)37 b(enclosing)h(the)g(region)g(inside)e (left-justi\014ed)i(surrounding)d(`)p Fr(\045{)p Fv(',)k(`)p Fr(\045})p Fv(')e(pairs.)61 b(Here)38 b(is)f(an)g(input)150 408 y(fragmen)m(t)31 b(based)f(on)g(the)h(previous)f(example)h(that)g (illustrates)g(this)g(feature:)390 538 y Fr(\045{)390 648 y(#include)46 b()390 758 y(/*)h(This)g(section)f(of)h (code)f(is)i(inserted)d(directly)h(into)g(the)h(output.)f(*/)390 867 y(int)h(return_month_days)c(\(struct)j(month)g(*months,)g(int)h (is_leap_year\);)390 977 y(\045})390 1086 y(struct)f(month)g({)i(char)f (*name;)f(int)h(number;)e(int)i(days;)g(int)g(leap_days;)e(};)390 1196 y(\045\045)390 1305 y(january,)141 b(1,)47 b(31,)g(31)390 1415 y(february,)93 b(2,)47 b(28,)g(29)390 1525 y(march,)237 b(3,)47 b(31,)g(31)390 1634 y(...)150 1824 y Fk(3.1.2)63 b(F)-10 b(ormat)41 b(for)h(Keyw)m(ord)e(En)m(tries)275 1971 y Fv(The)33 b(second)i(input)e(\014le)i(format)g(section)g(con)m (tains)h(lines)e(of)h(k)m(eyw)m(ords)g(and)e(an)m(y)i(asso)s(ciated)h (at-)150 2081 y(tributes)i(y)m(ou)h(migh)m(t)g(supply)-8 b(.)64 b(A)39 b(line)f(b)s(eginning)g(with)g(`)p Fr(#)p Fv(')h(in)f(the)h(\014rst)f(column)g(is)g(considered)h(a)150 2190 y(commen)m(t.)53 b(Ev)m(erything)34 b(follo)m(wing)h(the)g(`)p Fr(#)p Fv(')f(is)g(ignored,)h(up)e(to)i(and)e(including)h(the)g(follo)m (wing)h(new-)150 2300 y(line.)57 b(A)36 b(line)h(b)s(eginning)e(with)g (`)p Fr(\045)p Fv(')h(in)g(the)g(\014rst)f(column)g(is)h(an)g(option)g (declaration)i(and)d(m)m(ust)h(not)150 2410 y(o)s(ccur)30 b(within)g(the)h(k)m(eyw)m(ords)f(section.)275 2539 y(The)36 b(\014rst)g(\014eld)g(of)h(eac)m(h)g(non-commen)m(t)h(line)f(is)g(alw)m (a)m(ys)h(the)f(k)m(eyw)m(ord)g(itself.)60 b(It)37 b(can)g(b)s(e)f(giv) m(en)150 2649 y(in)f(t)m(w)m(o)h(w)m(a)m(ys:)51 b(as)35 b(a)g(simple)g(name,)i(i.e.,)g(without)e(surrounding)e(string)i (quotation)h(marks,)g(or)f(as)h(a)150 2759 y(string)i(enclosed)g(in)f (double-quotes,)j(in)d(C)h(syn)m(tax,)i(p)s(ossibly)d(with)g(bac)m (kslash)h(escap)s(es)g(lik)m(e)h Fr(\\")e Fv(or)150 2868 y Fr(\\234)23 b Fv(or)i Fr(\\xa8)p Fv(.)37 b(In)24 b(either)h(case,)i (it)e(m)m(ust)f(start)h(righ)m(t)g(at)g(the)g(b)s(eginning)e(of)i(the)g (line,)h(without)e(leading)150 2978 y(whitespace.)58 b(In)35 b(this)h(con)m(text,)j(a)e(\\\014eld")f(is)g(considered)g(to)g (extend)g(up)f(to,)j(but)d(not)h(include,)i(the)150 3087 y(\014rst)g(blank,)i(comma,)i(or)c(newline.)65 b(Here)39 b(is)f(a)h(simple)g(example)g(tak)m(en)g(from)f(a)h(partial)h(list)f (of)f(C)150 3197 y(reserv)m(ed)31 b(w)m(ords:)390 3327 y Fr(#)47 b(These)g(are)g(a)g(few)g(C)h(reserved)d(words,)h(see)h(the)g (c.gperf)f(file)390 3436 y(#)h(for)g(a)h(complete)d(list)i(of)g(ANSI)g (C)g(reserved)f(words.)390 3546 y(unsigned)390 3656 y(sizeof)390 3765 y(switch)390 3875 y(signed)390 3984 y(if)390 4094 y(default)390 4204 y(for)390 4313 y(while)390 4423 y(return)275 4553 y Fv(Note)38 b(that)f(unlik)m(e)g Fr(flex)f Fv(or)h Fr(bison)e Fv(the)j(\014rst)e(`)p Fr(\045\045)p Fv(')g(mark)m(er)i(ma)m (y)f(b)s(e)f(elided)h(if)g(the)g(declaration)150 4662 y(section)32 b(is)e(empt)m(y)-8 b(.)275 4792 y(Additional)29 b(\014elds)f(ma)m(y)h(optionally)h(follo)m(w)g(the)f(leading)g(k)m(eyw) m(ord.)41 b(Fields)29 b(should)e(b)s(e)h(separated)150 4902 y(b)m(y)g(commas,)i(and)d(terminate)j(at)f(the)f(end)g(of)g(line.) 41 b(What)29 b(these)f(\014elds)g(mean)g(is)h(en)m(tirely)g(up)e(to)i (y)m(ou;)150 5011 y(they)k(are)h(used)e(to)i(initialize)h(the)f(elemen) m(ts)g(of)f(the)h(user-de\014ned)d Fr(struct)h Fv(pro)m(vided)g(b)m(y)h (y)m(ou)h(in)f(the)150 5121 y(declaration)40 b(section.)67 b(If)39 b(the)g(`)p Fr(-t)p Fv(')f(option)h(\(or,)j(equiv)-5 b(alen)m(tly)d(,)43 b(the)c(`)p Fr(\045struct-type)p Fv(')d(declaration\))150 5230 y(is)g Fm(not)45 b Fv(enabled)36 b(these)g(\014elds)g(are)g(simply)f(ignored.)58 b(All)36 b(previous)g(examples)g(except)h(the)f(last)h(one)150 5340 y(con)m(tain)32 b(k)m(eyw)m(ord)f(attributes.)p eop end %%Page: 21 23 TeXDict begin 21 22 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(21)150 299 y Fk(3.1.3)63 b(Including)41 b(Additional)g(C)g(F)-10 b(unctions)275 446 y Fv(The)30 b(optional)i(third)e(section)i(also)g (corresp)s(onds)d(closely)j(with)f(con)m(v)m(en)m(tions)i(found)c(in)i Fr(flex)f Fv(and)150 555 y Fr(bison)p Fv(.)36 b(All)23 b(text)g(in)f(this)f(section,)k(starting)e(at)g(the)f(\014nal)f(`)p Fr(\045\045)p Fv(')h(and)f(extending)i(to)f(the)g(end)g(of)g(the)g (input)150 665 y(\014le,)31 b(is)g(included)g(v)m(erbatim)g(in)m(to)h (the)f(generated)h(output)f(\014le.)42 b(Naturally)-8 b(,)33 b(it)e(is)g(y)m(our)g(resp)s(onsibilit)m(y)150 775 y(to)g(ensure)f(that)h(the)f(co)s(de)h(con)m(tained)g(in)g(this)f (section)h(is)g(v)-5 b(alid)30 b(C.)150 981 y Fk(3.1.4)63 b(Where)41 b(to)g(place)f(directiv)m(es)g(for)i(GNU)g Fj(indent)p Fk(.)275 1128 y Fv(If)26 b(y)m(ou)i(w)m(an)m(t)g(to)g(in)m (v)m(ok)m(e)h(GNU)f Fr(indent)e Fv(on)h(a)g Fr(gperf)f Fv(input)h(\014le,)h(y)m(ou)f(will)h(see)g(that)g(GNU)g Fr(indent)150 1237 y Fv(do)s(esn't)33 b(understand)e(the)i(`)p Fr(\045\045)p Fv(',)h(`)p Fr(\045{)p Fv(')e(and)h(`)p Fr(\045})p Fv(')g(directiv)m(es)h(that)f(con)m(trol)i Fr(gperf)p Fv('s)c(in)m(terpretation)k(of)150 1347 y(the)23 b(input)f(\014le.)38 b(Therefore)23 b(y)m(ou)g(ha)m(v)m(e)h(to)g (insert)f(some)g(directiv)m(es)h(for)f(GNU)h Fr(indent)p Fv(.)36 b(More)24 b(precisely)-8 b(,)150 1457 y(assuming)30 b(the)h(most)f(general)i(input)d(\014le)i(structure)390 1598 y Fr(declarations)44 b(part)j(1)390 1708 y(\045{)390 1817 y(verbatim)f(code)390 1927 y(\045})390 2037 y(declarations)e(part) j(2)390 2146 y(\045\045)390 2256 y(keywords)390 2365 y(\045\045)390 2475 y(functions)150 2617 y Fv(y)m(ou)31 b(w)m(ould)f(insert)g(`)p Fr(*INDENT-OFF*)p Fv(')e(and)h(`)p Fr(*INDENT-ON*)p Fv(')f(commen)m(ts)k(as)e(follo)m(ws:)390 2758 y Fr(/*)47 b(*INDENT-OFF*)e(*/)390 2868 y(declarations)f(part)j(1) 390 2977 y(\045{)390 3087 y(/*)g(*INDENT-ON*)e(*/)390 3196 y(verbatim)h(code)390 3306 y(/*)h(*INDENT-OFF*)e(*/)390 3416 y(\045})390 3525 y(declarations)f(part)j(2)390 3635 y(\045\045)390 3744 y(keywords)390 3854 y(\045\045)390 3964 y(/*)g(*INDENT-ON*)e(*/)390 4073 y(functions)150 4325 y Fu(3.2)68 b(Output)45 b(F)-11 b(ormat)45 b(for)g(Generated)h(C)f (Co)t(de)g(with)g Fl(gperf)275 4484 y Fv(Sev)m(eral)28 b(options)g(con)m(trol)h(ho)m(w)e(the)h(generated)h(C)e(co)s(de)h(app)s (ears)e(on)i(the)g(standard)e(output.)40 b(Tw)m(o)150 4594 y(C)i(functions)g(are)h(generated.)77 b(They)42 b(are)h(called)g Fr(hash)f Fv(and)f Fr(in_word_set)p Fv(,)i(although)g(y)m(ou)f(ma)m(y)150 4703 y(mo)s(dify)30 b(their)g(names)h(with)f(a)h(command-line)g(option.)42 b(Both)31 b(functions)f(require)g(t)m(w)m(o)i(argumen)m(ts,)g(a)150 4813 y(string,)h Fr(char)c(*)i Fn(str)p Fv(,)i(and)e(a)i(length)f (parameter,)h Fr(int)e Fn(len)p Fv(.)46 b(Their)31 b(default)h (function)g(protot)m(yp)s(es)h(are)150 4922 y(as)e(follo)m(ws:)3350 5121 y([F)-8 b(unction])-3599 b Fh(unsigned)55 b(int)e(hash)47 b Fg(\()p Fh(const)54 b(char)f(*)g Ff(str)p Fh(,)g(size_t)i Ff(len)p Fg(\))390 5230 y Fv(By)35 b(default,)h(the)e(generated)i Fr(hash)d Fv(function)h(returns)f(an)i(in)m(teger)h(v)-5 b(alue)34 b(created)i(b)m(y)e(adding)390 5340 y Fn(len)28 b Fv(to)g(sev)m(eral)h(user-sp)s(eci\014ed)d Fn(str)34 b Fv(b)m(yte)28 b(p)s(ositions)g(indexed)f(in)m(to)h(an)f Fn(asso)s(ciated)i(v)-5 b(alues)32 b Fv(table)p eop end %%Page: 22 24 TeXDict begin 22 23 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(22)390 299 y(stored)28 b(in)g(a)g(lo)s(cal)i(static)f(arra)m(y)-8 b(.)41 b(The)28 b(asso)s(ciated)h(v)-5 b(alues)29 b(table)g(is)f (constructed)g(in)m(ternally)h(b)m(y)390 408 y Fr(gperf)34 b Fv(and)g(later)i(output)e(as)i(a)f(static)i(lo)s(cal)f(C)e(arra)m(y)i (called)g(`)p Fr(hash_table)p Fv('.)52 b(The)35 b(relev)-5 b(an)m(t)390 518 y(selected)28 b(p)s(ositions)f(\(i.e.)41 b(indices)27 b(in)m(to)h Fn(str)7 b Fv(\))26 b(are)h(sp)s(eci\014ed)f (via)i(the)f(`)p Fr(-k)p Fv(')g(option)g(when)f(running)390 628 y Fr(gperf)p Fv(,)j(as)i(detailed)g(in)f(the)h Fm(Options)39 b Fv(section)31 b(b)s(elo)m(w)g(\(see)g(Chapter)f(4)h([Options],)f (page)h(24\).)3350 828 y([F)-8 b(unction])-3599 b Fh(in_word_set)49 b Fg(\()p Fh(const)54 b(char)f(*)g Ff(str)p Fh(,)h(size_t)g Ff(len)p Fg(\))390 938 y Fv(If)33 b Fn(str)41 b Fv(is)33 b(in)h(the)g(k)m(eyw)m(ord)g(set,)i(returns)c(a)j(p)s(oin)m(ter)f(to)g (that)h(k)m(eyw)m(ord.)51 b(More)35 b(exactly)-8 b(,)37 b(if)d(the)390 1048 y(option)d(`)p Fr(-t)p Fv(')g(\(or,)g(equiv)-5 b(alen)m(tly)d(,)33 b(the)e(`)p Fr(\045struct-type)p Fv(')d(declaration\))k(w)m(as)f(giv)m(en,)h(it)f(returns)f(a)390 1157 y(p)s(oin)m(ter)g(to)h(the)g(matc)m(hing)h(k)m(eyw)m(ord's)e (structure.)41 b(Otherwise)30 b(it)h(returns)e Fr(NULL)p Fv(.)275 1358 y(If)39 b(the)i(option)f(`)p Fr(-c)p Fv(')g(\(or,)j (equiv)-5 b(alen)m(tly)d(,)45 b(the)c(`)p Fr(\045compare-strncmp)p Fv(')36 b(declaration\))42 b(is)e(not)g(used,)150 1468 y Fn(str)k Fv(m)m(ust)37 b(b)s(e)f(a)i(NUL)f(terminated)h(string)f(of)h (exactly)h(length)e Fn(len)p Fv(.)62 b(If)37 b(`)p Fr(-c)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)150 1577 y(`)p Fr(\045compare-strncmp)p Fv(')22 b(declaration\))28 b(is)e(used,)g Fn(str)32 b Fv(m)m(ust)26 b(simply)g(b)s(e)f(an)h(arra)m (y)g(of)g Fn(len)g Fv(b)m(ytes)h(and)e(do)s(es)150 1687 y(not)31 b(need)f(to)h(b)s(e)f(NUL)g(terminated.)275 1829 y(The)f(co)s(de)i(generated)g(for)g(these)f(t)m(w)m(o)i(functions) e(is)g(a\013ected)i(b)m(y)f(the)f(follo)m(wing)i(options:)150 2001 y(`)p Fr(-t)p Fv(')150 2111 y(`)p Fr(--struct-type)p Fv(')630 2220 y(Mak)m(e)g(use)e(of)h(the)f(user-de\014ned)f Fr(struct)p Fv(.)150 2388 y(`)p Fr(-S)h Fi(total-switch-statements)p Fv(')150 2498 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)p Fv(')630 2607 y(Generate)22 b(1)f(or)g(more)g(C)f Fr(switch)f Fv(statemen)m(t)j(rather)f(than)f(use)h(a)g(large,)j(\(and)c(p)s(oten)m (tially)630 2717 y(sparse\))j(static)h(arra)m(y)-8 b(.)40 b(Although)23 b(the)g(exact)h(time)g(and)e(space)i(sa)m(vings)g(of)f (this)g(approac)m(h)630 2826 y(v)-5 b(ary)32 b(according)g(to)h(y)m (our)e(C)g(compiler's)i(degree)f(of)g(optimization,)i(this)d(metho)s(d) h(often)630 2936 y(results)e(in)g(smaller)h(and)f(faster)h(co)s(de.)275 3108 y(If)c(the)h(`)p Fr(-t)p Fv(')g(and)f(`)p Fr(-S)p Fv(')g(options)i(\(or,)f(equiv)-5 b(alen)m(tly)d(,)31 b(the)d(`)p Fr(\045struct-type)p Fv(')d(and)i(`)p Fr(\045switch)p Fv(')g(declara-)150 3217 y(tions\))f(are)f(omitted,)i(the)e(default)g (action)h(is)f(to)h(generate)g(a)g Fr(char)j(*)24 b Fv(arra)m(y)i(con)m (taining)g(the)f(k)m(eyw)m(ords,)150 3327 y(together)32 b(with)e(additional)i(empt)m(y)f(strings)f(used)g(for)g(padding)g(the)g (arra)m(y)-8 b(.)43 b(By)30 b(exp)s(erimen)m(ting)h(with)150 3437 y(the)g(v)-5 b(arious)32 b(input)e(and)g(output)h(options,)h(and)f (timing)g(the)h(resulting)f(C)g(co)s(de,)h(y)m(ou)f(can)h(determine)150 3546 y(the)f(b)s(est)f(option)g(c)m(hoices)i(for)f(di\013eren)m(t)f(k)m (eyw)m(ord)h(set)g(c)m(haracteristics.)150 3799 y Fu(3.3)68 b(Use)46 b(of)f(NUL)g(b)l(ytes)275 3959 y Fv(By)30 b(default,)h(the)f (co)s(de)g(generated)i(b)m(y)e Fr(gperf)e Fv(op)s(erates)j(on)f(zero)h (terminated)g(strings,)f(the)g(usual)150 4068 y(represen)m(tation)41 b(of)e(strings)h(in)f(C.)h(This)e(means)i(that)g(the)g(k)m(eyw)m(ords)g (in)f(the)h(input)f(\014le)g(m)m(ust)h(not)150 4178 y(con)m(tain)d(NUL) f(b)m(ytes,)i(and)e(the)g Fn(str)42 b Fv(argumen)m(t)36 b(passed)g(to)g Fr(hash)f Fv(or)h Fr(in_word_set)d Fv(m)m(ust)j(b)s(e)f (NUL)150 4287 y(terminated)c(and)f(ha)m(v)m(e)h(exactly)h(length)f Fn(len)p Fv(.)275 4430 y(If)k(option)i(`)p Fr(-c)p Fv(')f(\(or,)i (equiv)-5 b(alen)m(tly)d(,)40 b(the)c(`)p Fr(\045compare-strncmp)p Fv(')c(declaration\))38 b(is)e(used,)h(then)f(the)150 4540 y Fn(str)e Fv(argumen)m(t)29 b(do)s(es)e(not)h(need)g(to)h(b)s(e)e (NUL)h(terminated.)41 b(The)27 b(co)s(de)h(generated)h(b)m(y)f Fr(gperf)f Fv(will)h(only)150 4649 y(access)h(the)f(\014rst)g Fn(len)p Fv(,)g(not)h Fn(len)p Fr(+)p Fn(1)p Fv(,)f(b)m(ytes)h (starting)g(at)f Fn(str)p Fv(.)40 b(Ho)m(w)m(ev)m(er,)31 b(the)d(k)m(eyw)m(ords)g(in)g(the)g(input)f(\014le)150 4759 y(still)k(m)m(ust)g(not)f(con)m(tain)i(NUL)e(b)m(ytes.)275 4902 y(If)35 b(option)i(`)p Fr(-l)p Fv(')f(\(or,)i(equiv)-5 b(alen)m(tly)d(,)40 b(the)c(`)p Fr(\045compare-lengths)p Fv(')c(declaration\))38 b(is)e(used,)h(then)f(the)150 5011 y(hash)c(table)i(p)s(erforms)d(binary)h(comparison.)47 b(The)33 b(k)m(eyw)m(ords)g(in)f(the)h(input)f(\014le)g(ma)m(y)i(con)m (tain)g(NUL)150 5121 y(b)m(ytes,)46 b(written)41 b(in)h(string)g(syn)m (tax)g(as)g Fr(\\000)f Fv(or)h Fr(\\x00)p Fv(,)i(and)d(the)h(co)s(de)g (generated)h(b)m(y)f Fr(gperf)f Fv(will)150 5230 y(treat)i(NUL)e(lik)m (e)i(an)m(y)f(other)g(b)m(yte.)75 b(Also,)45 b(in)c(this)g(case)i(the)f (`)p Fr(-c)p Fv(')f(option)h(\(or,)j(equiv)-5 b(alen)m(tly)d(,)47 b(the)150 5340 y(`)p Fr(\045compare-strncmp)p Fv(')26 b(declaration\))33 b(is)d(ignored.)p eop end %%Page: 23 25 TeXDict begin 23 24 bop 150 -116 a Fv(Chapter)30 b(3:)41 b(High-Lev)m(el)32 b(Description)g(of)e(GNU)h Fr(gperf)1520 b Fv(23)150 299 y Fu(3.4)68 b(Con)l(trolling)47 b(Iden)l(ti\014ers)275 458 y Fv(The)40 b(iden)m(ti\014ers)i(of)f(the)h(functions,)h(tables,)j (and)40 b(constan)m(ts)j(de\014ned)d(b)m(y)h(the)g(co)s(de)h(generated) 150 568 y(b)m(y)f Fr(gperf)f Fv(can)h(b)s(e)g(con)m(trolled)i(through)d Fr(gperf)g Fv(declarations)i(or)f(the)h(equiv)-5 b(alen)m(t)42 b(command-line)150 677 y(options.)f(This)30 b(is)g(useful)g(for)g (three)g(purp)s(oses:)225 805 y Ft(\017)60 b Fv(Esthetics)31 b(of)g(the)f(generated)i(co)s(de.)330 933 y(F)-8 b(or)31 b(this)f(purp)s(ose,)f(just)h(use)g(the)h(a)m(v)-5 b(ailable)32 b(declarations)g(or)f(options)f(at)h(will.)225 1061 y Ft(\017)60 b Fv(Con)m(trolling)32 b(the)e(exp)s(orted)g(iden)m (ti\014ers)h(of)f(a)h(library)-8 b(.)330 1189 y(Assume)29 b(y)m(ou)i(include)e(co)s(de)i(generated)g(b)m(y)e Fr(gperf)g Fv(in)h(a)g(library)-8 b(,)30 b(and)g(to)g(a)m(v)m(oid)i(collisions)f (with)330 1298 y(other)25 b(libraries,)i(y)m(ou)e(w)m(an)m(t)h(to)g (ensure)f(that)g(all)h(exp)s(orted)f(iden)m(ti\014ers)g(of)h(this)f (library)g(start)g(with)330 1408 y(a)31 b(certain)g(pre\014x.)330 1536 y(By)i(default,)g(the)g(only)f(exp)s(orted)g(iden)m(ti\014er)h(is) f(the)h(lo)s(okup)f(function.)46 b(Y)-8 b(ou)33 b(can)f(therefore)h (use)330 1645 y(the)e(option)f(`)p Fr(-N)p Fv(')h(\(or,)g(equiv)-5 b(alen)m(tly)d(,)32 b(the)f(`)p Fr(\045define)e(lookup-function-name)p Fv(')c(declaration\).)330 1773 y(When)k(y)m(ou)g(use)f(the)h(option)g (`)p Fr(-L)h(C++)p Fv(')e(\(or,)i(equiv)-5 b(alen)m(tly)d(,)31 b(the)e(`)p Fr(\045language=C++)p Fv(')d(declaration\),)330 1883 y(the)33 b(only)h(exp)s(orted)e(en)m(tit)m(y)j(is)e(a)h(class.)49 b(Y)-8 b(ou)34 b(con)m(trol)g(its)g(name)f(through)g(the)g(option)g(`)p Fr(-Z)p Fv(')g(\(or,)330 1992 y(equiv)-5 b(alen)m(tly)d(,)33 b(the)d(`)p Fr(\045define)f(class-name)p Fv(')f(declaration\).)225 2120 y Ft(\017)60 b Fv(Allo)m(wing)32 b(m)m(ultiple)f Fr(gperf)e Fv(generated)i(co)s(des)g(in)f(a)g(single)h(compilation)h (unit.)330 2248 y(Assume)24 b(y)m(ou)g(in)m(v)m(ok)m(e)j Fr(gperf)c Fv(m)m(ultiple)i(times,)h(with)e(di\013eren)m(t)h(input)e (\014les,)j(and)e(w)m(an)m(t)h(the)f(gener-)330 2358 y(ated)k(co)s(de)g(to)h(b)s(e)e(included)g(from)g(the)h(same)g(source)g (\014le.)40 b(In)27 b(this)h(case,)h(y)m(ou)f(ha)m(v)m(e)h(to)g (customize)330 2467 y(not)h(only)f(the)h(exp)s(orted)f(iden)m (ti\014ers,)g(but)g(also)h(the)g(names)f(of)h(functions)e(with)h(`)p Fr(static)p Fv(')g(scop)s(e,)330 2577 y(t)m(yp)s(es,)i(and)e(constan)m (ts.)330 2705 y(By)41 b(default,)i(y)m(ou)e(will)g(ha)m(v)m(e)h(to)f (deal)h(with)e(the)h(lo)s(okup)f(function,)j(the)e(hash)e(function,)44 b(and)330 2814 y(the)29 b(constan)m(ts.)42 b(Y)-8 b(ou)29 b(should)f(therefore)i(use)e(the)i(option)f(`)p Fr(-N)p Fv(')g(\(or,)h(equiv)-5 b(alen)m(tly)d(,)31 b(the)f(`)p Fr(\045define)330 2924 y(lookup-function-name)p Fv(')h(declaration\),) 40 b(the)d(option)g(`)p Fr(-H)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)40 b(the)d(`)p Fr(\045define)330 3033 y(hash-function-name)p Fv(')26 b(declaration\),)34 b(and)c(the)h (option)g(`)p Fr(--constants-prefix)p Fv(')c(\(or,)32 b(equiv-)330 3143 y(alen)m(tly)-8 b(,)33 b(the)d(`)p Fr(\045define)f(constants-prefix)p Fv(')d(declaration\).)330 3271 y(If)j(y)m(ou)h(use)f(the)g(option)h(`)p Fr(-G)p Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)32 b(the)e(`)p Fr(\045global-table)p Fv(')c(declaration\),)32 b(y)m(ou)e(will)330 3380 y(also)j(ha)m(v)m(e)h(to)f(deal)f(with)g(the)h(w)m(ord)f(arra)m(y) -8 b(,)34 b(the)e(length)h(table)g(if)f(presen)m(t,)h(and)f(the)g (string)g(p)s(o)s(ol)330 3490 y(if)f(presen)m(t.)41 b(This)30 b(means:)41 b(Y)-8 b(ou)32 b(should)d(use)i(the)g(option)g(`)p Fr(-W)p Fv(')f(\(or,)i(equiv)-5 b(alen)m(tly)d(,)33 b(the)e(`)p Fr(\045define)330 3600 y(word-array-name)p Fv(')47 b(declaration\).)103 b(If)50 b(y)m(ou)g(use)h(the)f(option)h(`)p Fr(-l)p Fv(')g(\(or,)56 b(equiv)-5 b(alen)m(tly)d(,)58 b(the)330 3709 y(`)p Fr (\045compare-lengths)p Fv(')31 b(declaration\),)38 b(y)m(ou)d(should)e (use)i(the)g(option)g(`)p Fr(--length-table-name)p Fv(')330 3819 y(\(or,)58 b(equiv)-5 b(alen)m(tly)d(,)59 b(the)52 b(`)p Fr(\045define)29 b(length-table-name)p Fv(')47 b(declaration\).)108 b(If)51 b(y)m(ou)h(use)g(the)330 3928 y(option)39 b(`)p Fr(-P)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)43 b(the)c(`)p Fr(\045pic)p Fv(')f(declaration\),)k(y) m(ou)d(should)f(use)g(the)h(option)g(`)p Fr(-Q)p Fv(')330 4038 y(\(or,)31 b(equiv)-5 b(alen)m(tly)d(,)33 b(the)d(`)p Fr(\045define)f(string-pool-name)p Fv(')d(declaration\).)150 4265 y Fu(3.5)68 b(The)45 b(Cop)l(yrigh)l(t)h(of)f(the)g(Output)275 4425 y Fr(gperf)24 b Fv(is)i(under)f(GPL,)h(but)f(that)i(do)s(es)e(not) h(cause)h(the)f(output)g(pro)s(duced)e(b)m(y)i Fr(gperf)e Fv(to)j(b)s(e)e(under)150 4534 y(GPL.)35 b(The)f(reason)g(is)h(that)g (the)f(output)g(con)m(tains)i(only)f(small)g(pieces)g(of)f(text)i(that) f(come)g(directly)150 4644 y(from)f Fr(gperf)p Fv('s)f(source)h(co)s (de)h({)g(only)f(ab)s(out)g(7)h(lines)f(long,)i(to)s(o)g(small)e(for)g (b)s(eing)g(signi\014can)m(t)i({,)g(and)150 4754 y(therefore)31 b(the)f(output)g(is)h(not)f(a)h(\\w)m(ork)g(based)f(on)g Fr(gperf)p Fv(")g(\(in)g(the)h(sense)f(of)h(the)f(GPL)h(v)m(ersion)f (3\).)275 4881 y(On)i(the)h(other)h(hand,)f(the)g(output)g(pro)s(duced) f(b)m(y)h Fr(gperf)e Fv(con)m(tains)k(essen)m(tially)g(all)f(of)f(the)h (input)150 4991 y(\014le.)40 b(Therefore)26 b(the)h(output)g(is)g(a)g (\\deriv)-5 b(ativ)m(e)29 b(w)m(ork")e(of)g(the)g(input)f(\(in)h(the)g (sense)g(of)g(U.S.)g(cop)m(yrigh)m(t)150 5101 y(la)m(w\);)42 b(and)37 b(its)h(cop)m(yrigh)m(t)g(status)g(dep)s(ends)e(on)h(the)g (cop)m(yrigh)m(t)i(of)f(the)f(input.)61 b(F)-8 b(or)38 b(most)f(soft)m(w)m(are)150 5210 y(licenses,)i(the)d(result)g(is)g (that)g(the)h(output)e(is)h(under)f(the)h(same)g(license,)j(with)d(the) g(same)h(cop)m(yrigh)m(t)150 5320 y(holder,)30 b(as)h(the)f(input)g (that)h(w)m(as)g(passed)e(to)j Fr(gperf)p Fv(.)p eop end %%Page: 24 26 TeXDict begin 24 25 bop 3659 -116 a Fv(24)150 299 y Fs(4)80 b(In)l(v)l(oking)52 b Fo(gperf)275 580 y Fv(There)35 b(are)i Fm(many)46 b Fv(options)36 b(to)i Fr(gperf)p Fv(.)57 b(They)36 b(w)m(ere)h(added)e(to)j(mak)m(e)f(the)g(program)f (more)g(con-)150 690 y(v)m(enien)m(t)f(for)e(use)g(with)g(real)h (applications.)50 b(\\On-line")34 b(help)f(is)g(readily)h(a)m(v)-5 b(ailable)36 b(via)e(the)f(`)p Fr(--help)p Fv(')150 799 y(option.)41 b(Here)31 b(is)f(the)h(complete)h(list)f(of)f(options.)150 1064 y Fu(4.1)68 b(Sp)t(ecifying)45 b(the)g(Lo)t(cation)h(of)f(the)g (Output)g(File)150 1256 y Fv(`)p Fr(--output-file=)p Fi(file)p Fv(')630 1365 y(Allo)m(ws)31 b(y)m(ou)g(to)g(sp)s(ecify)f (the)h(name)f(of)h(the)f(\014le)h(to)g(whic)m(h)f(the)h(output)f(is)g (written)g(to.)275 1548 y(The)f(results)i(are)f(written)h(to)g (standard)e(output)h(if)h(no)f(output)g(\014le)g(is)h(sp)s(eci\014ed)f (or)g(if)g(it)h(is)g(`)p Fr(-)p Fv('.)150 1813 y Fu(4.2)68 b(Options)45 b(that)h(a\013ect)g(In)l(terpretation)h(of)e(the)g(Input)g (File)275 1972 y Fv(These)d(options)h(are)g(also)g(a)m(v)-5 b(ailable)45 b(as)e(declarations)h(in)e(the)h(input)f(\014le)g(\(see)i (Section)f(3.1.1.2)150 2082 y([Gp)s(erf)30 b(Declarations],)j(page)e (16\).)150 2265 y(`)p Fr(-e)f Fi(keyword-delimiter-list)p Fv(')150 2374 y(`)p Fr(--delimiters=)p Fi(keyword-deli)o(mite)o(r-li)o (st)p Fv(')630 2484 y(Allo)m(ws)g(y)m(ou)f(to)g(pro)m(vide)g(a)g (string)g(con)m(taining)h(delimiters)g(used)d(to)j(separate)g(k)m(eyw)m (ords)630 2593 y(from)k(their)h(attributes.)54 b(The)34 b(default)g(is)h Fr(")p Fv(,)p Fr(")p Fv(.)53 b(This)34 b(option)h(is)f(essen)m(tial)j(if)d(y)m(ou)h(w)m(an)m(t)630 2703 y(to)f(use)e(k)m(eyw)m(ords)h(that)h(ha)m(v)m(e)g(em)m(b)s(edded)e (commas)h(or)g(newlines.)48 b(One)33 b(useful)f(tric)m(k)i(is)630 2813 y(to)d(use)f(-e'T)-8 b(AB',)33 b(where)c(T)-8 b(AB)31 b(is)g(the)f(literal)i(tab)f(c)m(haracter.)150 2988 y(`)p Fr(-t)p Fv(')150 3097 y(`)p Fr(--struct-type)p Fv(')630 3207 y(Allo)m(ws)h(y)m(ou)g(to)g(include)f(a)g Fr(struct)f Fv(t)m(yp)s(e)h(declaration)i(for)e(generated)h(co)s(de.)44 b(An)m(y)31 b(text)630 3316 y(b)s(efore)43 b(a)i(pair)e(of)h (consecutiv)m(e)i(`)p Fr(\045\045)p Fv(')d(is)h(considered)g(part)f(of) h(the)g(t)m(yp)s(e)g(declaration.)630 3426 y(Keyw)m(ords)39 b(and)g(additional)h(\014elds)f(ma)m(y)i(follo)m(w)f(this,)i(one)e (group)f(of)h(\014elds)f(p)s(er)f(line.)630 3536 y(A)31 b(set)g(of)g(examples)g(for)f(generating)i(p)s(erfect)e(hash)g(tables)i (and)e(functions)g(for)g(Ada,)h(C,)630 3645 y(C)p Fr(++)p Fv(,)24 b(P)m(ascal,)j(Mo)s(dula)c(2,)j(Mo)s(dula)d(3)h(and)f(Ja)m(v)-5 b(aScript)24 b(reserv)m(ed)f(w)m(ords)g(are)h(distributed)630 3755 y(with)30 b(this)g(release.)150 3930 y(`)p Fr(--ignore-case)p Fv(')630 4040 y(Consider)43 b(upp)s(er)f(and)i(lo)m(w)m(er)h(case)g (ASCI)s(I)e(c)m(haracters)i(as)f(equiv)-5 b(alen)m(t.)83 b(The)44 b(string)630 4149 y(comparison)28 b(will)h(use)f(a)h(case)g (insigni\014can)m(t)g(c)m(haracter)h(comparison.)40 b(Note)29 b(that)g(lo)s(cale)630 4259 y(dep)s(enden)m(t)e(case)i(mappings)f(are)g (ignored.)40 b(This)28 b(option)g(is)h(therefore)f(not)h(suitable)f(if) h(a)630 4368 y(prop)s(erly)k(in)m(ternationalized)k(or)d(lo)s(cale)i(a) m(w)m(are)g(case)f(mapping)f(should)f(b)s(e)h(used.)52 b(\(F)-8 b(or)630 4478 y(example,)31 b(in)e(a)g(T)-8 b(urkish)29 b(lo)s(cale,)i(the)f(upp)s(er)d(case)k(equiv)-5 b(alen)m(t)30 b(of)g(the)g(lo)m(w)m(ercase)h(ASCI)s(I)630 4587 y(letter)42 b(`)p Fr(i)p Fv(')g(is)f(the)g(non-ASCI)s(I)e(c)m (haracter)k(`)p Fr(capital)29 b(i)h(with)f(dot)g(above)p Fv('.\))72 b(F)-8 b(or)42 b(this)630 4697 y(case,)d(it)d(is)g(b)s (etter)h(to)f(apply)g(an)g(upp)s(ercase)f(or)h(lo)m(w)m(ercase)i(con)m (v)m(ersion)g(on)e(the)g(string)630 4807 y(b)s(efore)30 b(passing)g(it)h(to)g(the)g Fr(gperf)e Fv(generated)i(function.)150 5071 y Fu(4.3)68 b(Options)45 b(to)h(sp)t(ecify)f(the)g(Language)h(for) f(the)g(Output)f(Co)t(de)275 5230 y Fv(These)e(options)h(are)g(also)g (a)m(v)-5 b(ailable)45 b(as)e(declarations)h(in)e(the)h(input)f(\014le) g(\(see)i(Section)f(3.1.1.2)150 5340 y([Gp)s(erf)30 b(Declarations],)j (page)e(16\).)p eop end %%Page: 25 27 TeXDict begin 25 26 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(25)150 299 y(`)p Fr(-L)30 b Fi(generated-language-name)p Fv(')150 408 y(`)p Fr(--language=)p Fi(generated-lang)o(uage)o(-nam)o(e)p Fv(')630 518 y(Instructs)j Fr(gperf)f Fv(to)i(generate)h(co)s(de)f(in)f (the)h(language)h(sp)s(eci\014ed)d(b)m(y)i(the)g(option's)g(ar-)630 628 y(gumen)m(t.)41 b(Languages)31 b(handled)f(are)h(curren)m(tly:)630 804 y(`)p Fr(KR-C)p Fv(')238 b(Old-st)m(yle)27 b(K&R)f(C.)g(This)f (language)j(is)f(understo)s(o)s(d)d(b)m(y)i(old-st)m(yle)i(C)e(com-) 1110 913 y(pilers)e(and)g(ANSI)f(C)h(compilers,)i(but)e(ANSI)f(C)h (compilers)h(ma)m(y)f(\015ag)h(w)m(arn-)1110 1023 y(ings)30 b(\(or)h(ev)m(en)g(errors\))f(b)s(ecause)h(of)f(lac)m(king)i(`)p Fr(const)p Fv('.)630 1199 y(`)p Fr(C)p Fv(')382 b(Common)23 b(C.)f(This)h(language)h(is)f(understo)s(o)s(d)e(b)m(y)i(ANSI)g(C)f (compilers,)k(and)1110 1308 y(also)k(b)m(y)e(old-st)m(yle)i(C)f (compilers,)g(pro)m(vided)f(that)i(y)m(ou)f Fr(#define)f(const)f Fv(to)1110 1418 y(empt)m(y)k(for)f(compilers)h(whic)m(h)f(don't)g(kno)m (w)h(ab)s(out)f(this)g(k)m(eyw)m(ord.)630 1594 y(`)p Fr(ANSI-C)p Fv(')142 b(ANSI)39 b(C.)h(This)e(language)j(is)f(understo)s (o)s(d)e(b)m(y)h(ANSI)g(C)h(compilers)g(and)1110 1703 y(C)p Fr(++)29 b Fv(compilers.)630 1879 y(`)p Fr(C++)p Fv(')286 b(C)p Fr(++)p Fv(.)40 b(This)29 b(language)j(is)f(understo)s (o)s(d)d(b)m(y)i(C)p Fr(++)g Fv(compilers.)630 2055 y(The)g(default)g (is)h(ANSI-C.)150 2231 y(`)p Fr(-a)p Fv(')334 b(This)33 b(option)h(is)f(supp)s(orted)f(for)h(compatibilit)m(y)j(with)d (previous)g(releases)i(of)f Fr(gperf)p Fv(.)49 b(It)630 2340 y(do)s(es)30 b(not)h(do)f(an)m(ything.)150 2516 y(`)p Fr(-g)p Fv(')334 b(This)33 b(option)h(is)f(supp)s(orted)f(for)h (compatibilit)m(y)j(with)d(previous)g(releases)i(of)f Fr(gperf)p Fv(.)49 b(It)630 2626 y(do)s(es)30 b(not)h(do)f(an)m (ything.)150 2891 y Fu(4.4)68 b(Options)45 b(for)g(\014ne)g(tuning)g (Details)i(in)e(the)g(Output)f(Co)t(de)275 3051 y Fv(Most)21 b(of)g(these)g(options)g(are)g(also)h(a)m(v)-5 b(ailable)23 b(as)e(declarations)h(in)f(the)g(input)e(\014le)i(\(see)h(Section)f (3.1.1.2)150 3160 y([Gp)s(erf)30 b(Declarations],)j(page)e(16\).)150 3344 y(`)p Fr(-K)f Fi(slot-name)p Fv(')150 3454 y(`)p Fr(--slot-name=)p Fi(slot-name)p Fv(')630 3564 y(This)21 b(option)h(is)g(only)f(useful)g(when)g(option)h(`)p Fr(-t)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)26 b(the)c(`)p Fr(\045struct-type)p Fv(')630 3673 y(declaration\))41 b(has)e(b)s(een)f(giv)m(en.)67 b(By)39 b(default,)j(the)d(program)g (assumes)f(the)h(structure)630 3783 y(comp)s(onen)m(t)28 b(iden)m(ti\014er)h(for)f(the)g(k)m(eyw)m(ord)g(is)h(`)p Fr(name)p Fv('.)39 b(This)27 b(option)i(allo)m(ws)g(an)f(arbitrary)630 3892 y(c)m(hoice)33 b(of)f(iden)m(ti\014er)g(for)f(this)h(comp)s(onen)m (t,)g(although)g(it)g(still)g(m)m(ust)g(o)s(ccur)f(as)h(the)g(\014rst) 630 4002 y(\014eld)e(in)g(y)m(our)g(supplied)f Fr(struct)p Fv(.)150 4178 y(`)p Fr(-F)h Fi(initializers)p Fv(')150 4287 y(`)p Fr(--initializer-suffix=)p Fi(init)o(iali)o(zers)o Fv(')630 4397 y(This)21 b(option)h(is)g(only)f(useful)g(when)g(option)h (`)p Fr(-t)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)26 b(the)c(`)p Fr(\045struct-type)p Fv(')630 4507 y(declaration\))34 b(has)f(b)s(een)e(giv)m(en.)49 b(It)32 b(p)s(ermits)g(to)h(sp)s(ecify)f (initializers)i(for)f(the)f(structure)630 4616 y(mem)m(b)s(ers)23 b(follo)m(wing)i Fn(slot-name)30 b Fv(in)23 b(empt)m(y)h(hash)f(table)h (en)m(tries.)39 b(The)23 b(list)h(of)g(initializers)630 4726 y(should)37 b(start)i(with)g(a)f(comma.)66 b(By)39 b(default,)i(the)e(emitted)g(co)s(de)g(will)f(zero-initialize)630 4835 y(structure)30 b(mem)m(b)s(ers)f(follo)m(wing)j Fn(slot-name)p Fv(.)150 5011 y(`)p Fr(-H)e Fi(hash-function-name)p Fv(')150 5121 y(`)p Fr(--hash-function-name=)p Fi(hash)o(-fun)o(ctio)o (n-n)o(ame)p Fv(')630 5230 y(Allo)m(ws)h(y)m(ou)f(to)g(sp)s(ecify)g (the)g(name)g(for)f(the)h(generated)h(hash)e(function.)40 b(Default)31 b(name)630 5340 y(is)f(`)p Fr(hash)p Fv('.)40 b(This)30 b(option)h(p)s(ermits)e(the)i(use)f(of)h(t)m(w)m(o)g(hash)f (tables)h(in)f(the)h(same)g(\014le.)p eop end %%Page: 26 28 TeXDict begin 26 27 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(26)150 299 y(`)p Fr(-N)30 b Fi(lookup-function-name)p Fv(')150 408 y(`)p Fr(--lookup-function-name=)p Fi(lo)o(okup)o(-fun)o(cti)o(on-n)o(ame)p Fv(')630 518 y(Allo)m(ws)43 b(y)m(ou)f(to)h(sp)s(ecify)e(the)i(name)f (for)f(the)h(generated)h(lo)s(okup)f(function.)75 b(Default)630 628 y(name)28 b(is)g(`)p Fr(in_word_set)p Fv('.)37 b(This)27 b(option)h(p)s(ermits)f(m)m(ultiple)i(generated)f(hash)f(functions)630 737 y(to)k(b)s(e)f(used)f(in)h(the)h(same)g(application.)150 938 y(`)p Fr(-Z)f Fi(class-name)p Fv(')150 1048 y(`)p Fr(--class-name=)p Fi(class-name)p Fv(')630 1157 y(This)66 b(option)i(is)f(only)h(useful)e(when)h(option)g(`)p Fr(-L)30 b(C++)p Fv(')67 b(\(or,)77 b(equiv)-5 b(alen)m(tly)d(,)79 b(the)630 1267 y(`)p Fr(\045language=C++)p Fv(')43 b(declaration\))k (has)f(b)s(een)f(giv)m(en.)88 b(It)46 b(allo)m(ws)h(y)m(ou)f(to)g(sp)s (ecify)g(the)630 1377 y(name)30 b(of)h(generated)g(C)p Fr(++)f Fv(class.)41 b(Default)32 b(name)e(is)h Fr(Perfect_Hash)p Fv(.)150 1577 y(`)p Fr(-7)p Fv(')150 1687 y(`)p Fr(--seven-bit)p Fv(')630 1797 y(This)36 b(option)i(sp)s(eci\014es)f(that)g(all)h (strings)f(that)h(will)f(b)s(e)g(passed)f(as)i(argumen)m(ts)f(to)h(the) 630 1906 y(generated)e(hash)e(function)g(and)h(the)g(generated)g(lo)s (okup)g(function)f(will)h(solely)h(consist)630 2016 y(of)d(7-bit)h (ASCI)s(I)e(c)m(haracters)j(\(b)m(ytes)f(in)f(the)g(range)h(0..127\).) 51 b(\(Note)35 b(that)f(the)g(ANSI)e(C)630 2125 y(functions)f Fr(isalnum)f Fv(and)i Fr(isgraph)e Fv(do)i Fm(not)41 b Fv(guaran)m(tee)33 b(that)g(a)f(b)m(yte)h(is)f(in)f(this)h(range.)630 2235 y(Only)26 b(an)g(explicit)i(test)g(lik)m(e)f(`)p Fr(c)k(>=)f(\015A\015)f(&&)h(c)g(<=)g(\015Z\015)p Fv(')25 b(guaran)m(tees)j(this.\))40 b(This)26 b(w)m(as)h(the)630 2345 y(default)g(in)g(v)m(ersions)g(of)g Fr(gperf)e Fv(earlier)j(than)e (2.7;)k(no)m(w)d(the)g(default)g(is)f(to)i(supp)s(ort)d(8-bit)630 2454 y(and)30 b(m)m(ultib)m(yte)h(c)m(haracters.)150 2655 y(`)p Fr(-l)p Fv(')150 2765 y(`)p Fr(--compare-lengths)p Fv(')630 2874 y(Compare)40 b(k)m(eyw)m(ord)g(lengths)g(b)s(efore)f (trying)h(a)h(string)e(comparison.)70 b(This)39 b(option)h(is)630 2984 y(mandatory)32 b(for)h(binary)e(comparisons)i(\(see)g(Section)h (3.3)f([Binary)g(Strings],)g(page)g(22\).)630 3093 y(It)g(also)h(migh)m (t)g(cut)f(do)m(wn)f(on)h(the)g(n)m(um)m(b)s(er)f(of)h(string)g (comparisons)g(made)g(during)f(the)630 3203 y(lo)s(okup,)i(since)g(k)m (eyw)m(ords)f(with)g(di\013eren)m(t)h(lengths)g(are)f(nev)m(er)h (compared)f(via)h Fr(strcmp)p Fv(.)630 3313 y(Ho)m(w)m(ev)m(er,)j (using)c(`)p Fr(-l)p Fv(')g(migh)m(t)h(greatly)h(increase)g(the)f(size) g(of)g(the)f(generated)i(C)e(co)s(de)h(if)630 3422 y(the)k(lo)s(okup)g (table)g(range)h(is)f(large)h(\(whic)m(h)f(implies)g(that)g(the)g (switc)m(h)h(option)f(`)p Fr(-S)p Fv(')g(or)630 3532 y(`)p Fr(\045switch)p Fv(')29 b(is)i(not)g(enabled\),)h(since)f(the)g (length)g(table)h(con)m(tains)g(as)f(man)m(y)g(elemen)m(ts)h(as)630 3641 y(there)f(are)f(en)m(tries)i(in)e(the)g(lo)s(okup)g(table.)150 3842 y(`)p Fr(-c)p Fv(')150 3952 y(`)p Fr(--compare-strncmp)p Fv(')630 4061 y(Generates)22 b(C)f(co)s(de)g(that)h(uses)e(the)i Fr(strncmp)d Fv(function)h(to)i(p)s(erform)e(string)h(comparisons.)630 4171 y(The)30 b(default)g(action)i(is)f(to)g(use)f Fr(strcmp)p Fv(.)150 4372 y(`)p Fr(-C)p Fv(')150 4482 y(`)p Fr(--readonly-tables)p Fv(')630 4591 y(Mak)m(es)41 b(the)f(con)m(ten)m(ts)h(of)f(all)h (generated)f(lo)s(okup)f(tables)i(constan)m(t,)i(i.e.,)h(\\readonly".) 630 4701 y(Man)m(y)31 b(compilers)g(can)g(generate)h(more)e(e\016cien)m (t)i(co)s(de)f(for)f(this)h(b)m(y)f(putting)g(the)h(tables)630 4810 y(in)f(readonly)h(memory)-8 b(.)150 5011 y(`)p Fr(-E)p Fv(')150 5121 y(`)p Fr(--enum)p Fv(')142 b(De\014ne)31 b(constan)m(t)g(v)-5 b(alues)31 b(using)f(an)g(en)m(um)g(lo)s(cal)i(to) f(the)g(lo)s(okup)f(function)g(rather)g(than)630 5230 y(with)37 b(#de\014nes.)60 b(This)36 b(also)i(means)g(that)f (di\013eren)m(t)h(lo)s(okup)f(functions)g(can)g(reside)g(in)630 5340 y(the)31 b(same)f(\014le.)41 b(Thanks)29 b(to)j(James)e(Clark)g Fr()p Fv(.)p eop end %%Page: 27 29 TeXDict begin 27 28 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(27)150 299 y(`)p Fr(-I)p Fv(')150 408 y(`)p Fr(--includes)p Fv(')630 518 y(Include)30 b(the)h(necessary)h(system)f(include)g(\014le,)g Fr()p Fv(,)e(at)i(the)g(b)s(eginning)g(of)g(the)630 628 y(co)s(de.)39 b(By)27 b(default,)g(this)f(is)g(not)g(done;)i(the)e (user)f(m)m(ust)h(include)g(this)f(header)h(\014le)g(himself)630 737 y(to)31 b(allo)m(w)h(compilation)g(of)e(the)h(co)s(de.)150 894 y(`)p Fr(-G)p Fv(')150 1003 y(`)p Fr(--global-table)p Fv(')630 1113 y(Generate)38 b(the)f(static)h(table)f(of)g(k)m(eyw)m (ords)g(as)g(a)g(static)h(global)g(v)-5 b(ariable,)39 b(rather)d(than)630 1223 y(hiding)30 b(it)h(inside)f(of)g(the)h(lo)s (okup)f(function)g(\(whic)m(h)g(is)h(the)f(default)h(b)s(eha)m(vior\).) 150 1379 y(`)p Fr(-P)p Fv(')150 1489 y(`)p Fr(--pic)p Fv(')190 b(Optimize)42 b(the)f(generated)h(table)g(for)f(inclusion)g (in)g(shared)f(libraries.)73 b(This)40 b(reduces)630 1598 y(the)35 b(startup)g(time)h(of)f(programs)g(using)g(a)h(shared)e (library)h(con)m(taining)i(the)e(generated)630 1708 y(co)s(de.)j(If)21 b(the)h(option)h(`)p Fr(-t)p Fv(')e(\(or,)k(equiv)-5 b(alen)m(tly)d(,)25 b(the)d(`)p Fr(\045struct-type)p Fv(')d(declaration\))24 b(is)e(also)630 1817 y(giv)m(en,)32 b(the)f(\014rst)e(\014eld)i(of)f(the)h(user-de\014ned)e(struct)i(m)m (ust)f(b)s(e)g(of)h(t)m(yp)s(e)g(`)p Fr(int)p Fv(',)f(not)h(`)p Fr(char)630 1927 y(*)p Fv(',)h(b)s(ecause)f(it)i(will)e(con)m(tain)i (o\013sets)g(in)m(to)f(the)g(string)f(p)s(o)s(ol)h(instead)f(of)h (actual)h(strings.)630 2037 y(T)-8 b(o)33 b(con)m(v)m(ert)h(suc)m(h)f (an)f(o\013set)i(to)f(a)g(string,)h(y)m(ou)f(can)g(use)f(the)h (expression)f(`)p Fr(stringpool)630 2146 y(+)e Fi(o)p Fv(',)k(where)f Fn(o)38 b Fv(is)33 b(the)g(o\013set.)51 b(The)32 b(string)h(p)s(o)s(ol)g(name)g(can)h(b)s(e)e(c)m(hanged)i (through)f(the)630 2256 y(option)e(`)p Fr(--string-pool-name)p Fv('.)150 2412 y(`)p Fr(-Q)f Fi(string-pool-name)p Fv(')150 2522 y(`)p Fr(--string-pool-name=)p Fi(string)o(-poo)o(l-na)o(me)p Fv(')630 2632 y(Allo)m(ws)i(y)m(ou)g(to)g(sp)s(ecify)f(the)g(name)h(of) f(the)h(generated)g(string)f(p)s(o)s(ol)g(created)h(b)m(y)f(option)630 2741 y(`)p Fr(-P)p Fv('.)38 b(The)21 b(default)g(name)h(is)f(`)p Fr(stringpool)p Fv('.)36 b(This)20 b(option)i(p)s(ermits)f(the)g(use)g (of)h(t)m(w)m(o)h(hash)630 2851 y(tables)i(in)e(the)h(same)g(\014le,)i (with)d(`)p Fr(-P)p Fv(')h(and)f(ev)m(en)h(when)f(the)h(option)g(`)p Fr(-G)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)630 2960 y(the)31 b(`)p Fr(\045global-table)p Fv(')c(declaration\))32 b(is)f(giv)m(en.)150 3117 y(`)p Fr(--null-strings)p Fv(')630 3226 y(Use)39 b(NULL)g(strings)f(instead)i(of)e(empt)m(y)i(strings)e (for)h(empt)m(y)g(k)m(eyw)m(ord)g(table)h(en)m(tries.)630 3336 y(This)e(reduces)g(the)h(startup)g(time)g(of)g(programs)g(using)f (a)h(shared)f(library)g(con)m(taining)630 3446 y(the)j(generated)g(co)s (de)g(\(but)f(not)h(as)f(m)m(uc)m(h)h(as)g(option)g(`)p Fr(-P)p Fv('\),)i(at)e(the)g(exp)s(ense)f(of)h(one)630 3555 y(more)31 b(test-and-branc)m(h)f(instruction)h(at)g(run)e(time.) 150 3712 y(`)p Fr(--constants-prefix=)p Fi(prefix)o Fv(')630 3821 y(Allo)m(ws)37 b(y)m(ou)g(to)g(sp)s(ecify)f(a)g(pre\014x)g(for)g (the)g(constan)m(ts)h Fr(TOTAL_KEYWORDS)p Fv(,)d Fr(MIN_WORD_)630 3931 y(LENGTH)p Fv(,)45 b Fr(MAX_WORD_LENGTH)p Fv(,)e(and)g(so)g(on.)80 b(This)43 b(option)h(p)s(ermits)e(the)i(use)f(of)h(t)m(w)m(o)630 4041 y(hash)50 b(tables)i(in)f(the)g(same)g(\014le,)57 b(ev)m(en)51 b(when)f(the)i(option)f(`)p Fr(-E)p Fv(')g(\(or,)57 b(equiv)-5 b(alen)m(tly)d(,)630 4150 y(the)39 b(`)p Fr(\045enum)p Fv(')e(declaration\))j(is)f(not)f(giv)m(en)i(or)e(the)h(option)g(`)p Fr(-G)p Fv(')f(\(or,)j(equiv)-5 b(alen)m(tly)d(,)43 b(the)630 4260 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 4416 y(`)p Fr(-W)g Fi(hash-table-array-name)p Fv(')150 4526 y(`)p Fr(--word-array-name=)p Fi(hash-ta)o(ble-)o(arra)o (y-n)o(ame)p Fv(')630 4635 y(Allo)m(ws)41 b(y)m(ou)f(to)h(sp)s(ecify)f (the)g(name)g(for)f(the)i(generated)g(arra)m(y)f(con)m(taining)i(the)e (hash)630 4745 y(table.)106 b(Default)53 b(name)e(is)h(`)p Fr(wordlist)p Fv('.)103 b(This)51 b(option)h(p)s(ermits)f(the)h(use)g (of)g(t)m(w)m(o)630 4855 y(hash)37 b(tables)h(in)g(the)g(same)g (\014le,)i(ev)m(en)e(when)f(the)h(option)g(`)p Fr(-G)p Fv(')g(\(or,)i(equiv)-5 b(alen)m(tly)d(,)42 b(the)630 4964 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 5121 y(`)p Fr(--length-table-name=)p Fi(lengt)o(h-ta)o(ble-)o(arr)o(ay-n)o(ame)p Fv(')630 5230 y(Allo)m(ws)36 b(y)m(ou)e(to)i(sp)s(ecify)e(the)h(name)f(for)g (the)h(generated)h(arra)m(y)f(con)m(taining)h(the)f(length)630 5340 y(table.)77 b(Default)43 b(name)g(is)f(`)p Fr(lengthtable)p Fv('.)74 b(This)41 b(option)i(p)s(ermits)e(the)h(use)g(of)h(t)m(w)m(o)p eop end %%Page: 28 30 TeXDict begin 28 29 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(28)630 299 y(length)33 b(tables)h(in)f(the)g(same)g(\014le,)h(ev)m(en)g(when)e(the)h(option)h (`)p Fr(-G)p Fv(')f(\(or,)h(equiv)-5 b(alen)m(tly)d(,)36 b(the)630 408 y(`)p Fr(\045global-table)p Fv(')27 b(declaration\))33 b(is)d(giv)m(en.)150 565 y(`)p Fr(-S)g Fi(total-switch-statements)p Fv(')150 675 y(`)p Fr(--switch=)p Fi(total-switch-sta)o(teme)o(nts)p Fv(')630 784 y(Causes)35 b(the)h(generated)h(C)e(co)s(de)h(to)h(use)e (a)h Fr(switch)e Fv(statemen)m(t)k(sc)m(heme,)g(rather)d(than)630 894 y(an)j(arra)m(y)g(lo)s(okup)g(table.)64 b(This)37 b(can)h(lead)h(to)f(a)h(reduction)f(in)f(b)s(oth)g(time)i(and)e(space) 630 1004 y(requiremen)m(ts)43 b(for)h(some)f(input)g(\014les.)80 b(The)43 b(argumen)m(t)h(to)g(this)f(option)h(determines)630 1113 y(ho)m(w)33 b(man)m(y)f Fr(switch)f Fv(statemen)m(ts)k(are)e (generated.)49 b(A)32 b(v)-5 b(alue)34 b(of)e(1)i(generates)g(1)f Fr(switch)630 1223 y Fv(con)m(taining)25 b(all)e(the)h(elemen)m(ts,)i (a)d(v)-5 b(alue)23 b(of)h(2)f(generates)h(2)g(tables)f(with)g(1/2)h (the)g(elemen)m(ts)630 1332 y(in)38 b(eac)m(h)h Fr(switch)p Fv(,)g(etc.)65 b(This)37 b(is)h(useful)g(since)g(man)m(y)h(C)e (compilers)i(cannot)g(correctly)630 1442 y(generate)29 b(co)s(de)f(for)f(large)h Fr(switch)e Fv(statemen)m(ts.)41 b(This)27 b(option)h(w)m(as)g(inspired)e(in)h(part)g(b)m(y)630 1552 y(Keith)k(Bostic's)h(original)f(C)f(program.)150 1708 y(`)p Fr(-T)p Fv(')150 1818 y(`)p Fr(--omit-struct-type)p Fv(')630 1928 y(Prev)m(en)m(ts)f(the)e(transfer)h(of)f(the)h(t)m(yp)s (e)g(declaration)h(to)g(the)f(output)f(\014le.)40 b(Use)28 b(this)f(option)630 2037 y(if)j(the)h(t)m(yp)s(e)f(is)h(already)g (de\014ned)e(elsewhere.)150 2194 y(`)p Fr(-p)p Fv(')334 b(This)33 b(option)h(is)f(supp)s(orted)f(for)h(compatibilit)m(y)j(with) d(previous)g(releases)i(of)f Fr(gperf)p Fv(.)49 b(It)630 2304 y(do)s(es)30 b(not)h(do)f(an)m(ything.)150 2542 y Fu(4.5)68 b(Options)45 b(for)g(c)l(hanging)h(the)f(Algorithms)h (emplo)l(y)l(ed)g(b)l(y)f Fl(gperf)150 2725 y Fv(`)p Fr(-k)30 b Fi(selected-byte-positions)p Fv(')150 2834 y(`)p Fr(--key-positions=)p Fi(selected-)o(byte)o(-pos)o(iti)o(ons)p Fv(')630 2944 y(Allo)m(ws)e(selection)h(of)e(the)g(b)m(yte)h(p)s (ositions)f(used)f(in)h(the)g(k)m(eyw)m(ords')h(hash)e(function.)39 b(The)630 3054 y(allo)m(w)m(able)24 b(c)m(hoices)g(range)e(b)s(et)m(w)m (een)h(1-255,)j(inclusiv)m(e.)38 b(The)22 b(p)s(ositions)f(are)i (separated)f(b)m(y)630 3163 y(commas,)27 b(e.g.,)i(`)p Fr(-k)h(9,4,13,14)p Fv(';)25 b(ranges)h(ma)m(y)g(b)s(e)f(used,)h(e.g.,) i(`)p Fr(-k)i(2-7)p Fv(';)d(and)e(p)s(ositions)630 3273 y(ma)m(y)c(o)s(ccur)f(in)h(an)m(y)g(order.)37 b(F)-8 b(urthermore,)22 b(the)f(wildcard)f('*')h(causes)g(the)g(generated)h (hash)630 3382 y(function)37 b(to)h(consider)g Fe(all)g Fv(b)m(yte)g(p)s(ositions)f(in)g(eac)m(h)i(k)m(eyw)m(ord,)h(whereas)d ('$')h(instructs)630 3492 y(the)31 b(hash)g(function)f(to)i(use)f(the)g (\\\014nal)h(b)m(yte")g(of)f(a)h(k)m(eyw)m(ord)f(\(this)g(is)h(the)f (only)g(w)m(a)m(y)h(to)630 3602 y(use)e(a)h(b)m(yte)g(p)s(osition)f (greater)i(than)e(255,)i(inciden)m(tally\).)630 3735 y(F)-8 b(or)37 b(instance,)h(the)e(option)h(`)p Fr(-k)30 b(1,2,4,6-10,\015$\015)p Fv(')i(generates)38 b(a)e(hash)g(function)f (that)630 3844 y(considers)g(p)s(ositions)g(1,2,4,6,7,8,9,10,)42 b(plus)34 b(the)i(last)g(b)m(yte)f(in)g(eac)m(h)h(k)m(eyw)m(ord)g (\(whic)m(h)630 3954 y(ma)m(y)j(b)s(e)f(at)i(a)f(di\013eren)m(t)g(p)s (osition)g(for)f(eac)m(h)i(k)m(eyw)m(ord,)h(ob)m(viously\).)67 b(Keyw)m(ords)38 b(with)630 4064 y(length)30 b(less)g(than)f(the)g (indicated)h(b)m(yte)h(p)s(ositions)e(w)m(ork)g(prop)s(erly)-8 b(,)30 b(since)f(selected)i(b)m(yte)630 4173 y(p)s(ositions)k (exceeding)h(the)g(k)m(eyw)m(ord)f(length)g(are)h(simply)e(not)i (referenced)f(in)f(the)i(hash)630 4283 y(function.)630 4416 y(This)28 b(option)i(is)f(not)g(normally)g(needed)g(since)g(v)m (ersion)g(2.8)i(of)e Fr(gperf)p Fv(;)f(the)h(default)g(b)m(yte)630 4526 y(p)s(ositions)36 b(are)g(computed)f(dep)s(ending)f(on)i(the)f(k)m (eyw)m(ord)h(set,)i(through)d(a)h(searc)m(h)g(that)630 4635 y(minimizes)31 b(the)f(n)m(um)m(b)s(er)f(of)i(b)m(yte)g(p)s (ositions.)150 4792 y(`)p Fr(-D)p Fv(')150 4902 y(`)p Fr(--duplicates)p Fv(')630 5011 y(Handle)h(k)m(eyw)m(ords)h(whose)f (selected)i(b)m(yte)e(sets)h(hash)e(to)i(duplicate)g(v)-5 b(alues.)46 b(Duplicate)630 5121 y(hash)33 b(v)-5 b(alues)34 b(can)h(o)s(ccur)e(if)h(a)g(set)h(of)f(k)m(eyw)m(ords)g(has)g(the)g (same)g(names,)h(but)e(p)s(ossesses)630 5230 y(di\013eren)m(t)f (attributes,)g(or)f(if)h(the)f(selected)i(b)m(yte)f(p)s(ositions)f(are) h(not)f(w)m(ell)h(c)m(hosen.)44 b(With)630 5340 y(the)36 b(-D)g(option)g Fr(gperf)e Fv(treats)j(all)f(these)h(k)m(eyw)m(ords)e (as)h(part)g(of)g(an)f(equiv)-5 b(alence)37 b(class)p eop end %%Page: 29 31 TeXDict begin 29 30 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(29)630 299 y(and)31 b(generates)i(a)f(p)s(erfect)g(hash)f(function)g(with)h(m)m(ultiple)g (comparisons)g(for)f(duplicate)630 408 y(k)m(eyw)m(ords.)38 b(It)21 b(is)f(up)g(to)h(y)m(ou)g(to)h(completely)g(disam)m(biguate)g (the)f(k)m(eyw)m(ords)g(b)m(y)g(mo)s(difying)630 518 y(the)28 b(generated)g(C)f(co)s(de.)40 b(Ho)m(w)m(ev)m(er,)30 b Fr(gperf)c Fv(helps)h(y)m(ou)g(out)h(b)m(y)f(organizing)i(the)e (output.)630 653 y(Using)32 b(this)g(option)g(usually)g(means)g(that)g (the)g(generated)h(hash)e(function)h(is)g(no)f(longer)630 763 y(p)s(erfect.)48 b(On)31 b(the)i(other)g(hand,)g(it)g(p)s(ermits)f Fr(gperf)f Fv(to)i(w)m(ork)g(on)g(k)m(eyw)m(ord)g(sets)g(that)g(it)630 872 y(otherwise)e(could)f(not)h(handle.)150 1032 y(`)p Fr(-m)f Fi(iterations)p Fv(')150 1142 y(`)p Fr(--multiple-iterations=)p Fi(ite)o(rati)o(ons)p Fv(')630 1251 y(P)m(erform)24 b(m)m(ultiple)h(c)m (hoices)h(of)e(the)h(`)p Fr(-i)p Fv(')f(and)g(`)p Fr(-j)p Fv(')g(v)-5 b(alues,)26 b(and)d(c)m(ho)s(ose)j(the)e(b)s(est)g (results.)630 1361 y(This)34 b(increases)i(the)f(running)e(time)i(b)m (y)g(a)g(factor)h(of)f Fn(iterations)40 b Fv(but)34 b(do)s(es)g(a)i(go) s(o)s(d)e(job)630 1471 y(minimizing)d(the)f(generated)i(table)f(size.) 150 1631 y(`)p Fr(-i)f Fi(initial-value)p Fv(')150 1740 y(`)p Fr(--initial-asso=)p Fi(initial-va)o(lue)p Fv(')630 1850 y(Pro)m(vides)f(an)f(initial)h Fn(v)-5 b(alue)34 b Fv(for)28 b(the)g(asso)s(ciate)i(v)-5 b(alues)29 b(arra)m(y)-8 b(.)41 b(Default)29 b(is)f(0.)41 b(Increasing)630 1960 y(the)30 b(initial)h(v)-5 b(alue)31 b(helps)e(in\015ate)h(the)g (\014nal)g(table)h(size,)g(p)s(ossibly)e(leading)i(to)f(more)g(time)630 2069 y(e\016cien)m(t)f(k)m(eyw)m(ord)e(lo)s(okups.)39 b(Note)29 b(that)e(this)g(option)h(is)f(not)g(particularly)h(useful)e (when)630 2179 y(`)p Fr(-S)p Fv(')i(\(or,)i(equiv)-5 b(alen)m(tly)d(,)31 b(`)p Fr(\045switch)p Fv('\))c(is)i(used.)39 b(Also,)30 b(`)p Fr(-i)p Fv(')e(is)g(o)m(v)m(erridden)h(when)e(the)i(`) p Fr(-r)p Fv(')630 2288 y(option)i(is)f(used.)150 2449 y(`)p Fr(-j)g Fi(jump-value)p Fv(')150 2558 y(`)p Fr(--jump=)p Fi(jump-value)p Fv(')630 2668 y(A\013ects)41 b(the)f(\\jump)f(v)-5 b(alue",)44 b(i.e.,)g(ho)m(w)c(far)g(to)g(adv)-5 b(ance)41 b(the)f(asso)s(ciated)i(b)m(yte)e(v)-5 b(alue)630 2777 y(up)s(on)29 b(collisions.)43 b Fn(Jump-v)-5 b(alue)35 b Fv(is)30 b(rounded)f(up)h(to)h(an)f(o)s(dd)g(n)m(um)m(b)s(er,)f(the)i (default)g(is)f(5.)630 2887 y(If)g(the)g Fn(jump-v)-5 b(alue)35 b Fv(is)c(0)f Fr(gperf)f Fv(jumps)g(b)m(y)h(random)g(amoun)m (ts.)150 3047 y(`)p Fr(-n)p Fv(')150 3157 y(`)p Fr(--no-strlen)p Fv(')630 3266 y(Instructs)c(the)i(generator)g(not)f(to)h(include)f(the) h(length)f(of)g(a)h(k)m(eyw)m(ord)g(when)e(computing)630 3376 y(its)41 b(hash)f(v)-5 b(alue.)72 b(This)40 b(ma)m(y)h(sa)m(v)m(e) h(a)f(few)f(assem)m(bly)h(instructions)g(in)f(the)h(generated)630 3485 y(lo)s(okup)30 b(table.)150 3646 y(`)p Fr(-r)p Fv(')150 3755 y(`)p Fr(--random)p Fv(')630 3865 y(Utilizes)40 b(randomness)e(to)h(initialize)h(the)f(asso)s(ciated)h(v)-5 b(alues)38 b(table.)66 b(This)38 b(frequen)m(tly)630 3974 y(generates)23 b(solutions)e(faster)h(than)f(using)g (deterministic)h(initialization)i(\(whic)m(h)d(starts)h(all)630 4084 y(asso)s(ciated)28 b(v)-5 b(alues)28 b(at)f(0\).)40 b(F)-8 b(urthermore,)28 b(using)f(the)g(randomization)g(option)h (generally)630 4194 y(increases)j(the)g(size)g(of)f(the)h(table.)150 4354 y(`)p Fr(-s)f Fi(size-multiple)p Fv(')150 4463 y(`)p Fr(--size-multiple=)p Fi(size-mult)o(iple)o Fv(')630 4573 y(A\013ects)40 b(the)e(size)h(of)g(the)f(generated)i(hash)d (table.)66 b(The)38 b(n)m(umeric)g(argumen)m(t)h(for)f(this)630 4682 y(option)33 b(indicates)g(\\ho)m(w)g(man)m(y)g(times)g(larger)g (or)f(smaller")i(the)e(maxim)m(um)g(asso)s(ciated)630 4792 y(v)-5 b(alue)38 b(range)g(should)e(b)s(e,)j(in)e(relationship)h (to)g(the)f(n)m(um)m(b)s(er)g(of)g(k)m(eyw)m(ords.)62 b(It)38 b(can)g(b)s(e)630 4902 y(written)g(as)h(an)f(in)m(teger,)43 b(a)38 b(\015oating-p)s(oin)m(t)i(n)m(um)m(b)s(er)d(or)i(a)f(fraction.) 66 b(F)-8 b(or)39 b(example,)j(a)630 5011 y(v)-5 b(alue)40 b(of)f(3)h(means)f(\\allo)m(w)i(the)f(maxim)m(um)f(asso)s(ciated)h(v)-5 b(alue)40 b(to)g(b)s(e)f(ab)s(out)g(3)g(times)630 5121 y(larger)33 b(than)g(the)g(n)m(um)m(b)s(er)e(of)i(input)f(k)m(eyw)m (ords".)49 b(Con)m(v)m(ersely)-8 b(,)35 b(a)e(v)-5 b(alue)33 b(of)g(1/3)h(means)630 5230 y(\\allo)m(w)43 b(the)e(maxim)m(um)f(asso)s (ciated)j(v)-5 b(alue)41 b(to)h(b)s(e)e(ab)s(out)g(3)h(times)h(smaller) f(than)g(the)630 5340 y(n)m(um)m(b)s(er)33 b(of)i(input)f(k)m(eyw)m (ords".)55 b(V)-8 b(alues)35 b(smaller)h(than)e(1)h(are)g(useful)f(for) h(limiting)h(the)p eop end %%Page: 30 32 TeXDict begin 30 31 bop 150 -116 a Fv(Chapter)30 b(4:)41 b(In)m(v)m(oking)31 b Fr(gperf)2433 b Fv(30)630 299 y(o)m(v)m(erall)31 b(size)e(of)g(the)f(generated)i(hash)e(table,)i(though)e(the)g(option)h (`)p Fr(-m)p Fv(')g(is)f(b)s(etter)h(at)g(this)630 408 y(purp)s(ose.)630 543 y(If)44 b(`generate)h(switc)m(h')g(option)g(`)p Fr(-S)p Fv(')f(\(or,)k(equiv)-5 b(alen)m(tly)d(,)49 b(`)p Fr(\045switch)p Fv('\))43 b(is)h Fm(not)54 b Fv(enabled,)630 653 y(the)45 b(maxim)m(um)h(asso)s(ciated)g(v)-5 b(alue)46 b(in\015uences)f(the)g(static)i(arra)m(y)f(table)g(size,)k(and)45 b(a)630 762 y(larger)27 b(table)g(should)e(decrease)i(the)f(time)h (required)e(for)h(an)f(unsuccessful)g(searc)m(h,)j(at)f(the)630 872 y(exp)s(ense)j(of)g(extra)i(table)f(space.)630 1006 y(The)c(default)i(v)-5 b(alue)28 b(is)g(1,)h(th)m(us)e(the)i(default)f (maxim)m(um)f(asso)s(ciated)j(v)-5 b(alue)28 b(is)g(ab)s(out)g(the)630 1116 y(same)i(size)h(as)g(the)f(n)m(um)m(b)s(er)e(of)j(k)m(eyw)m(ords.) 40 b(\(F)-8 b(or)32 b(e\016ciency)-8 b(,)31 b(the)g(maxim)m(um)e(asso)s (ciated)630 1225 y(v)-5 b(alue)36 b(is)g(alw)m(a)m(ys)h(rounded)d(up)g (to)i(a)g(p)s(o)m(w)m(er)g(of)f(2.\))57 b(The)35 b(actual)i(table)g (size)f(ma)m(y)g(v)-5 b(ary)630 1335 y(somewhat,)31 b(since)g(this)f (tec)m(hnique)h(is)g(essen)m(tially)h(a)f(heuristic.)150 1576 y Fu(4.6)68 b(Informativ)l(e)47 b(Output)150 1760 y Fv(`)p Fr(-h)p Fv(')150 1870 y(`)p Fr(--help)p Fv(')142 b(Prin)m(ts)24 b(a)g(short)f(summary)g(on)h(the)g(meaning)g(of)g(eac)m (h)h(program)e(option.)39 b(Ab)s(orts)23 b(further)630 1979 y(program)30 b(execution.)150 2139 y(`)p Fr(-v)p Fv(')150 2248 y(`)p Fr(--version)p Fv(')630 2358 y(Prin)m(ts)g(out)h (the)f(curren)m(t)h(v)m(ersion)f(n)m(um)m(b)s(er.)150 2517 y(`)p Fr(-d)p Fv(')150 2627 y(`)p Fr(--debug)p Fv(')94 b(Enables)28 b(the)h(debugging)f(option.)40 b(This)28 b(pro)s(duces)f(v)m(erb)s(ose)i(diagnostics)g(to)g(\\standard)630 2736 y(error")i(when)g Fr(gperf)f Fv(is)h(executing.)45 b(It)32 b(is)f(useful)g(b)s(oth)g(for)g(main)m(taining)i(the)e(program) 630 2846 y(and)f(for)h(determining)g(whether)f(a)h(giv)m(en)h(set)f(of) g(options)g(is)g(actually)i(sp)s(eeding)d(up)g(the)630 2956 y(searc)m(h)41 b(for)e(a)h(solution.)70 b(Some)40 b(useful)f(information)h(is)g(dump)s(ed)e(at)i(the)g(end)g(of)g(the)630 3065 y(program)30 b(when)g(the)g(`)p Fr(-d)p Fv(')g(option)h(is)g (enabled.)p eop end %%Page: 31 33 TeXDict begin 31 32 bop 3659 -116 a Fv(31)150 299 y Fs(5)80 b(Kno)l(wn)53 b(Bugs)f(and)i(Limitations)f(with)f Fo(gperf)275 533 y Fv(The)29 b(follo)m(wing)j(are)f(some)g(limitations)h(with)e(the) g(curren)m(t)h(release)g(of)g Fr(gperf)p Fv(:)225 667 y Ft(\017)60 b Fv(The)31 b Fr(gperf)g Fv(utilit)m(y)i(is)f(tuned)f(to)h (execute)h(quic)m(kly)-8 b(,)34 b(and)d(w)m(orks)h(quic)m(kly)g(for)g (small)g(to)h(medium)330 777 y(size)i(data)g(sets)g(\(around)f(1000)i (k)m(eyw)m(ords\).)54 b(It)34 b(is)h(extremely)h(useful)d(for)h(main)m (taining)i(p)s(erfect)330 887 y(hash)23 b(functions)h(for)g(compiler)g (k)m(eyw)m(ord)h(sets.)39 b(Since)24 b(v)m(ersion)g(3.0,)j Fr(gperf)22 b Fv(also)j(w)m(orks)f(e\016cien)m(tly)330 996 y(on)30 b(m)m(uc)m(h)h(larger)g(k)m(eyw)m(ord)g(sets)f(\(o)m(v)m (er)i(15,000)h(k)m(eyw)m(ords\).)225 1131 y Ft(\017)60 b Fv(The)29 b(size)i(of)f(the)g(generate)i(static)f(k)m(eyw)m(ord)g (arra)m(y)f(can)h(get)g Fm(extr)-5 b(emely)39 b Fv(large)31 b(if)f(the)g(input)f(k)m(ey-)330 1240 y(w)m(ord)38 b(\014le)h(is)f (large)i(or)e(if)g(the)h(k)m(eyw)m(ords)g(are)g(quite)g(similar.)65 b(This)38 b(tends)g(to)h(slo)m(w)g(do)m(wn)f(the)330 1350 y(compilation)d(of)e(the)h(generated)g(C)f(co)s(de,)h(and)f Fm(gr)-5 b(e)g(atly)43 b Fv(in\015ates)34 b(the)f(ob)5 b(ject)34 b(co)s(de)g(size.)50 b(If)33 b(this)330 1460 y(situation)28 b(o)s(ccurs,)g(consider)f(using)f(the)i(`)p Fr(-S)p Fv(')f(option)g(to)h(reduce)f(data)h(size,)g(p)s(oten)m(tially) h(increas-)330 1569 y(ing)41 b(the)g(k)m(eyw)m(ord)h(recognition)g (time)g(b)m(y)f(a)g(negligible)i(amoun)m(t.)73 b(Since)41 b(man)m(y)g(C)g(compilers)330 1679 y(cannot)c(correctly)i(generate)f (co)s(de)f(for)g(large)h(switc)m(h)f(statemen)m(ts)i(it)e(is)g(imp)s (ortan)m(t)g(to)h(qualify)330 1788 y(the)i Fn(-S)46 b Fv(option)40 b(with)g(an)g(appropriate)g(n)m(umerical)h(argumen)m(t)f (that)h(con)m(trols)h(the)e(n)m(um)m(b)s(er)f(of)330 1898 y(switc)m(h)31 b(statemen)m(ts)h(generated.)225 2032 y Ft(\017)60 b Fv(The)35 b(maxim)m(um)g(n)m(um)m(b)s(er)f(of)i (selected)h(b)m(yte)f(p)s(ositions)f(has)g(an)h(arbitrary)f(limit)h(of) g(255.)57 b(This)330 2142 y(restriction)29 b(should)e(b)s(e)g(remo)m(v) m(ed,)j(and)d(if)h(an)m(y)m(one)h(considers)f(this)g(a)g(problem)f (write)i(me)f(and)f(let)330 2252 y(me)j(kno)m(w)h(so)f(I)h(can)f(remo)m (v)m(e)i(the)f(constrain)m(t.)p eop end %%Page: 32 34 TeXDict begin 32 33 bop 3659 -116 a Fv(32)150 299 y Fs(6)80 b(Things)53 b(Still)g(Left)g(to)g(Do)275 533 y Fv(It)24 b(should)f(b)s(e)h(\\relativ)m(ely")k(easy)d(to)g(replace)g(the)g (curren)m(t)f(p)s(erfect)g(hash)g(function)g(algorithm)h(with)150 643 y(a)35 b(more)f(exhaustiv)m(e)h(approac)m(h;)i(the)d(p)s(erfect)h (hash)e(mo)s(dule)h(is)g(essen)m(tial)i(indep)s(enden)m(t)d(from)h (other)150 752 y(program)c(mo)s(dules.)40 b(Additional)31 b(w)m(orth)m(while)g(impro)m(v)m(emen)m(ts)h(include:)225 887 y Ft(\017)60 b Fv(Another)34 b(useful)f(extension)h(in)m(v)m(olv)m (es)i(mo)s(difying)d(the)h(program)f(to)i(generate)g(\\minimal")g(p)s (er-)330 996 y(fect)42 b(hash)f(functions)f(\(under)h(certain)h (circumstances,)j(the)c(curren)m(t)g(v)m(ersion)h(can)f(b)s(e)g(rather) 330 1106 y(extra)m(v)-5 b(agan)m(t)39 b(in)d(the)h(generated)g(table)g (size\).)60 b(This)36 b(is)g(mostly)h(of)g(theoretical)h(in)m(terest,)i (since)330 1215 y(a)f(sparse)f(table)h(often)g(pro)s(duces)e(faster)i (lo)s(okups,)h(and)e(use)g(of)h(the)g(`)p Fr(-S)p Fv(')f Fr(switch)f Fv(option)i(can)330 1325 y(minimize)g(the)g(data)g(size,)j (at)d(the)g(exp)s(ense)f(of)h(sligh)m(tly)h(longer)f(lo)s(okups)f (\(note)i(that)f(the)g(gcc)330 1435 y(compiler)e(generally)g(pro)s (duces)e(go)s(o)s(d)h(co)s(de)g(for)g Fr(switch)f Fv(statemen)m(ts,)k (reducing)d(the)g(need)g(for)330 1544 y(more)31 b(complex)g(sc)m (hemes\).)225 1679 y Ft(\017)60 b Fv(In)38 b(addition)h(to)h(impro)m (ving)f(the)h(algorithm,)i(it)d(w)m(ould)g(also)h(b)s(e)f(useful)f(to)h (generate)i(an)e(Ada)330 1788 y(pac)m(k)-5 b(age)32 b(as)f(the)g(co)s (de)f(output,)g(in)g(addition)h(to)g(the)g(curren)m(t)f(C)g(and)g(C)p Fr(++)f Fv(routines.)p eop end %%Page: 33 35 TeXDict begin 33 34 bop 3659 -116 a Fv(33)150 299 y Fs(7)80 b(Bibliograph)l(y)150 533 y Fv([1])35 b(Chang,)f(C.C.:)47 b Fm(A)36 b(Scheme)g(for)g(Constructing)h(Or)-5 b(der)g(e)g(d)37 b(Minimal)f(Perfe)-5 b(ct)36 b(Hashing)g(F)-7 b(unctions)150 643 y Fv(Information)30 b(Sciences)h(39\(1986\),)j(187-195.)150 777 y([2])23 b(Cic)m(helli,)j(Ric)m(hard)c(J.)h Fm(A)n(uthor's)i(R)-5 b(esp)g(onse)28 b(to)e(\\On)e(Cichel)5 b(li's)26 b(Minimal)f(Perfe)-5 b(ct)25 b(Hash)h(F)-7 b(unctions)150 887 y(Metho)i(d")38 b Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g(23,)g(12\(Decem)m(b)s (er)i(1980\),)g(729.)150 1021 y([3])h(Cic)m(helli,)i(Ric)m(hard)e(J.)f Fm(Minimal)j(Perfe)-5 b(ct)35 b(Hash)h(F)-7 b(unctions)36 b(Made)g(Simple)41 b Fv(Comm)m(unications)34 b(of)150 1131 y(the)d(A)m(CM,)g(23,)g(1\(Jan)m(uary)g(1980\),)i(17-19.)150 1265 y([4])f(Co)s(ok,)g(C.)f(R.)g(and)g(Oldeho)s(eft,)h(R.R.)f Fm(A)i(L)-5 b(etter)34 b(Oriente)-5 b(d)34 b(Minimal)g(Perfe)-5 b(ct)33 b(Hashing)h(F)-7 b(unction)150 1375 y Fv(SIGPLAN)30 b(Notices,)i(17,)g(9\(Septem)m(b)s(er)f(1982\),)h(18-27.)150 1509 y([5])g(Cormac)m(k,)g(G.)g(V.)g(and)e(Horsp)s(o)s(ol,)i(R.)f(N.)g (S.)g(and)g(Kaiserw)m(erth,)h(M.)g Fm(Pr)-5 b(actic)g(al)34 b(Perfe)-5 b(ct)34 b(Hashing)150 1619 y Fv(Computer)c(Journal,)g(28,)h (1\(Jan)m(uary)g(1985\),)i(54-58.)150 1753 y([6])40 b(Jaesc)m(hk)m(e,)j (G.)d Fm(R)-5 b(e)g(cipr)g(o)g(c)g(al)44 b(Hashing:)58 b(A)40 b(Metho)-5 b(d)42 b(for)f(Gener)-5 b(ating)42 b(Minimal)f(Perfe)-5 b(ct)41 b(Hashing)150 1863 y(F)-7 b(unctions)39 b Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g(24,)g (12\(Decem)m(b)s(er)i(1981\),)g(829-833.)150 1998 y([7])g(Jaesc)m(hk)m (e,)i(G.)d(and)g(Osterburg,)g(G.)h Fm(On)h(Cichel)5 b(li's)34 b(Minimal)h(Perfe)-5 b(ct)34 b(Hash)h(F)-7 b(unctions)35 b(Metho)-5 b(d)150 2107 y Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,) g(23,)h(12\(Decem)m(b)s(er)g(1980\),)h(728-729.)150 2242 y([8])j(Sager,)i(Thomas)d(J.)g Fm(A)i(Polynomial)i(Time)e(Gener)-5 b(ator)40 b(for)e(Minimal)f(Perfe)-5 b(ct)37 b(Hash)h(F)-7 b(unctions)150 2351 y Fv(Comm)m(unications)31 b(of)f(the)h(A)m(CM,)g (28,)h(5\(Decem)m(b)s(er)g(1985\),)g(523-532)150 2486 y([9])25 b(Sc)m(hmidt,)h(Douglas)f(C.)f Fm(GPERF:)j(A)g(Perfe)-5 b(ct)27 b(Hash)g(F)-7 b(unction)28 b(Gener)-5 b(ator)36 b Fv(Second)24 b(USENIX)g(C)p Fr(++)150 2595 y Fv(Conference)30 b(Pro)s(ceedings,)h(April)f(1990.)150 2730 y([10])i(Sc)m(hmidt,)f (Douglas)h(C.)f Fm(GPERF:)i(A)f(Perfe)-5 b(ct)33 b(Hash)h(F)-7 b(unction)33 b(Gener)-5 b(ator)43 b Fv(C)p Fr(++)30 b Fv(Rep)s(ort,)h(SIGS)150 2839 y(10)g(10)g(\(No)m(v)m(em)m(b)s(er/Decem) m(b)s(er)j(1998\).)150 2974 y([11])h(Seb)s(esta,)g(R.W.)g(and)e(T)-8 b(a)m(ylor,)37 b(M.A.)e Fm(Minimal)h(Perfe)-5 b(ct)36 b(Hash)g(F)-7 b(unctions)37 b(for)f(R)-5 b(eserve)g(d)38 b(Wor)-5 b(d)150 3083 y(Lists)38 b Fv(SIGPLAN)30 b(Notices,)j(20,)e (12\(Septem)m(b)s(er)g(1985\),)i(47-53.)150 3218 y([12])f(Sprugnoli,)d (R.)h Fm(Perfe)-5 b(ct)33 b(Hashing)g(F)-7 b(unctions:)42 b(A)32 b(Single)h(Pr)-5 b(ob)g(e)33 b(R)-5 b(etrieving)33 b(Metho)-5 b(d)33 b(for)g(Static)150 3328 y(Sets)38 b Fv(Comm)m(unications)31 b(of)g(the)f(A)m(CM,)h(20)h(11\(No)m(v)m(em)m (b)s(er)g(1977\),)h(841-850.)150 3462 y([13])f(Stallman,)f(Ric)m(hard)f (M.)h Fm(Using)h(and)i(Porting)f(GNU)f(CC)43 b Fv(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32 b(1988.)150 3597 y([14])g(Stroustrup,)d(Bjarne)h Fm(The)j(C)p Fr(++)f Fm(Pr)-5 b(o)g(gr)g(amming)35 b(L)-5 b(anguage.)41 b Fv(Addison-W)-8 b(esley)g(,)32 b(1986.)150 3731 y([15])g(Tiemann,)e (Mic)m(hael)i(D.)f Fm(User's)i(Guide)f(to)i(GNU)e(C)p Fr(++)d Fv(F)-8 b(ree)32 b(Soft)m(w)m(are)f(F)-8 b(oundation,)32 b(1989.)p eop end %%Page: 34 36 TeXDict begin 34 35 bop 3659 -116 a Fv(34)150 299 y Fs(Concept)52 b(Index)146 638 y Fu(\045)150 754 y Fd(`)p Fp(\045\045)p Fd(')12 b Fc(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)26 b Fd(16)150 842 y(`)p Fp(\045{)p Fd(')12 b Fc(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)26 b Fd(19)150 929 y(`)p Fp(\045})p Fd(')12 b Fc(:)i(:)f(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)26 b Fd(19)150 1016 y(`)p Fp(\0457bit)p Fd(')d Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)36 b Fd(18)150 1104 y(`)p Fp (\045compare-lengths)p Fd(')10 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)25 b Fd(18)150 1191 y(`)p Fp(\045compare-strncmp)p Fd(')10 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fd(18)150 1278 y(`)p Fp(\045define)j(class-name)p Fd(')12 b Fc(:)j(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)26 b Fd(18)150 1366 y(`)p Fp(\045define)i(constants-prefix)p Fd(')14 b Fc(:)j(:)c(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fd(19)150 1453 y(`)p Fp(\045define)g(hash-function-name)p Fd(')9 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)23 b Fd(17)150 1540 y(`)p Fp(\045define)28 b(initializer-suffix)p Fd(')9 b Fc(:)17 b(:)c(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)23 b Fd(17)150 1628 y(`)p Fp(\045define)28 b(length-table-name)p Fd(')11 b Fc(:)17 b(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)26 b Fd(19)150 1715 y(`)p Fp(\045define)i(lookup-function-name)p Fd(')d Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fd(17)150 1802 y(`)p Fp(\045define)28 b(slot-name)p Fd(')15 b Fc(:)g(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b Fd(17)150 1890 y(`)p Fp(\045define)f(string-pool-name)p Fd(')14 b Fc(:)j(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)28 b Fd(19)150 1977 y(`)p Fp(\045define)g (word-array-name)p Fd(')16 b Fc(:)h(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31 b Fd(19)150 2064 y(`)p Fp(\045delimiters)p Fd(')6 b Fc(:)16 b(:)e(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)20 b Fd(17)150 2152 y(`)p Fp(\045enum)p Fd(')j Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fd(18)150 2239 y(`)p Fp(\045global-table)p Fd(')18 b Fc(:)f(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fd(18)150 2326 y(`)p Fp(\045ignore-case)p Fd(')24 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fd(17)150 2413 y(`)p Fp(\045includes)p Fd(')11 b Fc(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 26 b Fd(18)150 2501 y(`)p Fp(\045language)p Fd(')11 b Fc(:)16 b(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)26 b Fd(17)150 2588 y(`)p Fp(\045null-strings)p Fd(')18 b Fc(:)f(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fd(19)150 2675 y(`)p Fp(\045omit-struct-type)p Fd(')8 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)22 b Fd(19)150 2763 y(`)p Fp(\045pic)p Fd(')7 b Fc(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)21 b Fd(18)150 2850 y(`)p Fp(\045readonly-tables)p Fd(')10 b Fc(:)18 b(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fd(18)150 2937 y(`)p Fp(\045struct-type)p Fd(')f Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fd(17)150 3025 y(`)p Fp(\045switch)p Fd(')16 b Fc(:)g(:)d(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)31 b Fd(19)146 3269 y Fu(A)150 3385 y Fd(Arra)n(y)25 b(name)9 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)24 b Fd(27)146 3637 y Fu(B)150 3754 y Fd(Bugs)7 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)21 b Fd(12)146 4006 y Fu(C)150 4123 y Fd(Class)27 b(name)19 b Fc(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fd(26)150 4210 y(Constan)n(ts)26 b(de\014nition)7 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fd(26)150 4297 y(Constan)n(ts)26 b(pre\014x)18 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fd(27)150 4384 y(Cop)n(yrigh)n(t)7 b Fc(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)22 b Fd(23)2021 638 y Fu(D)2025 757 y Fd(Declaration)27 b(section)7 b Fc(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)21 b Fd(15)2025 844 y(Delimiters)f Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)34 b Fd(24)2025 932 y(Duplicates)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)30 b Fd(28)2021 1198 y Fu(F)2025 1317 y Fd(F)-6 b(ormat)19 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)33 b Fd(15)2025 1405 y(F)-6 b(unctions)25 b(section)c Fc(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)35 b Fd(15)2021 1655 y Fu(H)2025 1773 y Fp(hash)11 b Fc(:)j(:)f(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)26 b Fd(21)2025 1861 y(hash)f(table)20 b Fc(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)34 b Fd(21)2021 2112 y Fu(I)2025 2230 y Fp(in_word_set)10 b Fc(:)16 b(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)25 b Fd(22)2025 2318 y(Initializers)16 b Fc(:)e(:)f(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fd(25)2021 2568 y Fu(J)2025 2687 y Fd(Jump)25 b(v)l(alue)15 b Fc(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)30 b Fd(29)2021 2953 y Fu(K)2025 3071 y Fd(Keyw)n(ords)25 b(section)20 b Fc(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fd(15)2021 3337 y Fu(M)2025 3456 y Fd(Minimal)27 b(p)r(erfect)f(hash) g(functions)10 b Fc(:)j(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)25 b Fd(14)2021 3722 y Fu(N)2025 3840 y Fd(NUL)8 b Fc(:)k(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fd(22)2021 4090 y Fu(S)2025 4209 y Fd(Slot)j(name)6 b Fc(:)13 b(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fd(25)2025 4297 y(Static)26 b(searc)n(h)g(structure)17 b Fc(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)32 b Fd(14)2025 4384 y Fp(switch)12 b Fc(:)j(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)27 b Fd(22,)g(28)p eop end %%Page: -1 37 TeXDict begin -1 36 bop 3725 -116 a Fv(i)150 299 y Fs(T)-13 b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fu(GNU)45 b(GENERAL)g(PUBLIC) g(LICENSE)20 b Fb(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)33 b Fu(1)150 927 y(Con)l(tributors)46 b(to)f(GNU)g Fl(gperf)e Fu(Utilit)l(y)12 b Fb(:)22 b(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)25 b Fu(12)150 1205 y(1)109 b(In)l(tro)t(duction)10 b Fb(:)19 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)j Fu(13)150 1484 y(2)109 b(Static)45 b(searc)l(h)h (structures)f(and)f(GNU)h Fl(gperf)13 b Fb(:)18 b(:)h(:)h(:)f(:)h(:)26 b Fu(14)150 1762 y(3)109 b(High-Lev)l(el)46 b(Description)g(of)f(GNU)g Fl(gperf)29 b Fb(:)17 b(:)j(:)f(:)g(:)h(:)f(:)h(:)42 b Fu(15)275 1899 y Fv(3.1)55 b(Input)29 b(F)-8 b(ormat)32 b(to)f Fr(gperf)20 b Fa(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)33 b Fv(15)399 2008 y(3.1.1)56 b(Declarations)14 b Fa(:)k(:)e(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)27 b Fv(15)524 2118 y(3.1.1.1)57 b(User-supplied)29 b Fr(struct)18 b Fa(:)c(:)i(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)31 b Fv(16)524 2227 y(3.1.1.2)57 b(Gp)s(erf)29 b(Declarations)9 b Fa(:)18 b(:)e(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fv(16)524 2337 y(3.1.1.3)57 b(C)30 b(Co)s(de)g(Inclusion)22 b Fa(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)35 b Fv(19)399 2447 y(3.1.2)56 b(F)-8 b(ormat)32 b(for)e(Keyw)m(ord)g(En)m(tries)22 b Fa(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)35 b Fv(20)399 2556 y(3.1.3)56 b(Including)30 b(Additional)h(C)f(F)-8 b(unctions)18 b Fa(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fv(21)399 2666 y(3.1.4)56 b(Where)31 b(to)g(place)h(directiv)m(es)f(for)g(GNU)g Fr(indent)p Fv(.)22 b Fa(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)36 b Fv(21)275 2775 y(3.2)55 b(Output)29 b(F)-8 b(ormat)32 b(for)e(Generated)i(C)e(Co)s(de)f(with)h Fr(gperf)25 b Fa(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)39 b Fv(21)275 2885 y(3.3)55 b(Use)31 b(of)g(NUL)f(b)m(ytes)25 b Fa(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)37 b Fv(22)275 2995 y(3.4)55 b(Con)m(trolling)32 b(Iden)m(ti\014ers)23 b Fa(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)36 b Fv(23)275 3104 y(3.5)55 b(The)30 b(Cop)m(yrigh)m(t)h(of)g(the)f(Output)18 b Fa(:)c(:)i(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fv(23)150 3355 y Fu(4)109 b(In)l(v)l(oking)45 b Fl(gperf)30 b Fb(:)17 b(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) 43 b Fu(24)275 3492 y Fv(4.1)55 b(Sp)s(ecifying)30 b(the)h(Lo)s(cation) g(of)g(the)f(Output)g(File)11 b Fa(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fv(24)275 3601 y(4.2)55 b(Options)30 b(that)h(a\013ect)h(In)m (terpretation)f(of)g(the)g(Input)e(File)9 b Fa(:)16 b(:)g(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)22 b Fv(24)275 3711 y(4.3)55 b(Options)30 b(to)h(sp)s(ecify)f(the)h(Language)g(for)f(the)h (Output)e(Co)s(de)13 b Fa(:)i(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)26 b Fv(24)275 3821 y(4.4)55 b(Options)30 b(for)g(\014ne)g(tuning)g (Details)i(in)e(the)h(Output)e(Co)s(de)c Fa(:)15 b(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fv(25)275 3930 y(4.5)55 b(Options)30 b(for)g(c)m(hanging)i(the)e(Algorithms)h(emplo)m(y)m(ed)h (b)m(y)e Fr(gperf)16 b Fa(:)e(:)i(:)f(:)h(:)f(:)g(:)h(:)29 b Fv(28)275 4040 y(4.6)55 b(Informativ)m(e)31 b(Output)c Fa(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fv(30)150 4291 y Fu(5)109 b(Kno)l(wn)45 b(Bugs)f(and)h(Limitations)i(with)e Fl(gperf)27 b Fb(:)17 b(:)j(:)f(:)h(:)40 b Fu(31)150 4569 y(6)109 b(Things)44 b(Still)i(Left)f(to)h(Do)23 b Fb(:)c(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fu(32)150 4847 y(7)109 b(Bibliograph)l(y)30 b Fb(:)19 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)43 b Fu(33)150 5125 y(Concept)i(Index)36 b Fb(:)19 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)49 b Fu(34)p eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF gperf-3.2.1/doc/Makefile.in0000664000000000000000000001424514647324214011100 # Makefile for gperf/doc # Copyright (C) 1998, 2000, 2002-2003, 2006-2007, 2012, 2016, 2023-2024 Free Software Foundation, Inc. # Written by Douglas C. Schmidt # and Bruno Haible . # # This file is part of GNU GPERF. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #### Start of system configuration section. #### # Directories used by "make": srcdir = @srcdir@ # Directories used by "make install": prefix = @prefix@ local_prefix = /usr/local exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ infodir = @infodir@ mandir = @mandir@ man1dir = $(mandir)/man1 docdir = @docdir@ dvidir = @dvidir@ psdir = @psdir@ pdfdir = @pdfdir@ htmldir = @htmldir@ # Programs used by "make": RM = rm -f @SET_MAKE@ # Programs used by "make" if you have changed the documentation files: TEX = tex TEXI2DVI = texi2dvi DVIPS = dvips -D600 TEXI2PDF = texi2pdf MAKEINFO = LANG= LC_MESSAGES= LC_ALL= LANGUAGE= makeinfo -c CHECK_NORMAL_MENU_STRUCTURE=1 TEXI2HTML = perl texi2html TEXI2ANY = texi2any # Programs used by "make install": INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(SHELL) $(srcdir)/../build-aux/mkinstalldirs #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) all : info pdf html man info : $(srcdir)/gperf.info $(srcdir)/gperf.info : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(MAKEINFO) --no-split gperf.texi dvi : $(srcdir)/gperf.dvi $(srcdir)/gperf.dvi : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps cd $(srcdir) && $(TEXI2DVI) gperf.texi cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps ps : $(srcdir)/gperf.ps $(srcdir)/gperf.ps : $(srcdir)/gperf.dvi $(DVIPS) -o $@ $(srcdir)/gperf.dvi pdf : $(srcdir)/gperf.pdf $(srcdir)/gperf.pdf : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps cd $(srcdir) && $(TEXI2PDF) gperf.texi cd $(srcdir) && $(RM) gperf.aux gperf.toc gperf.cp gperf.fn gperf.ky gperf.pg gperf.tp gperf.vr gperf.log gperf.cps html : gperf.html gperf_toc.html # We still prefer texi2html over texi2any because it includes the titlepage. gperf.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(TEXI2HTML) -number -monolithic gperf.texi # cd $(srcdir) && $(TEXI2ANY) --html --no-headers --no-split gperf.texi gperf_toc.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(RM) gperf_*.html cd $(srcdir) && $(TEXI2HTML) -number -split_chapter gperf.texi gperf_0.html : $(srcdir)/gperf.texi $(srcdir)/gpl-3.0.texi cd $(srcdir) && $(TEXI2ANY) --html --no-headers --split=chapter --no-node-files -o . gperf.texi man : gperf.1 gperf.1 gperf.1-update : $(srcdir)/help2man --name='generate a perfect hash function from a key set' --section=1 ../src/gperf > gperf.1-t \ && mv gperf.1-t $(srcdir)/gperf.1 gperf.1-update : force install : all force $(MKINSTALLDIRS) $(DESTDIR)$(infodir) $(INSTALL_DATA) $(srcdir)/gperf.info $(DESTDIR)$(infodir)/gperf.info $(MKINSTALLDIRS) $(DESTDIR)$(man1dir) $(INSTALL_DATA) $(srcdir)/gperf.1 $(DESTDIR)$(man1dir)/gperf.1 # $(MKINSTALLDIRS) $(DESTDIR)$(dvidir) # $(INSTALL_DATA) $(srcdir)/gperf.dvi $(DESTDIR)$(dvidir)/gperf.dvi # $(MKINSTALLDIRS) $(DESTDIR)$(psdir) # $(INSTALL_DATA) $(srcdir)/gperf.ps $(DESTDIR)$(psdir)/gperf.ps # $(MKINSTALLDIRS) $(DESTDIR)$(pdfdir) # $(INSTALL_DATA) $(srcdir)/gperf.pdf $(DESTDIR)$(pdfdir)/gperf.pdf $(MKINSTALLDIRS) $(DESTDIR)$(htmldir) $(INSTALL_DATA) $(srcdir)/gperf.html $(DESTDIR)$(htmldir)/gperf.html installdirs : force $(MKINSTALLDIRS) $(DESTDIR)$(infodir) $(MKINSTALLDIRS) $(DESTDIR)$(man1dir) # $(MKINSTALLDIRS) $(DESTDIR)$(dvidir) # $(MKINSTALLDIRS) $(DESTDIR)$(psdir) # $(MKINSTALLDIRS) $(DESTDIR)$(pdfdir) $(MKINSTALLDIRS) $(DESTDIR)$(htmldir) uninstall : force $(RM) $(DESTDIR)$(infodir)/gperf.info $(RM) $(DESTDIR)$(man1dir)/gperf.1 # $(RM) $(DESTDIR)$(dvidir)/gperf.dvi # $(RM) $(DESTDIR)$(psdir)/gperf.ps # $(RM) $(DESTDIR)$(pdfdir)/gperf.pdf $(RM) $(DESTDIR)$(htmldir)/gperf.html check : all mostlyclean : clean clean : force $(RM) *~ *.aux *.toc *.cp *.fn *.ky *.pg *.tp *.vr *.my *.log *.cps gperf.1-t core distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean $(RM) *.info *.dvi *.ps *.pdf *.html *.1 # List of source files. SOURCE_FILES = \ configure.ac Makefile.in \ gperf.texi # List of distributed files imported from other packages. IMPORTED_FILES = \ gpl-3.0.texi \ texinfo.tex texi2html \ help2man # List of distributed files generated by autotools or Makefile.devel. GENERATED_FILES = \ configure # List of distributed files generated by "make". DISTRIBUTED_BUILT_FILES = \ gperf.info \ gperf.dvi \ gperf.ps \ gperf.pdf \ gperf.html \ gperf_toc.html \ gperf.1 # Other distributed files, generated together with $(DISTRIBUTED_BUILT_FILES). DISTRIBUTED_BUILT_FILES_EXTRA_PATTERNS = \ $(srcdir)/gperf_[0-9].html $(srcdir)/gperf_[0-9][0-9].html # List of distributed files. DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES) distdir : gperf.1-update $(DISTFILES) for file in $(DISTFILES); do \ if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \ cp -p $$dir/$$file '$(distdir)'/$$file || exit 1; \ done for file in $(DISTRIBUTED_BUILT_FILES_EXTRA_PATTERNS); do \ cp -p $$file '$(distdir)'/ || exit 1; \ done force : gperf-3.2.1/doc/gperf.texi0000664000000000000000000016701714707675005011043 \input texinfo @c -*- texinfo -*- @c %**start of header @setfilename gperf.info @c The @ifset makeinfo ... @end ifset conditional evaluates to true in makeinfo @c for info and html output, but to false in texi2html. @ifnottex @ifclear texi2html @set makeinfo @end ifclear @end ifnottex @settitle Perfect Hash Function Generator @ifclear texi2html @firstparagraphindent insert @end ifclear @c @setchapternewpage odd @c %**end of header @c Some day we should @include version.texi instead of defining @c these values at hand. @set UPDATED 28 October 2024 @set EDITION 3.2 @set VERSION 3.2 @c --------------------- @c Remove the black boxes generated in the GPL appendix. @finalout @c In PDF output, use a brown colour for interactive links, @c like it was before commit @c https://git.savannah.gnu.org/gitweb/?p=texinfo.git;a=commitdiff;h=b4f50b9f4c083327e81ec5c7cde9b87234a19646 @tex \global\def\linkcolor{\rgbDarkRed} \global\def\urlcolor{\rgbDarkRed} @end tex @c Merge functions into the concept index @syncodeindex fn cp @c @synindex pg cp @ifinfo @dircategory Programming Tools @direntry * Gperf: (gperf). Perfect Hash Function Generator. @end direntry @end ifinfo @ifinfo This file documents the features of the GNU Perfect Hash Function Generator @value{VERSION}. Copyright @copyright{} 1989-2024 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries a copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License'' and this permission notice may be included in translations approved by the Free Software Foundation instead of in the original English. @end ifinfo @titlepage @title User's Guide to @code{gperf} @value{VERSION} @subtitle The GNU Perfect Hash Function Generator @subtitle Edition @value{EDITION}, @value{UPDATED} @author Douglas C. Schmidt @author Bruno Haible @page @vskip 0pt plus 1filll Copyright @copyright{} 1989-2024 Free Software Foundation, Inc. Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled ``GNU General Public License'' is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled ``GNU General Public License'' may be included in a translation approved by the author instead of in the original English. @end titlepage @ifnottex @c Table of Contents @contents @end ifnottex @ifset makeinfo @node Top @top Introduction This manual documents the GNU @code{gperf} perfect hash function generator utility, focusing on its features and how to use them, and how to report bugs. @menu * Copying:: GNU General Public License says how you can copy and share @code{gperf}. * Contributors:: People who have contributed to @code{gperf}. * Motivation:: The purpose of @code{gperf}. * Search Structures:: Static search structures and GNU @code{gperf} * Description:: High-level discussion of how GPERF functions. * Options:: A description of options to the program. * Bugs:: Known bugs and limitations with GPERF. * Projects:: Things still left to do. * Bibliography:: Material Referenced in this Report. * Concept Index:: @detailmenu --- The Detailed Node Listing --- High-Level Description of GNU @code{gperf} * Input Format:: Input Format to @code{gperf} * Output Format:: Output Format for Generated C Code with @code{gperf} * Binary Strings:: Use of NUL bytes * Controlling Identifiers:: Avoiding collisions of identifiers * Output Copyright:: The Copyright of the Output. Input Format to @code{gperf} * Declarations:: Declarations. * Keywords:: Format for Keyword Entries. * Functions:: Including Additional C Functions. * Controls for GNU indent:: Where to place directives for GNU @code{indent}. Declarations * User-supplied Struct:: Specifying keywords with attributes. * Gperf Declarations:: Embedding command line options in the input. * C Code Inclusion:: Including C declarations and definitions. Invoking @code{gperf} * Input Details:: Options that affect Interpretation of the Input File * Output Language:: Specifying the Language for the Output Code * Output Details:: Fine tuning Details in the Output Code * Algorithmic Details:: Changing the Algorithms employed by @code{gperf} * Verbosity:: Informative Output @end detailmenu @end menu @end ifset @node Copying @unnumbered GNU GENERAL PUBLIC LICENSE @include gpl-3.0.texi @node Contributors @unnumbered Contributors to GNU @code{gperf} Utility @itemize @bullet @item @cindex Bugs The GNU @code{gperf} perfect hash function generator utility was written in GNU C++ by Douglas C. Schmidt. The general idea for the perfect hash function generator was inspired by Keith Bostic's algorithm written in C, and distributed to net.sources around 1984. The current program is a heavily modified, enhanced, and extended implementation of Keith's basic idea, created at the University of California, Irvine. Bugs, patches, and suggestions should be reported to @code{}. @item Special thanks is extended to Michael Tiemann and Doug Lea, for providing a useful compiler, and for giving me a forum to exhibit my creation. In addition, Adam de Boor and Nels Olson provided many tips and insights that greatly helped improve the quality and functionality of @code{gperf}. @item Bruno Haible enhanced and optimized the search algorithm. He also rewrote the input routines and the output routines for better reliability, and added a testsuite. @end itemize @node Motivation @chapter Introduction @code{gperf} is a perfect hash function generator written in C++. It transforms an @var{n} element user-specified keyword set @var{W} into a perfect hash function @var{F}. @var{F} uniquely maps keywords in @var{W} onto the range 0..@var{k}, where @var{k} >= @var{n-1}. If @var{k} = @var{n-1} then @var{F} is a @emph{minimal} perfect hash function. @code{gperf} generates a 0..@var{k} element static lookup table and a pair of C functions. These functions determine whether a given character string @var{s} occurs in @var{W}, using at most one probe into the lookup table. @code{gperf} currently generates the reserved keyword recognizer for lexical analyzers in several production and research compilers and language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal, GNU Modula 3, and GNU indent. Complete C++ source code for @code{gperf} is available from @code{https://ftp.gnu.org/pub/gnu/gperf/}. A paper describing @code{gperf}'s design and implementation in greater detail is available in the Second USENIX C++ Conference proceedings or from @code{http://www.cs.wustl.edu/~schmidt/resume.html}. @node Search Structures @chapter Static search structures and GNU @code{gperf} @cindex Static search structure A @dfn{static search structure} is an Abstract Data Type with certain fundamental operations, e.g., @emph{initialize}, @emph{insert}, and @emph{retrieve}. Conceptually, all insertions occur before any retrievals. In practice, @code{gperf} generates a @emph{static} array containing search set keywords and any associated attributes specified by the user. Thus, there is essentially no execution-time cost for the insertions. It is a useful data structure for representing @emph{static search sets}. Static search sets occur frequently in software system applications. Typical static search sets include compiler reserved words, assembler instruction opcodes, and built-in shell interpreter commands. Search set members, called @dfn{keywords}, are inserted into the structure only once, usually during program initialization, and are not generally modified at run-time. Numerous static search structure implementations exist, e.g., arrays, linked lists, binary search trees, digital search tries, and hash tables. Different approaches offer trade-offs between space utilization and search time efficiency. For example, an @var{n} element sorted array is space efficient, though the average-case time complexity for retrieval operations using binary search is proportional to log @var{n}. Conversely, hash table implementations often locate a table entry in constant time, but typically impose additional memory overhead and exhibit poor worst case performance. @cindex Minimal perfect hash functions @emph{Minimal perfect hash functions} provide an optimal solution for a particular class of static search sets. A minimal perfect hash function is defined by two properties: @itemize @bullet @item It allows keyword recognition in a static search set using at most @emph{one} probe into the hash table. This represents the ``perfect'' property. @item The actual memory allocated to store the keywords is precisely large enough for the keyword set, and @emph{no larger}. This is the ``minimal'' property. @end itemize For most applications it is far easier to generate @emph{perfect} hash functions than @emph{minimal perfect} hash functions. Moreover, non-minimal perfect hash functions frequently execute faster than minimal ones in practice. This phenomena occurs since searching a sparse keyword table increases the probability of locating a ``null'' entry, thereby reducing string comparisons. @code{gperf}'s default behavior generates @emph{near-minimal} perfect hash functions for keyword sets. However, @code{gperf} provides many options that permit user control over the degree of minimality and perfection. Static search sets often exhibit relative stability over time. For example, Ada's 63 reserved words have remained constant for nearly a decade. It is therefore frequently worthwhile to expend concerted effort building an optimal search structure @emph{once}, if it subsequently receives heavy use multiple times. @code{gperf} removes the drudgery associated with constructing time- and space-efficient search structures by hand. It has proven a useful and practical tool for serious programming projects. Output from @code{gperf} is currently used in several production and research compilers, including GNU C, GNU C++, GNU Java, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet part of the official GNU distribution. Each compiler utilizes @code{gperf} to automatically generate static search structures that efficiently identify their respective reserved keywords. @node Description @chapter High-Level Description of GNU @code{gperf} @menu * Input Format:: Input Format to @code{gperf} * Output Format:: Output Format for Generated C Code with @code{gperf} * Binary Strings:: Use of NUL bytes * Controlling Identifiers:: Avoiding collisions of identifiers * Output Copyright:: The Copyright of the Output. @end menu The perfect hash function generator @code{gperf} reads a set of ``keywords'' from an input file (or from the standard input by default). It attempts to derive a perfect hashing function that recognizes a member of the @dfn{static keyword set} with at most a single probe into the lookup table. If @code{gperf} succeeds in generating such a function it produces a pair of C source code routines that perform hashing and table lookup recognition. All generated C code is directed to the standard output. Command-line options described below allow you to modify the input and output format to @code{gperf}. By default, @code{gperf} attempts to produce time-efficient code, with less emphasis on efficient space utilization. However, several options exist that permit trading-off execution time for storage space and vice versa. In particular, expanding the generated table size produces a sparse search structure, generally yielding faster searches. Conversely, you can direct @code{gperf} to utilize a C @code{switch} statement scheme that minimizes data space storage size. Furthermore, using a C @code{switch} may actually speed up the keyword retrieval time somewhat. Actual results depend on your C compiler, of course. In general, @code{gperf} assigns values to the bytes it is using for hashing until some set of values gives each keyword a unique value. A helpful heuristic is that the larger the hash value range, the easier it is for @code{gperf} to find and generate a perfect hash function. Experimentation is the key to getting the most from @code{gperf}. @node Input Format @section Input Format to @code{gperf} @cindex Format @cindex Declaration section @cindex Keywords section @cindex Functions section You can control the input file format by varying certain command-line arguments, in particular the @samp{-t} option. The input's appearance is similar to GNU utilities @code{flex} and @code{bison} (or UNIX utilities @code{lex} and @code{yacc}). Here's an outline of the general format: @example @group declarations %% keywords %% functions @end group @end example @emph{Unlike} @code{flex} or @code{bison}, the declarations section and the functions section are optional. The following sections describe the input format for each section. @menu * Declarations:: Declarations. * Keywords:: Format for Keyword Entries. * Functions:: Including Additional C Functions. * Controls for GNU indent:: Where to place directives for GNU @code{indent}. @end menu It is possible to omit the declaration section entirely, if the @samp{-t} option is not given. In this case the input file begins directly with the first keyword line, e.g.: @example @group january february march april ... @end group @end example @node Declarations @subsection Declarations The keyword input file optionally contains a section for including arbitrary C declarations and definitions, @code{gperf} declarations that act like command-line options, as well as for providing a user-supplied @code{struct}. @menu * User-supplied Struct:: Specifying keywords with attributes. * Gperf Declarations:: Embedding command line options in the input. * C Code Inclusion:: Including C declarations and definitions. @end menu @node User-supplied Struct @subsubsection User-supplied @code{struct} If the @samp{-t} option (or, equivalently, the @samp{%struct-type} declaration) @emph{is} enabled, you @emph{must} provide a C @code{struct} as the last component in the declaration section from the input file. The first field in this struct must be of type @code{char *} or @code{const char *} if the @samp{-P} option is not given, or of type @code{int} if the option @samp{-P} (or, equivalently, the @samp{%pic} declaration) is enabled. This first field must be called @samp{name}, although it is possible to modify its name with the @samp{-K} option (or, equivalently, the @samp{%define slot-name} declaration) described below. Here is a simple example, using months of the year and their attributes as input: @example @group struct month @{ char *name; int number; int days; int leap_days; @}; %% january, 1, 31, 31 february, 2, 28, 29 march, 3, 31, 31 april, 4, 30, 30 may, 5, 31, 31 june, 6, 30, 30 july, 7, 31, 31 august, 8, 31, 31 september, 9, 30, 30 october, 10, 31, 31 november, 11, 30, 30 december, 12, 31, 31 @end group @end example @cindex @samp{%%} Separating the @code{struct} declaration from the list of keywords and other fields are a pair of consecutive percent signs, @samp{%%}, appearing left justified in the first column, as in the UNIX utility @code{lex}. If the @code{struct} has already been declared in an include file, it can be mentioned in an abbreviated form, like this: @example @group struct month; %% january, 1, 31, 31 ... @end group @end example @node Gperf Declarations @subsubsection Gperf Declarations The declaration section can contain @code{gperf} declarations. They influence the way @code{gperf} works, like command line options do. In fact, every such declaration is equivalent to a command line option. There are three forms of declarations: @enumerate @item Declarations without argument, like @samp{%compare-lengths}. @item Declarations with an argument, like @samp{%switch=@var{count}}. @item Declarations of names of entities in the output file, like @samp{%define lookup-function-name @var{name}}. @end enumerate When a declaration is given both in the input file and as a command line option, the command-line option's value prevails. The following @code{gperf} declarations are available. @table @samp @item %delimiters=@var{delimiter-list} @cindex @samp{%delimiters} Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. @item %struct-type @cindex @samp{%struct-type} Allows you to include a @code{struct} type declaration for generated code; see above for an example. @item %ignore-case @cindex @samp{%ignore-case} Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. @item %language=@var{language-name} @cindex @samp{%language} Instructs @code{gperf} to generate code in the language specified by the option's argument. Languages handled are currently: @table @samp @item KR-C Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking @samp{const}. @item C Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you @code{#define const} to empty for compilers which don't know about this keyword. @item ANSI-C ANSI C. This language is understood by ANSI C (C89, ISO C90) compilers, ISO C99 compilers, and C++ compilers. @item C++ C++. This language is understood by C++ compilers. @end table The default is ANSI-C. @item %define slot-name @var{name} @cindex @samp{%define slot-name} This declaration is only useful when option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) has been given. By default, the program assumes the structure component identifier for the keyword is @samp{name}. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied @code{struct}. @item %define initializer-suffix @var{initializers} @cindex @samp{%define initializer-suffix} This declaration is only useful when option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) has been given. It permits to specify initializers for the structure members following @var{slot-name} in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following @var{slot-name}. @item %define hash-function-name @var{name} @cindex @samp{%define hash-function-name} Allows you to specify the name for the generated hash function. Default name is @samp{hash}. This option permits the use of two hash tables in the same file. @item %define lookup-function-name @var{name} @cindex @samp{%define lookup-function-name} Allows you to specify the name for the generated lookup function. Default name is @samp{in_word_set}. This option permits multiple generated hash functions to be used in the same application. @item %define class-name @var{name} @cindex @samp{%define class-name} This option is only useful when option @samp{-L C++} (or, equivalently, the @samp{%language=C++} declaration) has been given. It allows you to specify the name of generated C++ class. Default name is @code{Perfect_Hash}. @item %7bit @cindex @samp{%7bit} This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions @code{isalnum} and @code{isgraph} do @emph{not} guarantee that a byte is in this range. Only an explicit test like @samp{c >= 'A' && c <= 'Z'} guarantees this.) @item %compare-lengths @cindex @samp{%compare-lengths} Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (@pxref{Binary Strings}). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via @code{strcmp}. However, using @samp{%compare-lengths} might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option @samp{-S} or @samp{%switch} is not enabled), since the length table contains as many elements as there are entries in the lookup table. @item %compare-strncmp @cindex @samp{%compare-strncmp} Generates C code that uses the @code{strncmp} function to perform string comparisons. The default action is to use @code{strcmp}. @item %readonly-tables @cindex @samp{%readonly-tables} Makes the contents of all generated lookup tables constant, i.e., ``readonly''. Many compilers can generate more efficient code for this by putting the tables in readonly memory. @item %enum @cindex @samp{%enum} Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark @code{}. @item %includes @cindex @samp{%includes} Include the necessary system include file, @code{}, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code. @item %global-table @cindex @samp{%global-table} Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). @item %pic @cindex @samp{%pic} Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the @samp{%struct-type} declaration (or, equivalently, the option @samp{-t}) is also given, the first field of the user-defined struct must be of type @samp{int}, not @samp{char *}, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression @samp{stringpool + @var{o}}, where @var{o} is the offset. The string pool name can be changed through the @samp{%define string-pool-name} declaration. @item %define string-pool-name @var{name} @cindex @samp{%define string-pool-name} Allows you to specify the name of the generated string pool created by the declaration @samp{%pic} (or, equivalently, the option @samp{-P}). The default name is @samp{stringpool}. This declaration permits the use of two hash tables in the same file, with @samp{%pic} and even when the @samp{%global-table} declaration (or, equivalently, the option @samp{-G}) is given. @item %null-strings @cindex @samp{%null-strings} Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as the declaration @samp{%pic}), at the expense of one more test-and-branch instruction at run time. @item %define constants-prefix @var{prefix} @cindex @samp{%define constants-prefix} Allows you to specify a prefix for the constants @code{TOTAL_KEYWORDS}, @code{MIN_WORD_LENGTH}, @code{MAX_WORD_LENGTH}, and so on. This option permits the use of two hash tables in the same file, even when the option @samp{-E} (or, equivalently, the @samp{%enum} declaration) is not given or the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item %define word-array-name @var{name} @cindex @samp{%define word-array-name} Allows you to specify the name for the generated array containing the hash table. Default name is @samp{wordlist}. This option permits the use of two hash tables in the same file, even when the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item %define length-table-name @var{name} @cindex @samp{%define length-table-name} Allows you to specify the name for the generated array containing the length table. Default name is @samp{lengthtable}. This option permits the use of two length tables in the same file, even when the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item %switch=@var{count} @cindex @samp{%switch} Causes the generated C code to use a @code{switch} statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many @code{switch} statements are generated. A value of 1 generates 1 @code{switch} containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each @code{switch}, etc. This is useful since many C compilers cannot correctly generate code for large @code{switch} statements. This option was inspired in part by Keith Bostic's original C program. @item %omit-struct-type @cindex @samp{%omit-struct-type} Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. @end table @node C Code Inclusion @subsubsection C Code Inclusion @cindex @samp{%@{} @cindex @samp{%@}} Using a syntax similar to GNU utilities @code{flex} and @code{bison}, it is possible to directly include C source text and comments verbatim into the generated output file. This is accomplished by enclosing the region inside left-justified surrounding @samp{%@{}, @samp{%@}} pairs. Here is an input fragment based on the previous example that illustrates this feature: @example @group %@{ #include /* This section of code is inserted directly into the output. */ int return_month_days (struct month *months, int is_leap_year); %@} struct month @{ char *name; int number; int days; int leap_days; @}; %% january, 1, 31, 31 february, 2, 28, 29 march, 3, 31, 31 ... @end group @end example @node Keywords @subsection Format for Keyword Entries The second input file format section contains lines of keywords and any associated attributes you might supply. A line beginning with @samp{#} in the first column is considered a comment. Everything following the @samp{#} is ignored, up to and including the following newline. A line beginning with @samp{%} in the first column is an option declaration and must not occur within the keywords section. The first field of each non-comment line is always the keyword itself. It can be given in two ways: as a simple name, i.e., without surrounding string quotation marks, or as a string enclosed in double-quotes, in C syntax, possibly with backslash escapes like @code{\"} or @code{\234} or @code{\xa8}. In either case, it must start right at the beginning of the line, without leading whitespace. In this context, a ``field'' is considered to extend up to, but not include, the first blank, comma, or newline. Here is a simple example taken from a partial list of C reserved words: @example @group # These are a few C reserved words, see the c.gperf file # for a complete list of ANSI C reserved words. unsigned sizeof switch signed if default for while return @end group @end example Note that unlike @code{flex} or @code{bison} the first @samp{%%} marker may be elided if the declaration section is empty. Additional fields may optionally follow the leading keyword. Fields should be separated by commas, and terminate at the end of line. What these fields mean is entirely up to you; they are used to initialize the elements of the user-defined @code{struct} provided by you in the declaration section. If the @samp{-t} option (or, equivalently, the @samp{%struct-type} declaration) is @emph{not} enabled these fields are simply ignored. All previous examples except the last one contain keyword attributes. @node Functions @subsection Including Additional C Functions The optional third section also corresponds closely with conventions found in @code{flex} and @code{bison}. All text in this section, starting at the final @samp{%%} and extending to the end of the input file, is included verbatim into the generated output file. Naturally, it is your responsibility to ensure that the code contained in this section is valid C. @node Controls for GNU indent @subsection Where to place directives for GNU @code{indent}. If you want to invoke GNU @code{indent} on a @code{gperf} input file, you will see that GNU @code{indent} doesn't understand the @samp{%%}, @samp{%@{} and @samp{%@}} directives that control @code{gperf}'s interpretation of the input file. Therefore you have to insert some directives for GNU @code{indent}. More precisely, assuming the most general input file structure @example @group declarations part 1 %@{ verbatim code %@} declarations part 2 %% keywords %% functions @end group @end example @noindent you would insert @samp{*INDENT-OFF*} and @samp{*INDENT-ON*} comments as follows: @example @group /* *INDENT-OFF* */ declarations part 1 %@{ /* *INDENT-ON* */ verbatim code /* *INDENT-OFF* */ %@} declarations part 2 %% keywords %% /* *INDENT-ON* */ functions @end group @end example @node Output Format @section Output Format for Generated C Code with @code{gperf} @cindex hash table Several options control how the generated C code appears on the standard output. Two C functions are generated. They are called @code{hash} and @code{in_word_set}, although you may modify their names with a command-line option. Both functions require two arguments, a string, @code{char *} @var{str}, and a length parameter, @code{int} @var{len}. Their default function prototypes are as follows: @deftypefun {unsigned int} hash (const char * @var{str}, size_t @var{len}) By default, the generated @code{hash} function returns an integer value created by adding @var{len} to several user-specified @var{str} byte positions indexed into an @dfn{associated values} table stored in a local static array. The associated values table is constructed internally by @code{gperf} and later output as a static local C array called @samp{hash_table}. The relevant selected positions (i.e. indices into @var{str}) are specified via the @samp{-k} option when running @code{gperf}, as detailed in the @emph{Options} section below (@pxref{Options}). @end deftypefun @deftypefun {} in_word_set (const char * @var{str}, size_t @var{len}) If @var{str} is in the keyword set, returns a pointer to that keyword. More exactly, if the option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) was given, it returns a pointer to the matching keyword's structure. Otherwise it returns @code{NULL}. @end deftypefun If the option @samp{-c} (or, equivalently, the @samp{%compare-strncmp} declaration) is not used, @var{str} must be a NUL terminated string of exactly length @var{len}. If @samp{-c} (or, equivalently, the @samp{%compare-strncmp} declaration) is used, @var{str} must simply be an array of @var{len} bytes and does not need to be NUL terminated. The code generated for these two functions is affected by the following options: @table @samp @item -t @itemx --struct-type Make use of the user-defined @code{struct}. @item -S @var{total-switch-statements} @itemx --switch=@var{total-switch-statements} @cindex @code{switch} Generate 1 or more C @code{switch} statement rather than use a large, (and potentially sparse) static array. Although the exact time and space savings of this approach vary according to your C compiler's degree of optimization, this method often results in smaller and faster code. @end table If the @samp{-t} and @samp{-S} options (or, equivalently, the @samp{%struct-type} and @samp{%switch} declarations) are omitted, the default action is to generate a @code{char *} array containing the keywords, together with additional empty strings used for padding the array. By experimenting with the various input and output options, and timing the resulting C code, you can determine the best option choices for different keyword set characteristics. @node Binary Strings @section Use of NUL bytes @cindex NUL By default, the code generated by @code{gperf} operates on zero terminated strings, the usual representation of strings in C. This means that the keywords in the input file must not contain NUL bytes, and the @var{str} argument passed to @code{hash} or @code{in_word_set} must be NUL terminated and have exactly length @var{len}. If option @samp{-c} (or, equivalently, the @samp{%compare-strncmp} declaration) is used, then the @var{str} argument does not need to be NUL terminated. The code generated by @code{gperf} will only access the first @var{len}, not @var{len+1}, bytes starting at @var{str}. However, the keywords in the input file still must not contain NUL bytes. If option @samp{-l} (or, equivalently, the @samp{%compare-lengths} declaration) is used, then the hash table performs binary comparison. The keywords in the input file may contain NUL bytes, written in string syntax as @code{\000} or @code{\x00}, and the code generated by @code{gperf} will treat NUL like any other byte. Also, in this case the @samp{-c} option (or, equivalently, the @samp{%compare-strncmp} declaration) is ignored. @node Controlling Identifiers @section Controlling Identifiers The identifiers of the functions, tables, and constants defined by the code generated by @code{gperf} can be controlled through @code{gperf} declarations or the equivalent command-line options. This is useful for three purposes: @itemize @item Esthetics of the generated code. For this purpose, just use the available declarations or options at will. @item Controlling the exported identifiers of a library. Assume you include code generated by @code{gperf} in a library, and to avoid collisions with other libraries, you want to ensure that all exported identifiers of this library start with a certain prefix. By default, the only exported identifier is the lookup function. You can therefore use the option @samp{-N} (or, equivalently, the @samp{%define lookup-function-name} declaration). When you use the option @samp{-L C++} (or, equivalently, the @samp{%language=C++} declaration), the only exported entity is a class. You control its name through the option @samp{-Z} (or, equivalently, the @samp{%define class-name} declaration). @item Allowing multiple @code{gperf} generated codes in a single compilation unit. Assume you invoke @code{gperf} multiple times, with different input files, and want the generated code to be included from the same source file. In this case, you have to customize not only the exported identifiers, but also the names of functions with @samp{static} scope, types, and constants. By default, you will have to deal with the lookup function, the hash function, and the constants. You should therefore use the option @samp{-N} (or, equivalently, the @samp{%define lookup-function-name} declaration), the option @samp{-H} (or, equivalently, the @samp{%define hash-function-name} declaration), and the option @samp{--constants-prefix} (or, equivalently, the @samp{%define constants-prefix} declaration). If you use the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration), you will also have to deal with the word array, the length table if present, and the string pool if present. This means: You should use the option @samp{-W} (or, equivalently, the @samp{%define word-array-name} declaration). If you use the option @samp{-l} (or, equivalently, the @samp{%compare-lengths} declaration), you should use the option @samp{--length-table-name} (or, equivalently, the @samp{%define length-table-name} declaration). If you use the option @samp{-P} (or, equivalently, the @samp{%pic} declaration), you should use the option @samp{-Q} (or, equivalently, the @samp{%define string-pool-name} declaration). @end itemize @node Output Copyright @section The Copyright of the Output @cindex Copyright @code{gperf} is under GPL, but that does not cause the output produced by @code{gperf} to be under GPL. The reason is that the output contains only small pieces of text that come directly from @code{gperf}'s source code -- only about 7 lines long, too small for being significant --, and therefore the output is not a ``work based on @code{gperf}'' (in the sense of the GPL version 3). On the other hand, the output produced by @code{gperf} contains essentially all of the input file. Therefore the output is a ``derivative work'' of the input (in the sense of U.S.@: copyright law); and its copyright status depends on the copyright of the input. For most software licenses, the result is that the output is under the same license, with the same copyright holder, as the input that was passed to @code{gperf}. @node Options @chapter Invoking @code{gperf} There are @emph{many} options to @code{gperf}. They were added to make the program more convenient for use with real applications. ``On-line'' help is readily available via the @samp{--help} option. Here is the complete list of options. @menu * Output File:: Specifying the Location of the Output File * Input Details:: Options that affect Interpretation of the Input File * Output Language:: Specifying the Language for the Output Code * Output Details:: Fine tuning Details in the Output Code * Algorithmic Details:: Changing the Algorithms employed by @code{gperf} * Verbosity:: Informative Output @end menu @node Output File @section Specifying the Location of the Output File @table @samp @item --output-file=@var{file} Allows you to specify the name of the file to which the output is written to. @end table The results are written to standard output if no output file is specified or if it is @samp{-}. @node Input Details @section Options that affect Interpretation of the Input File These options are also available as declarations in the input file (@pxref{Gperf Declarations}). @table @samp @item -e @var{keyword-delimiter-list} @itemx --delimiters=@var{keyword-delimiter-list} @cindex Delimiters Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. One useful trick is to use -e'TAB', where TAB is the literal tab character. @item -t @itemx --struct-type Allows you to include a @code{struct} type declaration for generated code. Any text before a pair of consecutive @samp{%%} is considered part of the type declaration. Keywords and additional fields may follow this, one group of fields per line. A set of examples for generating perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2, Modula 3 and JavaScript reserved words are distributed with this release. @item --ignore-case Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. This option is therefore not suitable if a properly internationalized or locale aware case mapping should be used. (For example, in a Turkish locale, the upper case equivalent of the lowercase ASCII letter @samp{i} is the non-ASCII character @samp{capital i with dot above}.) For this case, it is better to apply an uppercase or lowercase conversion on the string before passing it to the @code{gperf} generated function. @end table @node Output Language @section Options to specify the Language for the Output Code These options are also available as declarations in the input file (@pxref{Gperf Declarations}). @table @samp @item -L @var{generated-language-name} @itemx --language=@var{generated-language-name} Instructs @code{gperf} to generate code in the language specified by the option's argument. Languages handled are currently: @table @samp @item KR-C Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking @samp{const}. @item C Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you @code{#define const} to empty for compilers which don't know about this keyword. @item ANSI-C ANSI C. This language is understood by ANSI C compilers and C++ compilers. @item C++ C++. This language is understood by C++ compilers. @end table The default is ANSI-C. @item -a This option is supported for compatibility with previous releases of @code{gperf}. It does not do anything. @item -g This option is supported for compatibility with previous releases of @code{gperf}. It does not do anything. @end table @node Output Details @section Options for fine tuning Details in the Output Code Most of these options are also available as declarations in the input file (@pxref{Gperf Declarations}). @table @samp @item -K @var{slot-name} @itemx --slot-name=@var{slot-name} @cindex Slot name This option is only useful when option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) has been given. By default, the program assumes the structure component identifier for the keyword is @samp{name}. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied @code{struct}. @item -F @var{initializers} @itemx --initializer-suffix=@var{initializers} @cindex Initializers This option is only useful when option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) has been given. It permits to specify initializers for the structure members following @var{slot-name} in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following @var{slot-name}. @item -H @var{hash-function-name} @itemx --hash-function-name=@var{hash-function-name} Allows you to specify the name for the generated hash function. Default name is @samp{hash}. This option permits the use of two hash tables in the same file. @item -N @var{lookup-function-name} @itemx --lookup-function-name=@var{lookup-function-name} Allows you to specify the name for the generated lookup function. Default name is @samp{in_word_set}. This option permits multiple generated hash functions to be used in the same application. @item -Z @var{class-name} @itemx --class-name=@var{class-name} @cindex Class name This option is only useful when option @samp{-L C++} (or, equivalently, the @samp{%language=C++} declaration) has been given. It allows you to specify the name of generated C++ class. Default name is @code{Perfect_Hash}. @item -7 @itemx --seven-bit This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions @code{isalnum} and @code{isgraph} do @emph{not} guarantee that a byte is in this range. Only an explicit test like @samp{c >= 'A' && c <= 'Z'} guarantees this.) This was the default in versions of @code{gperf} earlier than 2.7; now the default is to support 8-bit and multibyte characters. @item -l @itemx --compare-lengths Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (@pxref{Binary Strings}). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via @code{strcmp}. However, using @samp{-l} might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option @samp{-S} or @samp{%switch} is not enabled), since the length table contains as many elements as there are entries in the lookup table. @item -c @itemx --compare-strncmp Generates C code that uses the @code{strncmp} function to perform string comparisons. The default action is to use @code{strcmp}. @item -C @itemx --readonly-tables Makes the contents of all generated lookup tables constant, i.e., ``readonly''. Many compilers can generate more efficient code for this by putting the tables in readonly memory. @item -E @itemx --enum @cindex Constants definition Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark @code{}. @item -I @itemx --includes Include the necessary system include file, @code{}, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code. @item -G @itemx --global-table Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). @item -P @itemx --pic Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the option @samp{-t} (or, equivalently, the @samp{%struct-type} declaration) is also given, the first field of the user-defined struct must be of type @samp{int}, not @samp{char *}, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression @samp{stringpool + @var{o}}, where @var{o} is the offset. The string pool name can be changed through the option @samp{--string-pool-name}. @item -Q @var{string-pool-name} @itemx --string-pool-name=@var{string-pool-name} Allows you to specify the name of the generated string pool created by option @samp{-P}. The default name is @samp{stringpool}. This option permits the use of two hash tables in the same file, with @samp{-P} and even when the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item --null-strings Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as option @samp{-P}), at the expense of one more test-and-branch instruction at run time. @item --constants-prefix=@var{prefix} @cindex Constants prefix Allows you to specify a prefix for the constants @code{TOTAL_KEYWORDS}, @code{MIN_WORD_LENGTH}, @code{MAX_WORD_LENGTH}, and so on. This option permits the use of two hash tables in the same file, even when the option @samp{-E} (or, equivalently, the @samp{%enum} declaration) is not given or the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item -W @var{hash-table-array-name} @itemx --word-array-name=@var{hash-table-array-name} @cindex Array name Allows you to specify the name for the generated array containing the hash table. Default name is @samp{wordlist}. This option permits the use of two hash tables in the same file, even when the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item --length-table-name=@var{length-table-array-name} @cindex Array name Allows you to specify the name for the generated array containing the length table. Default name is @samp{lengthtable}. This option permits the use of two length tables in the same file, even when the option @samp{-G} (or, equivalently, the @samp{%global-table} declaration) is given. @item -S @var{total-switch-statements} @itemx --switch=@var{total-switch-statements} @cindex @code{switch} Causes the generated C code to use a @code{switch} statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many @code{switch} statements are generated. A value of 1 generates 1 @code{switch} containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each @code{switch}, etc. This is useful since many C compilers cannot correctly generate code for large @code{switch} statements. This option was inspired in part by Keith Bostic's original C program. @item -T @itemx --omit-struct-type Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. @item -p This option is supported for compatibility with previous releases of @code{gperf}. It does not do anything. @end table @node Algorithmic Details @section Options for changing the Algorithms employed by @code{gperf} @table @samp @item -k @var{selected-byte-positions} @itemx --key-positions=@var{selected-byte-positions} Allows selection of the byte positions used in the keywords' hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, e.g., @samp{-k 9,4,13,14}; ranges may be used, e.g., @samp{-k 2-7}; and positions may occur in any order. Furthermore, the wildcard '*' causes the generated hash function to consider @strong{all} byte positions in each keyword, whereas '$' instructs the hash function to use the ``final byte'' of a keyword (this is the only way to use a byte position greater than 255, incidentally). For instance, the option @samp{-k 1,2,4,6-10,'$'} generates a hash function that considers positions 1,2,4,6,7,8,9,10, plus the last byte in each keyword (which may be at a different position for each keyword, obviously). Keywords with length less than the indicated byte positions work properly, since selected byte positions exceeding the keyword length are simply not referenced in the hash function. This option is not normally needed since version 2.8 of @code{gperf}; the default byte positions are computed depending on the keyword set, through a search that minimizes the number of byte positions. @item -D @itemx --duplicates @cindex Duplicates Handle keywords whose selected byte sets hash to duplicate values. Duplicate hash values can occur if a set of keywords has the same names, but possesses different attributes, or if the selected byte positions are not well chosen. With the -D option @code{gperf} treats all these keywords as part of an equivalence class and generates a perfect hash function with multiple comparisons for duplicate keywords. It is up to you to completely disambiguate the keywords by modifying the generated C code. However, @code{gperf} helps you out by organizing the output. Using this option usually means that the generated hash function is no longer perfect. On the other hand, it permits @code{gperf} to work on keyword sets that it otherwise could not handle. @item -m @var{iterations} @itemx --multiple-iterations=@var{iterations} Perform multiple choices of the @samp{-i} and @samp{-j} values, and choose the best results. This increases the running time by a factor of @var{iterations} but does a good job minimizing the generated table size. @item -i @var{initial-value} @itemx --initial-asso=@var{initial-value} Provides an initial @var{value} for the associate values array. Default is 0. Increasing the initial value helps inflate the final table size, possibly leading to more time efficient keyword lookups. Note that this option is not particularly useful when @samp{-S} (or, equivalently, @samp{%switch}) is used. Also, @samp{-i} is overridden when the @samp{-r} option is used. @item -j @var{jump-value} @itemx --jump=@var{jump-value} @cindex Jump value Affects the ``jump value'', i.e., how far to advance the associated byte value upon collisions. @var{Jump-value} is rounded up to an odd number, the default is 5. If the @var{jump-value} is 0 @code{gperf} jumps by random amounts. @item -n @itemx --no-strlen Instructs the generator not to include the length of a keyword when computing its hash value. This may save a few assembly instructions in the generated lookup table. @item -r @itemx --random Utilizes randomness to initialize the associated values table. This frequently generates solutions faster than using deterministic initialization (which starts all associated values at 0). Furthermore, using the randomization option generally increases the size of the table. @item -s @var{size-multiple} @itemx --size-multiple=@var{size-multiple} Affects the size of the generated hash table. The numeric argument for this option indicates ``how many times larger or smaller'' the maximum associated value range should be, in relationship to the number of keywords. It can be written as an integer, a floating-point number or a fraction. For example, a value of 3 means ``allow the maximum associated value to be about 3 times larger than the number of input keywords''. Conversely, a value of 1/3 means ``allow the maximum associated value to be about 3 times smaller than the number of input keywords''. Values smaller than 1 are useful for limiting the overall size of the generated hash table, though the option @samp{-m} is better at this purpose. If `generate switch' option @samp{-S} (or, equivalently, @samp{%switch}) is @emph{not} enabled, the maximum associated value influences the static array table size, and a larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. The default value is 1, thus the default maximum associated value is about the same size as the number of keywords. (For efficiency, the maximum associated value is always rounded up to a power of 2.) The actual table size may vary somewhat, since this technique is essentially a heuristic. @end table @node Verbosity @section Informative Output @table @samp @item -h @itemx --help Prints a short summary on the meaning of each program option. Aborts further program execution. @item -v @itemx --version Prints out the current version number. @item -d @itemx --debug Enables the debugging option. This produces verbose diagnostics to ``standard error'' when @code{gperf} is executing. It is useful both for maintaining the program and for determining whether a given set of options is actually speeding up the search for a solution. Some useful information is dumped at the end of the program when the @samp{-d} option is enabled. @end table @node Bugs @chapter Known Bugs and Limitations with @code{gperf} The following are some limitations with the current release of @code{gperf}: @itemize @bullet @item The @code{gperf} utility is tuned to execute quickly, and works quickly for small to medium size data sets (around 1000 keywords). It is extremely useful for maintaining perfect hash functions for compiler keyword sets. Since version 3.0, @code{gperf} also works efficiently on much larger keyword sets (over 15,000 keywords). @item The size of the generate static keyword array can get @emph{extremely} large if the input keyword file is large or if the keywords are quite similar. This tends to slow down the compilation of the generated C code, and @emph{greatly} inflates the object code size. If this situation occurs, consider using the @samp{-S} option to reduce data size, potentially increasing the keyword recognition time by a negligible amount. Since many C compilers cannot correctly generate code for large switch statements it is important to qualify the @var{-S} option with an appropriate numerical argument that controls the number of switch statements generated. @item The maximum number of selected byte positions has an arbitrary limit of 255. This restriction should be removed, and if anyone considers this a problem write me and let me know so I can remove the constraint. @end itemize @node Projects @chapter Things Still Left to Do It should be ``relatively'' easy to replace the current perfect hash function algorithm with a more exhaustive approach; the perfect hash module is essential independent from other program modules. Additional worthwhile improvements include: @itemize @bullet @item Another useful extension involves modifying the program to generate ``minimal'' perfect hash functions (under certain circumstances, the current version can be rather extravagant in the generated table size). This is mostly of theoretical interest, since a sparse table often produces faster lookups, and use of the @samp{-S} @code{switch} option can minimize the data size, at the expense of slightly longer lookups (note that the gcc compiler generally produces good code for @code{switch} statements, reducing the need for more complex schemes). @item In addition to improving the algorithm, it would also be useful to generate an Ada package as the code output, in addition to the current C and C++ routines. @end itemize @page @node Bibliography @chapter Bibliography @noindent [1] Chang, C.C.: @i{A Scheme for Constructing Ordered Minimal Perfect Hashing Functions} Information Sciences 39(1986), 187-195. @noindent [2] Cichelli, Richard J. @i{Author's Response to ``On Cichelli's Minimal Perfect Hash Functions Method''} Communications of the ACM, 23, 12(December 1980), 729. @noindent [3] Cichelli, Richard J. @i{Minimal Perfect Hash Functions Made Simple} Communications of the ACM, 23, 1(January 1980), 17-19. @noindent [4] Cook, C. R. and Oldehoeft, R.R. @i{A Letter Oriented Minimal Perfect Hashing Function} SIGPLAN Notices, 17, 9(September 1982), 18-27. @noindent [5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. @i{Practical Perfect Hashing} Computer Journal, 28, 1(January 1985), 54-58. @noindent [6] Jaeschke, G. @i{Reciprocal Hashing: A Method for Generating Minimal Perfect Hashing Functions} Communications of the ACM, 24, 12(December 1981), 829-833. @noindent [7] Jaeschke, G. and Osterburg, G. @i{On Cichelli's Minimal Perfect Hash Functions Method} Communications of the ACM, 23, 12(December 1980), 728-729. @noindent [8] Sager, Thomas J. @i{A Polynomial Time Generator for Minimal Perfect Hash Functions} Communications of the ACM, 28, 5(December 1985), 523-532 @noindent [9] Schmidt, Douglas C. @i{GPERF: A Perfect Hash Function Generator} Second USENIX C++ Conference Proceedings, April 1990. @noindent [10] Schmidt, Douglas C. @i{GPERF: A Perfect Hash Function Generator} C++ Report, SIGS 10 10 (November/December 1998). @noindent [11] Sebesta, R.W. and Taylor, M.A. @i{Minimal Perfect Hash Functions for Reserved Word Lists} SIGPLAN Notices, 20, 12(September 1985), 47-53. @noindent [12] Sprugnoli, R. @i{Perfect Hashing Functions: A Single Probe Retrieving Method for Static Sets} Communications of the ACM, 20 11(November 1977), 841-850. @noindent [13] Stallman, Richard M. @i{Using and Porting GNU CC} Free Software Foundation, 1988. @noindent [14] Stroustrup, Bjarne @i{The C++ Programming Language.} Addison-Wesley, 1986. @noindent [15] Tiemann, Michael D. @i{User's Guide to GNU C++} Free Software Foundation, 1989. @node Concept Index @unnumbered Concept Index @printindex cp @iftex @c Table of Contents @contents @end iftex @bye gperf-3.2.1/doc/gperf.10000664000000000000000000001634414776761171010234 .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.23. .TH GPERF "1" "April 2025" "GNU gperf 3.2.1" FSF .SH NAME gperf \- generate a perfect hash function from a key set .SH SYNOPSIS .B gperf [\fIOPTION\fR]... [\fIINPUT-FILE\fR] .SH DESCRIPTION GNU 'gperf' generates perfect hash functions. .PP If a long option shows an argument as mandatory, then it is mandatory for the equivalent short option also. .SS "Output file location:" .HP \fB\-\-output\-file\fR=\fIFILE\fR Write output to specified file. .PP The results are written to standard output if no output file is specified or if it is -. .SS "Input file interpretation:" .TP \fB\-e\fR, \fB\-\-delimiters\fR=\fIDELIMITER\-LIST\fR Allow user to provide a string containing delimiters used to separate keywords from their attributes. Default is ",". .TP \fB\-t\fR, \fB\-\-struct\-type\fR Allows the user to include a structured type declaration for generated code. Any text before %% is considered part of the type declaration. Key words and additional fields may follow this, one group of fields per line. .TP \fB\-\-ignore\-case\fR Consider upper and lower case ASCII characters as equivalent. Note that locale dependent case mappings are ignored. .SS "Language for the output code:" .TP \fB\-L\fR, \fB\-\-language\fR=\fILANGUAGE\-NAME\fR Generates code in the specified language. Languages handled are currently C++, ANSI-C, C, and KR-C. The default is ANSI-C. .SS "Details in the output code:" .TP \fB\-K\fR, \fB\-\-slot\-name\fR=\fINAME\fR Select name of the keyword component in the keyword structure. .TP \fB\-F\fR, \fB\-\-initializer\-suffix\fR=\fIINITIALIZERS\fR Initializers for additional components in the keyword structure. .TP \fB\-H\fR, \fB\-\-hash\-function\-name\fR=\fINAME\fR Specify name of generated hash function. Default is \&'hash'. .TP \fB\-N\fR, \fB\-\-lookup\-function\-name\fR=\fINAME\fR Specify name of generated lookup function. Default name is 'in_word_set'. .TP \fB\-Z\fR, \fB\-\-class\-name\fR=\fINAME\fR Specify name of generated C++ class. Default name is \&'Perfect_Hash'. .TP \fB\-7\fR, \fB\-\-seven\-bit\fR Assume 7-bit characters. .TP \fB\-l\fR, \fB\-\-compare\-lengths\fR Compare key lengths before trying a string comparison. This is necessary if the keywords contain NUL bytes. It also helps cut down on the number of string comparisons made during the lookup. .TP \fB\-c\fR, \fB\-\-compare\-strncmp\fR Generate comparison code using strncmp rather than strcmp. .TP \fB\-C\fR, \fB\-\-readonly\-tables\fR Make the contents of generated lookup tables constant, i.e., readonly. .TP \fB\-E\fR, \fB\-\-enum\fR Define constant values using an enum local to the lookup function rather than with defines. .TP \fB\-I\fR, \fB\-\-includes\fR Include the necessary system include file at the beginning of the code. .TP \fB\-G\fR, \fB\-\-global\-table\fR Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). .TP \fB\-P\fR, \fB\-\-pic\fR Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. .TP \fB\-Q\fR, \fB\-\-string\-pool\-name\fR=\fINAME\fR Specify name of string pool generated by option \fB\-\-pic\fR. Default name is 'stringpool'. .TP \fB\-\-null\-strings\fR Use NULL strings instead of empty strings for empty keyword table entries. .TP \fB\-\-constants\-prefix\fR=\fIPREFIX\fR Specify prefix for the constants like TOTAL_KEYWORDS. .TP \fB\-W\fR, \fB\-\-word\-array\-name\fR=\fINAME\fR Specify name of word list array. Default name is \&'wordlist'. .TP \fB\-\-length\-table\-name\fR=\fINAME\fR Specify name of length table array. Default name is \&'lengthtable'. .TP \fB\-S\fR, \fB\-\-switch\fR=\fICOUNT\fR Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some keyfiles. The COUNT argument determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each table, etc. If COUNT is very large, say 1000000, the generated C code does a binary search. .TP \fB\-T\fR, \fB\-\-omit\-struct\-type\fR Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. .SS "Algorithm employed by gperf:" .TP \fB\-k\fR, \fB\-\-key\-positions\fR=\fIKEYS\fR Select the key positions used in the hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, ranges may be used, and key positions may occur in any order. Also, the meta-character '*' causes the generated hash function to consider ALL key positions, and $ indicates the "final character" of a key, e.g., $,1,2,4,6-10. .TP \fB\-D\fR, \fB\-\-duplicates\fR Handle keywords that hash to duplicate values. This is useful for certain highly redundant keyword sets. .TP \fB\-m\fR, \fB\-\-multiple\-iterations\fR=\fIITERATIONS\fR Perform multiple choices of the \fB\-i\fR and \fB\-j\fR values, and choose the best results. This increases the running time by a factor of ITERATIONS but does a good job minimizing the generated table size. .TP \fB\-i\fR, \fB\-\-initial\-asso\fR=\fIN\fR Provide an initial value for the associate values array. Default is 0. Setting this value larger helps inflate the size of the final table. .TP \fB\-j\fR, \fB\-\-jump\fR=\fIJUMP\-VALUE\fR Affects the "jump value", i.e., how far to advance the associated character value upon collisions. Must be an odd number, default is 5. .TP \fB\-n\fR, \fB\-\-no\-strlen\fR Do not include the length of the keyword when computing the hash function. .TP \fB\-r\fR, \fB\-\-random\fR Utilizes randomness to initialize the associated values table. .TP \fB\-s\fR, \fB\-\-size\-multiple\fR=\fIN\fR Affects the size of the generated hash table. The numeric argument N indicates "how many times larger or smaller" the associated value range should be, in relationship to the number of keys, e.g. a value of 3 means "allow the maximum associated value to be about 3 times larger than the number of input keys". Conversely, a value of 1/3 means "make the maximum associated value about 3 times smaller than the number of input keys". A larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. Default value is 1. .SS "Informative output:" .TP \fB\-h\fR, \fB\-\-help\fR Print this message. .TP \fB\-v\fR, \fB\-\-version\fR Print the gperf version number. .TP \fB\-d\fR, \fB\-\-debug\fR Enables the debugging option (produces verbose output to the standard error). .SH AUTHOR Written by Douglas C. Schmidt and Bruno Haible. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 2025 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later .br This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. .SH "SEE ALSO" The full documentation for .B gperf is maintained as a Texinfo manual. If the .B info and .B gperf programs are properly installed at your site, the command .IP .B info gperf .PP should give you access to the complete manual. gperf-3.2.1/doc/gperf.pdf0000664000000000000000000107150514776761154010647 %PDF-1.5 % 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xmTM@+z&?tBL$d4*.<_fW_wիrc;`GUOV&ʮ[v6W7TvbuYt/N.5=S> stream xmTM@+z&?tBL0d4*.<̿~UfW_uvc;Z̫MfG} I]/ޭmޯo⣩0^'^x]fkn{EK{*ʇupg6;ލ$4;gZ8, M[TPRJGeWxmE7 "/7j;{Yʋ"1tm|oirI ɑc׺>[TқEnn#bBSEV嶭mzsg)gR133w xAb;aGL6K&0+}&"?(Ҧa/ c,!-f3*Ix {asIC%hS7}H=ŤIY(jŧ Z4{SO5Z ekxvKǬ@2a> stream xmSn0+$z"aKU^CvF^p=!94gB˥0pދ s#P~k@hZ+vQڦ(A,Rf5Ħq8>K_X NH3$Ǟ{<0*5c~Pʯ5W42^!0^#rqxƘE3x z)cgl1BҰ?Xq!NAWA*d1)iȧΰО 9璆NVfkVaUJ?%͚5ػbTW=ј52f&p2pjV^cHMcVYxLS7E=1j g endstream endobj 6 0 obj << /Length 366 /Filter /FlateDecode >> stream xڍQn0He6'9U= R-!_4;;eD 65GlmH/G^*{$?%njoE73 g$[{OR!hcHV7L­+,I5Nk]>Zv_`tǦ E^vկ G&Q\.ZqZR靎 endstream endobj 14 0 obj << /Length 868 /Filter /FlateDecode >> stream x}TK0WDR8 ]BPNx[kSrx6Y !{̢ >YTsEuMo>× v_(YD{ۼ-ˈei,=`i/G{r: al5h> stream xڍˎ6>_[d`փ) &L=e"ږ=^-/DbYWU8s]wAÊ| 7~IUy* S?Q@qǁPED|s6Z#t0V|/7qxgwۺ4I ,|}W5$~,D&PR ϗiwiI. J`Q R (%[Ƀ`4'Xa\0ԶjF&@VuRB8 d.[7bxJ8n14$`,$R%( 3ew4Ox$IEeEbV2#YusJ7h![ta"A=""N<2BwL^Pf X.Jm)㒋Ll08n)(S(p@(fAŎ|@g' E+q%DC  & Yt|Z2@[PP% 2ƕbꃽ]{ԓ*ded+p6h0ZDY>x/.֚fʦ'6#S|ھq%-4.s.pWg{z*%-&Vfݐbfs!+L-HM)̞Qf&qS `,l0X4{vHV XF&_؉ӷc k!H&]>%`\t~7pF,`@ mV$w3FUpu~XAZyy66-= ` h[hdnn]’]czW+s(yA Szq z-5D HUұf dyӛt86PaMya4ONEg z!Hs\%[`ETR |:}2_8WE'[WxJ5nz!c`h3?kOo׆x W^N4cd0/%+jq##˽yFi+rӨ$ 7vID%Bb# tEAl 'Dt?PP]$yֈk/5_ss,Y lR\lC0Gz@]Vkzz4?3x,tӅ@ZFb- fœ4''3?rR /l8}.i{]_eL1X{\A)դEam/j]rgf8 7 8Pole*z'0p.zҏUx&>w=hp;`p.O{ `) h>ƺvR|3L+n1ҞNBn w<;]xH+|w # ܰ83yb/yyBufmWH?P2yA> stream xڍr8pDUYE3IŞf0 IXS h~>l̖LhPp_pW(qvUmW<] x@L0}|˧$ m~J걼&"ͷw8zw`pspބa^<&ar^ǰ_Y ydjUUuyS{ef^o (mshՉ'7cUk]2hj۩7wՅqp&c;BIÝzȀe${lJt XMmI>b& Xt [mJj'U~`2|lsP&ȷA3 $YJYM3DO;dǣܙBVeSkE-;2"`ԓ Α. ੜf1FkGXd!نG'Ȅ0,^#o*LzL ^%:ڀ-M]SE <"f!>t蜣}%89rWϜAp1 OHS%C$[CL9 .B6cvOUAr]+r 5p(ڗbˇ :`A3sa:Y[1%0h=2tzb6O Gx쓲09cQIK]! E3.2aS灉ܜxlI(Z_UQ2Ff/ HA% 5G0ݑqȁk M=7|P>K9kX^' FE?Pa wkA-TS6{ S=)aY6,= K? M' acRwbܔ B!#xEh+P(Zѡuc H]L%5uQ^88*|}_쟧2@GÄI,pA!>$6NwKc*= =rYP)msҮPKP ΍@]+TJ2YB2_:[Xx$qM̊pW jK VJWwRo].ŕz:Nqư6-s.,0Cн7HSOZv!f]0Աs}Nꀙ. ċ#Z7%9#sqN ǂX eá(p˒0u? Ns endstream endobj 29 0 obj << /Length 2905 /Filter /FlateDecode >> stream xڍY[oܺ~ϯ0rd vЧ$ISi8(e+JN;3P+JZ8!9p"H} vg]Ղ?Qx]Etq{Xnu[_3xU7||y@|kLOo.v4n|h1`/>O8GCg >=Ѵ '^FD{okj˻`ٷ]WڮjKhq<2"fx[%+;U: *4Wc3ShK%Zߎ.U񥚉Fg|q> ~hˆyp1"ʊ2= hMuߞhDWaTvquv{=gĩt摜 /<%,;AgVqzR®6Ω, '+fL#'&6F(P.>yo]dG_~ R* ;[!Sy̜Zݩ<S:|a+eP4LSC6h'Ȼjd"œI%8_ubL53:Zp#U|:Ev~YC4I,9!aK RbyC `ٱi=Wvxq/ς{ӱpI8s#$ ؒp%Z*.'%6%gξ}Xu<ф ˡp7XF֧\.:H,t ]Ƌu; @i<ߒB O;V{-ݒ@ݍh$g]x*hcWaUn[X# !; 5 x>E }4`3אUm%T?>sv-iu9Qkyv(-(ӰAN6J5Q-||Rv8S?TGn@\a#Ɋb 8`THё`Z6 థ48qOW4WyDnuV/%K@p*$$VOȦ)\"-#EzY̹|њdv˧A^:R!q5U^t"~J'<,ZȈo}eIE`b0Y<ԢF7Ҏ.xI(ۈPm1blIٕ2N36 ܊ce#qG4hKcI"PgRr:(}Vb֒f1Q|ߴubvç$RxsS*Ci SmR-$NhGpF)R6 "xh|L-?DKOȳ0$v$]x,N( ;og-Cr^0J `xZh~G ēG@uaXQ0LLPVkG;)X6x*)imScmimEKaěB!!n0Z9l3_ 9<ϖb>,,* 3AVFiG{ IpJ$f"yΓbZ4_1)"xX١Z (v jDZD擄HSsfE[ͨ%J_ؠW؞s[v1wB\% $ܱg"ﹿ)U"?kPsÍ 1_>m3xPxO\K\.KI$75<t:yͶ{] 2NSM9ɍ?DCTBtZ"w ,<^1y)Л;@>};ԘIieϞ<ᓝ9  2_q endstream endobj 33 0 obj << /Length 2721 /Filter /FlateDecode >> stream xڍْ}b/KU%O֦6S.{T*EB<ߧ/H3q@@ߍ ]ǻ]Htǃ>Sĭ?$w*ý{<~l8>?+Nt/`pfEIzǿM1R.NŚoi, 7QtNҠM#<3`C l*7=O6º*Z<6f2YOx3|+G/FDr] Rڪxf|4%bۮNcQ+0l @lx`;A8ab֕` U[bSb"' :l{yoOg2QV(x|σ4`xd3#f`ɲceo@RVTWYLjT١ Ҭ^X)/x㠶yɅHMGkaG8M|AE;7̬ Y¶øP+w{TA`@~)Tt}V\tOK/;/&G847Y aG[u(L !5ߔf[Զ 0+;5Ei+TGˑ0-ngd.b4n2j;yBj)X8#F8`%1ʖvѧ o$%sa VXѢ.#,'<& #ҤAs+ߨK]X꿢 ~63'Eh,%P \>EWj)ĐDNnUrOQ&Y1vx IK/ˠG>K0Mx> c&2+&W/3q% `0(kZc9SA4Ay%qHv{B#qUQ!3 #Jg#mAKɒKԜ[[S%.P"qežzS7I:{ I+݁)?C{yq [ eLD0k ͞3|-2׎kI:dC\.& Xfq(VP B/?V=f:b)/YG@7 [+qqT$sEASlz)Z_J] BaVS.wY|5<„WUtjCKDT4히JKDʭ)9`|chʚgn@H$ ,Wf%yGTgB,p%&Y7Y <IPSRd3&Y"L:q$}ëEoW*UZ *#}UlL^==K&d8 .HT0pqT $IijГ8pաaDDҚI Zu4wxFΨ-w8xFRIp82288.}5=4du8X׶ PI0 wGza7x ν Dg$T4D$QIrd> >352,gzNr cLԖ4ю% ԑ_"%.ᬲå.7"R|f EKu"5 D/sL 6t"FAk[HZi@>_icb0Nl)N#6RhAf2"ln~E"ˏAsw)i[)qzӫ* Q8,"\\ j.-q ͙X-04O7~.o,'?p:p-kkӸU2Z+lyΑ@~*֒Lp1s7v98|R j|xY(JI;IKs06NFⰫq<]_ܚ&>0mS:Tj%!2:b-TNuF]]hJ^e"M+Bfj.Qo ăR iTһtq( 9ȯtnɸ$$<ٽ R*ɍ薋9<-/}iTMFL$Җ$(YyK?_=XޞKz䩟3s-RFZZ!r^bܺԱC#RHуNQ> stream xڍZK8W4rru &bgj[?j%;Iϯ_$UEX(Jȏ+w]cVQ7~*0_^<=BQ?4>E_;_$(_I9q~WT>N3ޣ?wwF [F 4C4&<bVܿٶx}6C~ha`i'^ء|_T.Np\:p#v2[o?d q) 2B D _4Y1BQ: YG`@R,pG rmeei^F~Xl#ckN #~L~jR] Μie9[FLWu@ae ',,T-%SI83Q6{as&hM"aQ=-{4qY;xD3!iԲqO p\lڏ&ilX)B# X =xp N[C%EC_@_pI:x)eH^=Z_8.;0AE3_Gz2cKX'I!JnP 8:k.OAd;a]F`M8nxg9[/wFƑ0qtRu۵F*cP,AٙJTp ̛r?'FPߠ>p@g5*}CzPs5If3X Kqo]lE? XKv41K4и&kj2x_2)x oDjE||N#o~+{”$t[tXb<U9KڭllW{nj2ϘH<<"/$\)٨)[rN {vQ^A6;e4f&RF_k&zỔNu鄕"v_Xzi?έOj\ه:G$KScÚud,ts13<7SbKK (UDBt`boy\G?#É Ӧ@*z WXd[l'5͖</VsTof5\> 1Yl&R ' Xiv@+)@QS=oˮ?Aߙ˿]ľYö`s+^<dԙlru|눃JP :"Taq T1PPg<Aeē9JC,LRW0+pB?g;0NKI }uG)E'1Xq~Yc;S\ SYldsV~suGUt\մp`g6yW$sNMNރ)> stream xڍYoܸ_aIRߺ{Jn"9šZzYk-)/JZ,rH3 W]O]U"IvUZ^էW{ڇ+n|~Jɼx|{Ͳ+UJ]BVw?w\$Ixѧ/o?q8<ʯuWwYWyTw"U4ؓ3tF鷽1Lm{7YO;j;TFaak`8x" ),9oTS>_dyo֨ƽsʖɷo?4dٶ_QdIu1/$=֏=-7tmmzv#)>ph{FI7nRupgmC.#>3t_ēg-a 4GMӾi-#[1khd{R\YT" :3^ƕD_ SFtG?oxkMȐ+z 1ӳL9Ȉpwz>tE(eEqG< <%W8cput ecN 셚u! W0\p`~(b?{&3^n"gk}7;@'O}ж@"='6Vfe5Jqy5 磁5/E}#)_wǔkY)Oz8uoƏgn}F(U@;"N#HIQ3۞pXjeN`>)2b9뭬(b,BTUh>FUJsԦw<ȅ7 =U6` PdفI[Blsօrv8kӹk_s0si c-1]c3ϸ?#73cz2sLDelϾK8%`n|c[G+ZѕHpYC6QZԤe<\m (epZ1(aL=S ^)B+<\@%Won@iiއ:BcKy7>?/ɻwIYLv^$ $j9L7uMqpRӷ#br;Cgi&tb~s٬PѵaJ`~k*Au\܁?j`@p+oNyD`rb|_:aN\[4C'S+yTo@4]ta#}LG&ƒ[+륨z|]2܈Bq0v1A-ZX 4LfUg`FG1 }@ ![>Q|zsK04MyϿDQM#!c_\s=t+Aݵ0bś {U-tIK R">r'!FFOuv^ KS,񮻕<쭆ڎIj( T%tzfa$Id ~YU "4| Tuyq%-r0˪Ylqs1[8Ē?|OeތXp_3Ry(g*mל^i@ɚq$CBnji$]"[cI{ӰT hi|?z[.\M7 "TZ =+sRʖ8ҖYWqu:.'7!_b>vȷp#^By0?a}:.O0vԡJ-5 ! u UƦppUʕ L$P LJ3p"1pJ]Fx Bnj?].t?|Ja֚)6tIt.!a$2 8[ ˼o¸,.H97Ɲ;q s`{opP󣅿ejmZ, bٖ "ȍ c"Լ$]3 N_0_؍" c#@30 n}5$[w l(nުQmbdAGDh endstream endobj 46 0 obj << /Length 2707 /Filter /FlateDecode >> stream xڍYoܸ_aI[R5]P4}%Vڣw(Q XpfQoʲ1?ԗ7޿2nwEq/u'y]ew}z<?w@ݥiq(x~޴H?)?i]b<{,cݕJ>]xˋ4ϖ@,99uoC-pHOem-ilķ0 n 7 aٶAŶCtFHQ}13X3Y~@N(`frb1|!d"-P=],_Ic w7 :ܐ;!a+T6wK Ħ Z,,rɢZt\GlopC)W\c.R #VkwvP2GRuhVa&mz5a#Z`֜ܛ[ vv`.7 n3w- ݜd/-Ez `٢,MYƗ"Ht LdF8RDr`݆0$adښ,IZ΄$a'܂6F3,؞X5#;"%2{^hKlj= mݍm1vm]# 0^hmt\1c.bDYZhD( 8C!J@glu`- r%Oލhg%F;1Q[N~Ġ|O p.3В5#yȒ\Д`8sG > Ɓx0ћ L'֮ь"r.yI&B.''W+/$w85K3m& }r2%ч4%od B;A㓣Wq o|\EW|*:a[:qt4O-/ܼD-R> stream xڍ]s6=R3"\o2L>4})H…"T/̴71X췲mzSݶlnӫpÃO^eBuDë,ۦazj]E7qR&?1~_j6I߯¦UCʿ9^ewMSeE'YMj%_id_Á:x&"<GLN N1`881S9lrz%f`hxٚs{hGgdd():+/{>dS7}ԎtQcܭUQ'G'FLۍ 'z[Ñ.a Axu2fy.E\VUEY'^e(K~Q%-_ʢeA{4JNw$}"(v=ܷ$+@:rX]V]74y3wr8 =ѪĸOgD#yx#9}!q.<I(H'!6,g5cH\g6m?*ثi.~o ܻf>ykuxmv]%ЎH`V~IS8Yܺ[}" +ja({:ٓ[d{% f>ю^@\:Hz >+;r!E&~4S.GNŤo1ЇhxӒJYsVp-H0A`:z\ D PrYz &[B!嶷ܫӅGӓ"3-:B.!r㐝B1J*{{a![2D-a@P$S~D|la=ܤXw22 ?c8@hgqZ8 ) ބHv9j10ݐL- jp}rK%u-uxgljQ~7I*k`RAyTy{IǤ)ř1"&.)gR0d]N2;>FיxqZZ<><|xGI@y}X&Qg}V֮uKՔ3C?aB}Ri*/nf2?k6pFP?нK,95TaG ֹwYdόp$~|[J,/;O6d#5u0,10sduoADgB&gF8L9Ȱ,ȉycG?<ƨg9KB;4p;Ve!K5/5E&@HID=ݓ1a.>c\R)xhFl+ 5<5ⷣdrd* xSW8hodn螸I]L8 -ĵDgqƳVE%X$kI!ZR3t!F:cu.^6^iRg^BLjd`Ȓ[Rgq Mx+`Q0%OG5?1B| |IpΝG)Ml *6ca&o{D;i.~@' g gKyFܵS1;0|ݤ/fC%V&X? dHfDv 䏱q>ף0C;bڹ-Гjha3眶I!ߠHaS:|A8#Ek|gca|v ]Sb9"Wv< D˱UY5lfo 5}.^jg{TD,/w71*L%-eԿZ4ɫV^M5̎ZH̶}ajUǞ}_{Ud Pnm`}_(3|e[Ƞ/ 0z9? >k֧G{쁗}5ǵZ^ aRs^[H46յ|$/zNeThn%uK9['1 endstream endobj 54 0 obj << /Length 2843 /Filter /FlateDecode >> stream xڍ]oܸ=¸%z+rA4 rIZ%%q}"+_ 99YuŸӛ*btR||J = G?z_v>in>cR7J޼|{yz"wo 0x׷YۗI}Oyr.!R꡼)Ń .ѶՏ{ee28o.vNO'߃9; mV%F2w: #p -UYOGKZۘ~ţt# pcM[hU|CB A#0SaPl/PN}ЏvG#f>ߪ:ޫDG^$YxeTUbé90X ATE;a@o89;^sgp{_ m0a뮝=U~̓FcX fҚÓ,O'=]8O c]Ӣ` U""*(7Mpd к6f`āh/ͨB3YM_͟fYv_$BjVqd*~a&́eۗ ! p8=x?: :Jo"ك N \Xtf "lri#3$R"_X@GCdZ%Ĵ,r`!cd"ohJy!zq\)߳ ņyCzԣ?=H,t ?ГbMUfa fσg;ip?‘(LAھiP0B!KGD5X a w[vɠ {=Gښ80ߍk(3|D'{-],2./CỊz\iO8'b/@=,,&^%3XtH@G/( HGEM0aI/-U"TTUU%)'&S!\=*0PR CS@D{ 6 i͌ J8,Ts>HGЍOOC5N2х7I4O K6G1"Er(X_md[ m/˙^,rA&+ǻSiU%M*ʦ9ɞz*ɲ^9a{yM&+Ύnx됺[?Bp_vmk0JdRZl>0u-eX`8]P=pE ? JAE#,ӽbh$Z fⰰptjΕ&>sC1 l[GH4/k3f^F`BcSYG&b(aemaqHKq^HK#X"W"$F^Rѝuv!(A,oڅ'YVK.Yҳ"ĆwK-D5b<ߘL9zdK8NMC 3</:z*49#bfZ 8<{KQh{9n@ z%D8]rr%Z.QiTGL|+!=_/_~2unq\c8D(Fᦹtoyl8U{> 0ZB N8@̅P^PW\eJ$gC"*N7.0z PoۂlǎGiw|ߨEKl: ׍26|$}֐Sdl!f.nyYI"2}V/B]ݪ|lrQ7@VH=ϤiX*(sk%} Tj:Y8> stream xڍYs8"/G2ѱ[g&us*\g6_ݻJUjZ֯LSwndY=?-?){ǖSb0SfobN]k Ѳ,Yڟcʙ co2UiJRple>K`2DzAc'L~JyE>s:rϝ"I̝(?Y85)JPV2'q[f %Ge@dI@d7ָUM2ήȏLUxQNq`FpGƞ8 n KA`;ezLQ4)-tŶz"éH$*i"ogx2零ȳmTQzr1U27 ĩɱd\llYk0':ڢɸm/3R5lq78-4{?C@C,רlp XE^DG'ޢcdn:cY#6 " V$F7U+0[ &Ca0!;5J_s!ihgg){""?ɑ!v9ǩ-Q y2qZy~xqH&NY7N9lgп8:& :b<ėi/ `%tX#AC^a+6j հsjcY^1rx9ࡈw]ncI NLNL6|%!Z0A899"ZF"AVP79UV6A60]hFö$H45r,+Q7^ab,zӺ`w譌sAU[nV3eOIHi&D@Ck(+8NKqevDo: %c%,衃=:WHHʾ|v& nV̊+LdtQ0i]CT19)e8 ^g`J6ǴըY2GoQj+p;C7kJ} HG& Iڙf"R,298<@-2}}~[`x!0jE׆΅sYE4*38}Su vD{ I pwHLl*k73Qø h6п*ZRIHMtz<;\ėQDiJ80X 9rL:WA_Iq**$ jP?+> stream xڽX[o۸~0R]mifY'H,lӖPY2D9^37J#/Z5$r.}ߎhܾs x!0;﮿u؉|5_ m}=_ }߷NfǛ;l-1=MD#u3׻ɼY5T9y7`~(]?`&Aqh|7f~t>=nwH,V^u`κ]~Jȫ8Tէ/]+n͔zM3y`Qۮ'LWw8lJbSG 2+ע>BGZIsFRÙ| X -ōRtSĦRI]P" 7yؘn貉,.E-Qi{$W wqR%v wi;6#w])F^C Jc+\uľU]S+t]e}8P``I}R8Xff+G1˟_EJ@]ֺl͊ e-dEekMk4ɚN;g-sw_t]'+N¾')@ vѭ]Z*fA.4:|1 }3#wBb2, G*?葟9()uBK}.~o^qؑUBۊnwyKxmRR=3Yqd (ˌ5g7C*xy]LӉh jsJȎG3Y !8#+.MjzR!`B=E1,LVJ:K94&Uhw5ƃq`$w[h_ew'tnuB"@M<:Wh봬zE:!H'g,0c S#fy$0q}y]r!vLtrZ5!"T$%| mX :UrԋKj5|ivIvCC#w ƆOBz:R'.M#}0H3-l#|=V٨8>-wMp!<e^L}93셉?oofOF4x^Q\l3i}lg?&`ӻ0Lӓ4E7F&P\8CIxFq,׽bbT:$J-dӄi?G[I^" 0gD9ٷ eAE+uxlAvl'?#ӽÎdUȚw]_{S\l>W3b螨y^bYs݇ ١?>Et7V\msYm)q=0;-˒ }$Xuύ`i¨+Ix50b07u 5j߉FxE& ۈQhnb WЛ܎30!/$^?J,Нg|,nD;8T )̮4V]sA-$#0u|;f UiYn>O 7;ٳނMɖ}z ?}2Hx"@ђS *xTXR)V:ֲƬO;Lws7gd}(sBKDN#\ۋcЧ7X.K [ˋ3͉iU=Hv*v$1B O75P{&bC^[*nI|,kIwV:pj<[s<~UF  8|}i GBk~&gK\GCr6gBO(o_'+_q=@TڨMr# bɕ Fl5sV@.eC̞pSa*FWDvN%b`?,^Õ#B#ğ Y8uèUyJOFqQAoP"Cwd} @Q$hǖbol+Mr: f \C.&L:bYVR:*ztnNi )e34-6?#pv77/*G<[TE㵠׋b3YgTIx_J$e 1o t`$d8d2$Fcdx :eN-sX ||.ȏ^i*{CH.HA깃Cvwtw#|еJV<& '[^`g,L+WKJ**v1 9/獘n.ܞ~)_,/uKׇ8]n6v—s~)F:f\#5( endstream endobj 72 0 obj << /Length 1134 /Filter /FlateDecode >> stream xڝVI4_Jl,Kު( LNAckl^I~gI\l5[[_/$cAq%ʠEkڀ6?c0B>.UR` 2bܮ}tݷ,M啈2 X,x'x"f\uӸ,tFf7xnśw ɮ*Kw.&ړ2G+KBT+ӽvxsqMF4(-ޯ +}K,h}vY~C3|Q.$+WiU#띴X; -RFe$GLOx{i`sNja}{ձg϶xUB bP^t#(^b;%eo"f)2dt.* z6P OhojH֖n[7aZJB5N;9gQ@qmPSyJp:FnQyVפj{DQra !9(ލqPP^ͽ2zTsk1u'n#ժdm,%Ehiz'CYd}Ҭ3q_6ZW8ǓiQIX7/8a%L{TGy.u(9nI~=&Z&Z pr8·Xf~X2 FU'3Q6z(IV~+4tm7 V?5>c򌙇s–U}*l9iKyB1\*Wf*ߚF#Ia0| 5NEY(-I?vF/4 %OVCOҌuRh@-.;Ze m/߭.'Y^'<8Vp׭HVxs}'[`{3*_J}1cNdL'' VIC!O p3c ,P YQGxVp0GE= cP7pbbl^aT5$]`JY;/і endstream endobj 77 0 obj << /Length 1386 /Filter /FlateDecode >> stream xڍWKFϯ]HvWRVQvVඍ Ll&=@S]WhFE)I!:\#"mL@Cé99@k) :g(&I^}SsB%U~Flw`$]]7ې<B=WX%^ TtN.*&x i/:B%4rP6!B.x>AXe V҃%˔p6{t?jhfö9ǶO@Y$@۾ M7zG$]faб ->(, 첵 FR=*8tvbLrna;,!+vE8,R;޸Ԓvn]s.7"X^ٽ)ٛE۵?.}C+(Y6㕸=F ?JDF@ FfZ 8  0u3Zp60vr<6I\c]y#aYç/{lO]')XʊW,e|,C4X:?$,d~vW?i_S"{140撠%jW/yQ`*/驃+RdjP("zMzv#I!De& !]ӁNh]ځtf>wk8G; 6ˍ;S2)Э=7Vs "(qz2ђy~c1޵PC=  n<(q,{q@=>!"b=qB&_>thPіf$ -mun˾hWO&89 N,9 o m?ԛ~ i8hՆI/? endstream endobj 84 0 obj << /Length 3295 /Filter /FlateDecode >> stream xڍْܶ]_s"C7E>bWIś8\3ØCnxHZ}HRі4`4&w1K.:*MqW_w<o 1`͟Oӻ$ʸLNwiD8tXݿ7=R^y$b8PwI$5x&P&J}f*u涾u^'EqeW}Ã~' G#tbiOv<1*˨2睠[TS7TPD*\9rM"B2ev5UeVWobE`yc;_x\=OKTWスcy`G|觷H]2T\hJ"By\(KOxmյ.eQnh'GvP<*A;ާ ylCue MORu}t-\>qiG!h?.tU` J& 428x MhQFAje_;Mbq-iA&?zA * a@Pxx ơj +sv[{Z:77`"T&>;EssdNT޺= H "/6OGQ[3ӫ'yPENbǏũ 4.|<@pq#^"& yUS֕Rs|+g'=츓x&50ӁzT2E ; (EbOcھaǥytpent`vWX*^F $Y-B&H4ilsIue;VLtb&RALsli5zQ@w/;.{}v&Ei;.4H~Lk y8Օ?|0$Eac%A#c|+*R%5BA,oJeGL/ՎÂq)VcӝgNק^~j$I]lسenѱ<!w-r}j(1n+=/+X U1ǡ)Hl` 3}] hWM̀ml-!{FxF}uaXW `>]m4ݤG\&6q;o%h<GBQ1pP26jByqJQz:^]m m"U1TN&߳0 ^,~poq%Nr S!Z"{=`k &;VM:"a᥮\l\!^>R(dġif:"Cv=%k÷ -K53+Q_ V$㉒'rC@V{|a F9EY$v:_ʲ J.Бٷ N~|ڝhQmXxcZ .L byN1WYF+i'^ؠO1=IY: gڝ3C373[ t'9??'Ř āΝ{k54 m=Vnd0՜?}Ab1q:5 aҍb=.( j!QnUhH)TO,4):`'$~-ƫ^ L@HfND5RzZls;UB:2xvAc9ǐ!7!SG(faW7^>K)8 vȢ$}27ܜz^ZspT_IJzCJUK_汁v&~0KÚ <:*ay[ ؾZ P@3IoRl{*qCZ!sZo$ M%Y5* ֢$QVSƃ+}aDldTcd*2|I/34pЌKiPvB@y\L5+5%n@k7^ DpX`SG g]/<ⷋ_8A{A|!=(A2\yXUKr@Y$!#2~Ƀ-3ylt8\DR65-rbC*3 Sjc, ʝI[yMBm[mU"7@D% y1> #Ϣ|oLҬu9' v8UM }q=" B2Đ'sg~P$Ф)0),`M<-Ny1A%C` ;e`;Ssx !| ^ i舤FܪXvvj5Q:ږyVa#nۿiF`7ðk87Șvt 6I`Qc-#2Wi[ endstream endobj 89 0 obj << /Length 2528 /Filter /FlateDecode >> stream xڝَ_!XXLɾ=Eb %1n>l~}X>$CEXJrOnx+%J]lC};ظ՟JӍErsؤR ]LՏ#4I^x%"\$2x'PZH:ݥYd䎧_J"[ow*OlWڻB@ߟtt>)S!؏Wh黤ENB%m?Y_! r2݉FR1=0;ڋmMߴ|K6E#F%"x[k;#>e"i}Bvk3f :ԵEI"r6;L%1Ncx pxĔlPכ޴{İx$PJ VLh7tvo[%7"Ird1+e/GGg{KZC"U.IQyw_0u~Me"XcS3yM#ø ;ne6L:oFfjCՍ?|%6Yi%5Es!_RJZe_6/H.D3Cў)ϣPnj\K# ~{3BH/]JE#6qƊݴgڈ0 >7)# m]32;L(CIH$)L&:Y=+9aqWÃy;ڀػ^V2>3x|>S/&YNYC4z/iLT1a閱S*kRLea`{ DpHL4x7kH%mre߹;۝UΒ¨!oD~Wj1ZtB@$D/ʒ4ja:ޱ6ȇohof!‰:4?Ԛ=خZU8h!D_CE[+ 2#.ۊ"z!մhqD` #prb< 󤬘PbH8iEoZ/RuHˏD\R[Lcp["`Gj- )TĈGK͚ @XeF$)+=ɼ{u1@ӪeH{7HA5 [l}= u -R񅜅e(ٔ.=(k 7S{9ԉd1>s p\>8.OwPC|^ը!Gb… Cfm)u!S Ws5`pCpR,<ڞEFX0 k4P,]A=CAH.4CEbs<sElL.*' ةN]nR݌4Aa[r%!ŽF8)nHv m{k;n=Aʱ"o)AKHLh\XVkZ m:& -}`;n*jZs,uAl  C= Mb?b"q4B'7i˃ G,~4m;XQpzRv`WDE}AHM'R_ς}O[dD*5, |;ye>m2YD3#|uk*q|c[IݴShI@g]7\[&jD9뿈?]T endstream endobj 96 0 obj << /Length 2187 /Filter /FlateDecode >> stream xڭY[ ~ϯK:xA_f=A tVGJdIE{!Gy ~\9$H&d&Zd&Wj+붰p;[W]md(0nc{j֘(<* lEsپv(Li{8(L9v{^`HI)du2E~8 )u SZpFHm8-$QضUiwkwK Sk?tc1 **6HD5S ƿбglWL4+$ ~ @'5i,8+[!Ձ/2Ǒ?5ɼέ]c,NE+v.G/žHd:q4qb;b5*i%Nc~cU [oIZv ~.w" O|SeР#=]pew HʁC7T4 Ve2룅e}sgm;aՆnG>P TBGRL-G߱Վ:~#ܠk\~㓓I"*$".8\_*:.V[4 hj)zfv ~L^z=;܁P=޳QǬٺt (Gh[voPW2fJW Y" w3ܡS-%Bܩ6sn xٹn@?IomYJy5zpJK#t_;[fQع gyP{](tW'{lo4(s86Ӡd< K}_444qv`` ZQ'(TҺ# pAgB [/HVdnH$ٯwv_֖vU3lo>+6W _l;^ՠfSS&;tcf: 1[yj+?'0-h/͟R˱_փf^A:ag0 }X |%))4#l>`Q']s=Vټl?o~ξ~dcޝA2J@! X۵O(^RV88]q$(F]Y=/ ڞS^80Ί3>oIe<:,]*4^]S mr#8aRwbZ?c1L/uxq-QPܓKEH::רJ%1%z0ɁKۻ]O4֎{ڟwL2OsQ>&uNƌqA +8mQCݣث )!x@czyDW:xf*g>AN `V_BZcfM5j@cˇcޕrLURRoTuĕyUĥ'>Fd`+ 2[foUFj[TGe; 02K'7OŞ`a^~QTe\aB`.kŅ_=09#,#O5i#X>`9^IGU~z|Ҳ_ B|1ŷ-,^[Ěc=pQ3s 8 5bfep`~58zջg+p s)Dggd g:"L*m]8!i7}PBI/3;U@ :"5 >4br+(_k@$5 bpԢ_ 3cv{䍋W )r]RnJMԜ/ēr؅鐋m"+ؒ@>å:2X4ImwR].bݙB"3BNa5>[ B+\ _$ CӤE|wO+Oht}-"}״RRyyiO )!^@R<*T:tX,gkPNnQ2u՟]\/[V,.)P&raU|~͊ȥ*L!O}&Q Mh2މ%€+$;=4Qb W0!n>>y46ٱj0ޞnP͞|pX}qW\> stream xYYܶ~ׯJ*,2éhr(yJquk Ǯ*"ev=mks_07.d7/gXqήnӥnwW6G}:BPJŇkEI}16ȠSovۿFt#QKs8ލ Xq,A/8q珟d2bBv\]DnWd@Ehlʦc,J 08,Mۭ7#1?%H*d"bz^eoALkuOﹱc>]A ?IvfAuL:m*Cmjԭ߷n8,Ru;{=~fZc'2#M}it 8swE]*]} ӮY߬SM1ka iIcDFT,ڶ ]=͸X%h5i$Y*35ם:x؁mww5E- +w!6v֞0e[NMZ$V"CF~]]ŚN~pT:? BMrVd`m9*R$tk,8tL*wŶDqnOJS tok;mWh8Wdzb#ҀQ3WwD W}:)­n8j!|2AFMjSB:P~ 0jR6ҪſzZ%.ҠrEG`x8LkmLYR >V5d#e 3?Ln5 }q>MH7uVr #C\s!y3yn *Yw RW^ջ )cаҧU2J.Ppdvܛq5$YY xmXH#68$VS]?Zg5u' ݄YE$?'gՈԏn_g#M郳3-DM8o*XMrK /SFXȃMD tbiT0ܴ]5xU픍;m܉t)X$lʳ)mx`oPiCH;F<T=i/"TJLwvSk1f˟cՑzQz[tژ3n],JM/]D3{'ESfQ&Xl-gCyGlg`ٔahr`*k8Wo|㥠,8k<CDL#jq:w8#CS|ch,@s78 B'>$ŃF\MrdrEJ3#&1p`־!=i hVqPXh"ћ,G4y˂<q%7 7y0+ܬz|Wk΋x!w{Gp??PGvf|b%p|]rl \RJoazMa]IL"R* ,&+N^ih˺09qˁCX~-I+' r5ORNgÎ*/S޳K?vKe|V}-/ii|`JA`erdE%3`x9ObP*|N! \:YhQRh{Utl%eQL4#$=N-"\WC"ÌK7j6,䖾ưgBtWȨy-/YAf);5Pl #-fLAVX?+;HLGӇ}[Hbj@ #P (m%,]D4:h!/M[ ?'<-=)禣g*Oicфmߛ_BS1aɤ/T+YJ1m0 xPݥtn;f 8G|":uޑ|4?KkIpNOA%zE(ՈaډX%Xt2NBRc[>|haK6w4Ö;ݸ ;RIǾ%sExCaPBГrlQyP7`BtPH  y/ _pC{Q2In+Hؓl%q w s5%j([gQ;Isv 64h\x+N PvD,^egΥlR`Jw[x7%OGj[MjtB endstream endobj 108 0 obj << /Length 3015 /Filter /FlateDecode >> stream xڥZ۶⦝&TmZ;S?Zۙ/3-$/׿ .^o8y?yWR"Uqx:j?_>mTޝ>`4z``cZ^%`o:Y4^jط+IkZqi;ny~4'aA\;NS3=?S's2*lm[XJ IeYX`8d/րuЎ#b 0`ζtL`Ղήt.TsM{M/ZR67h<6QuŤx1B-q.mY:ԟpCLG-^ O2t`4~=҇(3{jmOu _kM=ų6OǥtluMeM]4uWvN ؙ:Lt>O> <IeMÉsh`ҖBZ_8M[?o޾&%Z"򕝩aI4x9~ HGC9kq6 LWaY6`) Ine*^^q"/[Ӡ~)Jne.E%3-9 xRh,p=+/4Ģ_=)`S_|~z?Oo7j C8KOPINQ9 X;?p4];n- /S&\Z"* @fw"]cԶSP M]~/C$a#MvaEň6Fܔq:Ѿ;'s{)..M!Lqc ji@' ,۸+i%1QޒOatD/X?WYu|r$)bl_ĬZgqr u[ӗD 4Vc-uHvq_6'?>`x\ΝeΝSte]%pe0e-;c"ΦQs'>fR|y $Ĝ}I :v~ 52ԁ2h؈1Jh o]\Hb~֣ t0R^bH=b}{*uw֝+$gǼ^e Uڞi(9@%]9qOs?Ǡa~ WƌBΎkLFՏ&C ]&wO-_sNU?ht>1#sHMͫ{lK9] #%HgXr;iwK0S֟ӿ FxKr!U<- |+ _?J endstream endobj 113 0 obj << /Length 2704 /Filter /FlateDecode >> stream xZݏ6_ 2P)({H45Mvzie*K(up(Yʉ7r!9"o>lÏx eRÓ?y<_'ϿI,f;fgr;ӮC!D Lo>|k\s^[+;dliͻ RӅxE: [gw4E,K>!ӓ7ί=r~~Jˈ I{ItblVmז.<6M)̄,?m#9p=CU4B!"Ћj,MkM],uݦ( NG͆vdAf#Z Αbp5q45EA'bF٘ۜ(a (dԉDz |Iܴ_A#IG_"LuZH gb$% Z4YB H¢u*b6龜VҒn}VGI-Q+J҈#5Df(v5Pv%s¡z?<;ƻ5vsCmezzX*leLVH,+;P|8bihMzC:2s7"c:U򻪹ͫm}IT39f K*<tDFL[z#\iL`{qZGLQ\n9n)̼+ȣjP 1ۺ4^s-GuU{-QôH@'mg 8l9/`۴L]ߓ~BRbiKc%H$SDlijQ1~<Ƕٵ[^VykpUyhH񝩀$/jc O񣨵 mQn<[zp@@FX.XWY'5zTX4 ԝk>zЫ%(Sg*5< 2847.D dwj0қ X`/KKugc P3J[Q!.zj`OOB VJFswߓQ"}͏7/~?~W,mLlji4J8߽}#Xf|c\\MG?;vyJL5&;`bPB@4#@QB w[❺yR!?;Gߏ4~b ,=*>9z {n M]x >ipc :AF{U 4d!RKx!H"^|q%g 1!.rVCO1e1cT]$gB)>sK)Ǽ *|l q)"S"-'1F[0|a@m~4Q@XίJ4En&piISEuOB#n1រg1U qB( ]|.7R,g9KsJ-mcz14a#}Q(#lF7AS9 %#4"QC#vr TA#<6cҠQ `(*xO &䚘tZ]'!/[UˊAphJ.GZʱ"-xEZ7E$Ȫ8k:6Il[U:Oٸĥ( 炉sGե.ꆚU:4耏~J`ɳGl( E:OB}!1a2ٻc&.9DEJ=IoNN\5`].M_wq|il`C%=\R =Dh5ZG16TJizK;"* 23l"w>IMDB]GBeb0Y-**ʩj&Sޥ;qv(bDݢ)B" lsQY؁$Y.ϑt.j\k1PZ!*.bpI()_,b(t- G2حr%fdl&2\52c=Ss"Y}Y8 |{~>9=&zGHC\Hgts_8Z " =6@+ҘeadWg˺0DZ/Q4cYֿ Ij[Sph80!(14hR4 ,Г$FJe(>>SIepU$QXz)_ڎFA%8@ucxM[:U_×o:`LHư?.:,](I\ڱ3@A Gym&͇<]ib'4?]=cɔOSY\yBTo3|ŵcSYXK%hu$S** &!t_Hݡ]]T[x(,B 2۴+{mf塄'~wDߕUٕ^ #ֶ2`hWEKHmi8$(;k2צXC/in4KLRN.smaGT6?bA@{ z{?6 `QT%z% ժ{?E endstream endobj 118 0 obj << /Length 2335 /Filter /FlateDecode >> stream xڍYݓ _I榫̉%3tuiuPw\JN[*k&{V2/ A,bKU(UZ.6  q5͋lĢdq.hJ)4͢oRih/fq ih\'Pɸe]V;;3H&H^ʤ#T$*%uk#:"nn[Ѹ7Dͭ4vLon\< c1NR%anj,N,WnW\I3?\ho-|p)J0Y͝ m >f25!ޗ׍5GP@7րTtζu5nmhdbM#Z仗!S+Z xtqiY8iӆ: ګw~j>~z4Wgѽ =7gŭ>Wj6%7rI~{2*`Ϻt[N"޻: BvfݻdnYA8dQE! #9;WxEwXJQ,$2z ծiWxTֶDx.U} …3 ;\!Zxû)a7(9(_[LԭdX)Hw6рV3vzu(mMmHYqErr.{=YH)c‰pmG2 DFhm5C>h[wxqF,h dAX/!0]lksԃLsM.Y.2=q&OGWܚ*_|I0nmY@۶!VT:; l)`ok(s7b)R>kuyHY|Fax֨6R':R6+o 2XۚM!O2 DҨF,Hsy-[KBq}P`0)" [fy +91m4[ZA`@Ա'j۵+wq Θ>ҍ5L[`tL/ `^LFY*$趦8i-^DsGg1&K pWC<΂0'Lʢ_nt78 G ,Ҧ x:٢LBw7vӺ1+TdPtNkoux\Gn5Ch k:s45h(8*o/U *dν"JmM&J2)򴚛ˠ,C((o("Mz;#4Na=SéI $\.bXgcf"#j:,F5ܒv7p/x͝-,bz~AqPhs]ci$:^ǽ,]Sy됄8ﱤ[ԅ?|3dk}8b8pN֍VYEaMhlK~*uٝ!3p{7׬NݣkH&h#ɀM[FDwh?s .m |_C? WVmNOUb.@F]ckm˸-)T]cVu*@T@xV678g# lPɗ$9Jf7oIټf"*mi\#yq^Q+[*2#Zrv[Lj*I]5[&ui(#:{"Q 0Q/1E2zW 1:X`}PA]ѶzϩTM[=b )qdm:<=63\)ƖRNOuo6'w P_@SA6ٚ GV@St8=Mc\7n,we: W[a!ڕ/-%'^%D;LU3[ QxL6k]Rw̚2h YP]_ wـ>uUd~jX 4Ɲ(*H&d_^B_7wQ%Ϝ@,}wbۧgn@zdڴjoNmhTg3/R'!ًo_|lcY' 0]ڵ Y@G$jB endstream endobj 124 0 obj << /Length 2068 /Filter /FlateDecode >> stream xڭXYF~Ћaʰh#o$uLYC8=RK"BZ.߷$@j6uWUV تHVq!*aEs8pR+ER~Nv9:soF)Up`>y}cm[qCF͞^|wtΈ'E|gݹ@x3<[?qi.c&$1zR}հ+ݮDeuEWw.D4[|ՅaՆeq*q=U5gORQ,vlkĶi[ӝpDS,܋L@8g8$9}3Ԏ]Y\&2}exF+HV+Fʮs0C 2}]dQoJPjvhTun{@|{=7~ILJ߂1x)oׯfwck7N3YWG+P!Pʀ*OKfGONi|晕`j~zmFC &cZ.;;J|QqAv]Yixx%N'R`nh J=:iDM$tYF}B" MI%Ra*&/a2R6$=+- ѹ[+[y-@MK iUYL݇I,Y1J >7ѕC s1 )zG3j ڱZP8i~A'cX' IMDܟC 3LEB=[=q^gHtʖ$к9\=c5܈-|Gk vʠL pe8u (^KܾAz c_@t>"&Bqb>c mXX^mSy"3EcѴڡ7{Bb!y̲BF7XN2wǦ*4ؤ::r]sro/{NpH V@ \E*7~Q3,EWZZDwpina9jDkWm3=q> stream xZK6ϯK9;OInIvNI0ٶ[Jt~VJ/7=݃AEDQ4Y,V}UM Ho2EaEz 5 0p=틿~cLEn>վ<]։r6&URy۴թ;Lчoy?a!7_H ruv'@JJ!lzqSVgG>})s߸ M뷰4O*[%%T)e_m]myX&7۽]?~ʺ<}G}+4u׷j%zΨ.-v= k%r5.8d lΰt:ZvǨ \KN^QA>6uL{ulW9VDl{}()rOAbȨ2EI ={|P'b.s[w22s>:5-M8Bؼd{3E.jiF>( @g(ΆF״{8{,JL:&D;XupFFLelP%nb v}кdb_{s:7x)Yҙӈ%uC@s78h#=<uFm$?yHB=J;=pBϯ_G#0j*+0Vэ@zl4'dI5z@>zsՆpцmFl?] 8gxכ)&Q1R ّ1iX7=5Ν߾ pW Nx wrQ#nmbRN`}Ǫ&ލ005lc҂2 (tXY>G$nfe`p{^)u8k0d%dyD>@@G;ꏶ7}l# DBWMCR'|2{l8uWOx~K^ʚmR Uoٔ]; hhoCnXrK+l)7SBW-? "YM=9:8a4"s^O ސ[F͝}9)|kڑRE0ALΘW%d$s'4;0t^d~-da>%if؃Jg0ǹzDE9wQZynGCIpX9C TƐ@4j' `47B;}j=W8L+c/75V}K \QXo1 !~ "x}N/NKbϫxz==K'r=+%TӃ{RxsM;î;A<B)9Ph=E*A\v`>=h0yUO!f|y$ iTC-;&݆?鍂- 1Fh= cYS u .O9 Q^K&XRNGz-29r, 캯t<7s5^vLsͱ{\Aߕ`[< `Q榀7|B;])LGb QdBcgc~QU4X@[HMChi/8V䕠IueM*Rl<M S; ]hP.|5p|a93ObTNp;O4'?]Nӥ4\r~eBMGLj="^fB?NIOC4UQط0F)S;zuGfJLAϬ/ΔHTs@ 7aYqn@m*HjQPjaPIO* 䏋n3HJ` HcT%0+٬XXk,8KL:ɁlQcEAQ^Ges|ea@ 5i8_d4XAVDcvx,cR:R)u}/y"zejdf7Td-BH)U.FDXdZ]^YX%n66>pUseݓ)q@2i3U GD ٧ ?.Jb*d=h;z &٫jSIrC8a\d9X-F/8a}b f{sH$N.%V<{z/q2K*FUjRL*ɦ2vJ<3y/_'ncC#nT^Krhơfzi(&W㑲rp]* p U);?q#~{O> stream xڝk!Qb.!q'A(O$63;\RG@4]71MߤJEn67 BXV~y_s#(sqsouGP Rz}jmo!|WYP4tithw?pP2?HyOeu SN*\⫻(#'gFHD2I#4"}Do,%kj@Zjo%VB]Fk}<zw(FVAf`VY⪁`76p 3(TP4[ZCAN7nJ^qs458\6m[>k_6eW ;2T$ QW$Ge 0Ime8Y¾GI@%OK@kad%I.Xd-v(ƣX5IP tx·%qJ ,eV :Gh@_d%/w#ҮhtQiN;m_D @L6a|2J`YUՆ!eqR/NԱe1s_п~n=XnQix)++yoPuƨtV$Hd X1sǺz_x3dF\j63܈qn.5x|b,R -ڷ' T`OÇ-rE * '{7,¿_3gP-AR%OW.rqH!W6>[ee+i~C2zb)'Zr,*&z[(qٍ9 2;86A@(D#XK d2}P5>j5s jqHyJ=lcsvtQFAP"4Z0A"~V08) g9:(eSGW#B+?=1m& 0WP 6|xxAy.G$ ? x.'ִJEI.rO FX0VEݷuY=H8t%/@ŪfA,:loZͥs]& y]*ҬFA:Kt V"(A'3Da3d[{cT5"G{aPzeHGSZJAYd- b4'-%ٺdN#+ҲE0| ɃɃLyaU#/녫S5l:f) vE&[*&plHHsXP`Xxl0=yUy:ޠmI2CB>\>@2GS.SkVyU r([vԳրdʻ\Md7] \QfƵG颍km|_EچAapŰ:yRXFZ ͓m8f?8(Tt]A~)0iO+pМoIO뇎r[\Oҁz-؝U:)hODzh?LL`޹rF|}^$ OEnVO~L˸<>LBb ~d/:P6O B f&'LP̢L/i|s^:lV]˸G).8(I})>s-1&^ "G%LR&ȣls%Mb/_K)u7"x$!] QcTRqFI$ 3OҌY@/s!ZE ?OU-O|ж *&Enbڶ?sĥAqOY1" Rhޭn=j|P1/ 2Kj5վ͢ԁh!ey-15既Vndh[ogn(8p4̿}ѻ[TE|"?WEmi '࠹Wv=*PL4]g7t}n1qoA/mxaM[mij Y B`؇!syɶfp5PnwΒ T$dıF*]wWuAό ~QCsCer2šIgFYUՌ0m3wrqXKqhk8u3f!5}> stream xXoqae\>Cn۽آɷXM,w3%r  bj8!*?*UTT|9=ݭh 1p~wd%⨈ zخ!"\@?()["W{r%HD㞠UH(Mu2JOKCUZf?~帩=/k|~ϜǶٵ<`MS*YũD"h'/vA46-Y<~Os5XfS$Z՟rk԰TVGnS̢puU汲 !a%BGşaw[T::=E?25IgDPTW9+t庞͖l p P@u$gF$(7L2=cj*@@֐щ|:SO㏮K%kRVbu1i㥆[{Ĕ;#¾RyyTVU!ܑiќ v`* ^4AQzfarϳc+;w̽0vsփh(#RDhD\NUM+A4.M[.ϑU3s_kMÖ uW\0\rsq^^ P3IỲ26pe7Ee]jRvE$d>z!P1 c~n*ӚQLy5DK$Xk(dZ*t v\S=LK>Xhxs~') TR-&hGY,@Jgpބ ¹Dz=҂Y(2ב.H|<_i˰;8ЗIT׀)FO<ӑNO$s5+3T zFHD@*v moXL K9Bc%Su~ť-;y.9b [jKZMu9D8" Rnϣ19z̵CDЭv%7_]Zd2f/C $`Pofd-]:zXTͩwC#qG~bL|a|➸ko^kC z347icJt1?gKV[ lŏm'=`dN0Ñkӑ^$}!JD ى5·CbE LsP(x1Ӓ{B㍁ E~ܖFn*ӇȢ<Kw߽7Y#z1A ber:M&Hh]tߴlK]e^J(]1ps~|~w[[Yٯ!Uܮ\ 7 AN1LAMc!> stream xڽYMo7ﯘczÏ!Y h@[Ql$H2ر+\j8͐r#Y T,'HD; ޓX2q"@q2:O9dr Tx6& tY9 C~3Z/~8q ń~.P7~_v#.T `*.G)R1.NƻH $1.8^ `xLN̺D (x0B Ra(e ,K5:5B<0`Dc|b+D4[h5 Ո5r3>$NiCֈ#"p1UQĤQF:&-(jHLQ09#{IJʠot2lȹbd I+DU9&QJD20I;N1GΑ$A$Udv訪?GT;Uj4]-I0Wrv-1_FgԢCR*r#Uc@_)5ȥiB~]Vt ,o0{UO䰉x>A WZRp zNuR暟lqʞ bM:^ѥ.4;{y<NO_Z'3[\)w)? y䬃ȓeC kڐpL\V_lr'QM̞a`S s /Pk-ֶ`BOPma=1anm0f9 m{KeZ7yw%A+jjssc.?_QK% zbqbr00fzOҼE2Of궾} /'Z;٨$ +p@򾊣A풽.&Z&bbjm)$A Hxm};S!,ֆ]?B{KIxL3]nU9$gHXSK&8Z؛+J(,%n宻jفup-EW ~ NG-6۴rm!?z۾I'nRlrl=jH(P`^`͐V6}(}z<=_e=Y-]M|}L?7m4ڐaP/c s;Yz3v`Ld1Xv잸hu})p>289Wk޸%ݷto.{/{ MGQ|5M[~Dؔq)b칒Hahׇ6<=i@e bw_ endstream endobj 157 0 obj << /Length 2250 /Filter /FlateDecode >> stream xYY~_1@,6i@q٬fG$b)R!(utShvfu&?q7RQULn{Ã߿/ps#(sqs.u9[vR*_߆Zms+7~B"#xu8نJQj2' 2(!K2 y,x;9R1;pV6eWrEm6ž\:P"Je|<7y*Z$b>YoE:;vؗ6shf]~Ptj`L[ D|-OJD}{yp1~W<:=uhe[V3xU"wvN;̪ݳ.DPհ6 kPOoyt?3~ i< 9N~^Bx'0ŖǏH/&6@m+ ʆgʮk>dj;s欋HH&9yDU h,J 2"vRPJ$􅮴Gb>9J߆"hHvucuTyu`ftxY埙<ϩ3@F97VQBgވ;DW+,Ԇ%=Jpf%FCa]nd_4^ đTX`yg6mwy׎`g>6tGBlZ2HvkP&zZqT'>%Lյ2MDaoBɛ7iu2=ruH ޙԐq2!(KG`T9+ 282/ drJp|Ylm"f̼7&|r>lyxL"#u:(S&xP3uP[ ̞5U$\MxZ?(r=Цf(lPՕ(@¡+*]YE_M7I!V``L@q"xY}Ӵ^( 63CD2J2i9{R .(Mvhw-qSa ;~=0|EU54lNGB,яmmÿ.Y,F. h 3.Wu=)(ۆÀOV}Y(+ ԫF"hԴ)տNX`Ϸ!uTQ>p·{%u^n_d%RXLA_&1c-Irb D(^Z8ׂȻ{nv7|$gErA ~PPfgeU:"GZSyfy+/ܾd W!6.-& j;ɷ4E {J"âZvCV{!xh\W(o+%zGfsu C$"(ymW1 PUL#7i{seNt»<8?o =O^_%wl/-OqvJڰOQ¸ӻvEwt!İA끚Zt͸N2ʄYVN|[D((ݵvlu{[ՠ՚[7z.zEcA]uMIU]kry\ԩ`͓Hq&8[576e׆f@ZtUME E>-jw?wWLExX67ʺffNÛ#Sȟ a0.0 Y}IkH}$k!g'? &EJȺr%>k=q&{_ywPc Jo" LB()Q$ԛ{}?[׼.Nb{)D8II=m{g,uvI J-Kݿ>hp34T_hM H!^\>$A)r9o5~p7"[>lS-LDROcL "V'>ݏIh_pkɗSOse4$lG||'TE) > stream xڽYsܶBNSjC ࣍3u4Qq;>%θwLjG^#OT%9M3b ,,B'ϲ,QJd:=+/B3& V H~q1L" 3yv.u>!޶+TxyOsSB2 |:ۃm7NnBE1 jTDO/NJv\R]p{%9;H9inj3E_6vRjaeVRE" BZբJ$GfSUj0n;Xw o;mrsfvIbmv6[s',[( 8h|F&nIp:oB.^GBljDYmKv#eh6PB+\uCZ(ږis5˻Ocv3-Y1oy 49dn$:LCU97#)A3JLP; ri1K-ѿDԙlt:#l i" EnWŧ.C\Z]h¦} 9<΍ k0t((Lgo;4 RHb'VùmI"d& .{'p)f:ՋH6o6AӼEW,%˄\XB l*=xԡ+r*R9VڿCAED% KlP@L(0S/Y0esZ`yvvwW2$MROSUɘkH](uQINo 7[zqpb\{5ޯxj_iP.(<'RM# 5EBSv5?AB^\/yA.Yv,s:'ǵh6,υ2'Ad0=~Kf],=|9kU="MC)V m߂g?{C)u٫sz!E|u2OkLA{(3|Pf E|z%EGy[xÅnH$¦2,5uz!,Ngmkڗ"-vE]<=⨂ݺug}[j=pI/#.h!$B۲1LT9& (W]C/JDe^P!iÜHY*}0B!p9{dм7Zc!ayO 0Jobǧǩi -؏k'TnY(o<2}~]9iI)Y]ɵIN5DU:||=^ WiE-Ͻ#ma8w!_5q7|RʻNowdCO[7w(wŏ\]og/R;ۺI %޽ =zBm?mx_3_\ Cv: }ywԱ0Pc=x3?bnYMgo;Xѱ:B U+mC/oxx<,y"^XdJ=3.>.Lk|/\Q& *u~/D?3]#,vٓ4 $RлK~/|gX o o RY@1{0Bg355 ER Ɏ +q<6?C9;TX_ڀexӘ5PnK4^f{=lsYQy=}t E^9[73 U Ѐ=Q(p"}kw|Pp|L] \׎YI 2i )Xqv2~?dPSw+5(7'`-:H7Șm'}O?K/{a狰"E|l7@j endstream endobj 168 0 obj << /Length 2614 /Filter /FlateDecode >> stream xZ[۶~8/SW8u6=v8H|b(C3| ݤM"DJs=-WOp'JGiپ˛E(/*x]- >_,y`XG klyvF G2~OpӓЊ+o;62bBqω.;|='4c ܄LF(SײjYVy;wJ"1I]6VR6/^>YY =Mn_YWH [PolՂZ&JLrqˮvMYeeewe>w#fԉUiU^Mե7^v#3uPbQjqF!JYS [pLlѺ$CV锲-V`sU[&vAIv?DX/R[mc;Dmf`~ s{ DZ !UbW sNw6r[\v5ky H&+$0MFK55IՑ遲o v-@"2'#I$Б&Kܠ@tGt0#d"x qvPpH؟+ZW~+p*wC 6h u)H?( $} *!ca$l н3Y;=SpdQ2L4a&D-a]NP{' 9Ъlvjap @Ze=x8D獡JHhЊ51 9d)dG?G#H)qV)tr)BEEƈu -&1"h/ѭOUReÓ8L-cL~538֚rG?-OgfEq~o0rʛ]ѹ΋jQiW- i6k،L-"jk׮"ȷɐN$* yU Ʈ0-pJVoNY Z'Y|R/# J: Ur"x Z}gV. {PȉYu CIc2eЩqoE%o߼g uJpvC5;>{0}ɀ?T>6> 4> o|3登ɠsS#I`79D+A4E;t|i^g~|نZ}xޙOeU` PeNbPUX–xX:̮n\uyۅ#!h=(TԀJ{@[! }qյ!5vξ j1 /c W U;I@Gd~g!,5>:f;BA7o߽˿< Ido#^<2jNWXJy.4 fЫ%!C$hJ$*@PF״WS[.stR{4*.3qgtoͷϷR ͩyU'A\bk|*̟e L))So ~ە3PI͉[27=sd7zQv  *9vS2Ir C~8`{E"pP#& pMCr3 %N/^(g:)P/?$lj wR&i5х# kWR[ L?n7BE.DʅQr/ԛh8ZL6P*4ٕq7}P endstream endobj 172 0 obj << /Length 2689 /Filter /FlateDecode >> stream xڵYY~_1 h#Fq qPTD EY=n|޷1&^uJGf0LU47K::w4LKYt6Z#;_{j/3/yFIXE?OLn>Lw vC/$S!Z,WWk oYc԰Rx:LG;bP|rn~;,kݐ ĽA§;{]t)tNZ@I$xjZ&XUǡg#OeF6/( A:@ aP־E7t׬Ӆw:̒ݾNo]31'in6se<)ǼsOZm.oO&iڴ宬>66?Hu>3>~T}vle8OE"X]q1&h{%ä#tPixz aFbf%W}bf.KJluy[75 H[3LXy`#i~@;'LB oʪ%6` S L,_'tDgpZD#FP7S%2r!6{qp.S EHhl)m.6t1?5zVʨЎځ# ~nݬ99Sm=N\kf}=;,c9~}luGtngjn-M ,I}_U0gB^M Y,?K$GE>Ⱦ[ЃϴbRSn{ݞwzjڟB&yQjpX5MY;۰2%3(@4;@ I"(˘W,8;-,&D珹T88wo!rjPep h2 X왜={<@]8[W=cM̩ $1*-^LjmEdи*J" ^*,v¢Zn#r#+/3ʂombh;4-~ڎ K_j[[gikZ'5ўіxDW%PR"_qQg["kCžR$9J޹,~HIGBU8`8z'_>QHaUә~ 3AwΟgt#r`hwESW'^phK"ׂ|8Lwfy]' 0] :U8m,yk0TP >BFQO+ڄM=U=h#ZEv[2́991ӝH.F,TvS? 0C=8 X#@Ty3Q~*z{vl] CN4}y.^zCVsXϝ97%Հ;MO%]G=[ ᪡s}Ǖh@,2g*l{zcJlVFݖAs Q3 ŗaC/p4qmз? O cԹ5\PLd<T"ō!d^ha3EU op̎.3'DJS !/m^Gv{%e]T//QQbɡ7#țpȿK trrWUTjn@>RUǘ!%sg. V2 P ;\do;v֍ow<smz-I4|@B'WDs!r~K {3k\bڱ\Mz1SPlrNEmHߎ^ߚy´k֎On:OTD|,|zZoaɲ{bc!8t!u{Z1gm򅚮dDBɪc+ U_ endstream endobj 178 0 obj << /Length 2551 /Filter /FlateDecode >> stream xڵYݏ۸_8u"%Jb>\^{hv/e>\Q^w(^%IzX`EFp>~CԍMn4mVl Q J6Ypŷs&VKn:Vn7iFn7Yfݭ.w~B*Ib:S=B`0e^nVh!SY7y*Xb`wYHlt y~N'~=>=jOhf&>McLݨ2K U)g ~'sk1*=.V4"(/$:Y~}׃5gm?5TF~Z`(Cn~^o's۴QKq$l*r eFi oYO2$Lρu0D&TU1ExwO@ۨ *v0b2UJ | 7ߺ;bQI 8N'&WQ4qQ  mle~j<ƺO?S&4ʣoAC.@2\̒o9/t0K5`oӸk|)% s󌚖]6羬4Ќe ϱ7NZ% 0iԞ> %&aQ(Ӑ9!Km4(sN,<:!@ =zYgBmem]N{Έ{~}Q4#FQYSÀ3bc?3Oݎ!]P}. 7/f5q&iUޟ^tOn8ma.7F*Osڰ!r}RE HU<=;(@*qhUAyz%ut|>Qi[Kq N|bliW_}zi?&-:\|Gx}3-S^GA)ZsۀoZI4 wT|ɷd}M7ZJP@, }K{PTLr8W5%4̤8 zċy@L>TGRPfs"mžqXD 1^*i͘=mMR#y+yɔ \Oܓ/[TO~ϔ'O 4.BmЯݧ^[HVyrZAe/w 0Bx!Ex<@dP㧄n tn䪆LCEe5̹SsG'B[u > stream xڵWKo6W@̊-vҢ[S`$/%&q}A9qV!5gyZb2^I"J]"&ۭx2mqǛާJƢK>uS~janI$߯7ZuVEtOm[y ʞ q,Krv북D"O/IT7Z_1O\dB&_NXg{T&eqa˔ q536|0}܃pڡk0SyXl%:3%nG{ޠ! 4WUjR@L&B,݁."3!L׀.tq?v*P%vbl$(2yÛDqq@Ngޯ,2{K9k)/>]p9KoױO|d C.< iI"'lR_K$qGyԙǶC}39j9P6}eG䍓*rΠcA$8"2=x)@P[aة"Ũ"FH}VΚ&LmH}l`m"~3n)5TeJ? _P>rF +89 EFx0yZ$% 3mk~gOJOX\ț"E9 _82\?==hDsKbx)lzד*(5gz~z|Q`|}ƚ-eV&IWD9"kBQ PʘAI= ou^Bi*NêWLxy!`.ѶyJAMCg3]`l!C6d'[o?p8AB;z׎P WBAVMLEX-2!`NX!A:!&y꧃_`RBʜ-DħaӼҧ@%Ez _i8 #\GalUF2EMaHqR> stream xڵWK6WVUQ$1A[[SZCRl}Avb%9|yZl Rj6 ;nxoDݛoz#-Z;l9n~[&|Je/U" Mu^ P' XtUf?OVidwŎ6tSy}A&uHd܁B p!{0 ^0ü-i݊l::Y<& +8L#|~qL۲L`V0˶Λ}0UbY*um,s-bQ"-y+gUlV)ؖ`ipfv|1 >/m#@2FBGѿ&avc7 zFˈ!u^IB3doF uc\EõDQ{D9s@u}i,%83 ś2moN(8j)2ݡ.w0} [h`3:!YV\#-+xqL>Co:xRdfX ̋7C)_bn3˽2 o[ÏOF.`5 lD FLСsGx{i3e:Le!BeWѷ1elk:d٦DUpLu!1byy­HRNwӏ&D<͕uF ٭|_+;=8˷VIv:-i.:@vUzj0l5R%TXN|3R *=H?$-L3)Ċ=7Frq#JW*WL~5[NW7b=vmIzu5h6*ĺC3bbS"pHӑ_KE K|hKzB5yBb 7ܪ>yY/x3D`(X*mjȇfG\ g:C^Tt6/ΐ-H>;R;^&sQr7BK#J%F:]yKj"fw4CCŗk)x@jQHO [3Vt"',4{ct =b |ujꕀ0n'El!Q(擳@ h!2=PCX$3, !_9*,,k]177Ey.JOkpb- [1\Pl`<Ѻ1;ަ@Y5mp{#jڬiqR/50/b*0QbCqk}J9?r處+319=퓣v1Jl07'1FyRO@~~֌3_TxSJo endstream endobj 193 0 obj << /Length 1115 /Filter /FlateDecode >> stream xڕVK6ﯠ|JNQN ʀ( V v<hZixÏUiU .vZs H;B0 ,=G< 2#7sgirp)K ,Q31!OOa'| 9bOaZnŌڅE7)VAPN&ylס!#|Jh5ȥL ϯhCILFMS F{Y:/ԫ1j:gUtvdܮSz.K7D2xS]QEzj]635R_@[\3(5r68]o}(k}(~i)U]lHJ=0D)BM.X*#Ǯw~OI>wzX3!')$,+J!!Ȓ(MLVUl]Ӣ&f~yAgi} 'R|j^Ԥ\ w!x£E!fihY+HAh9>A_3 Tj^/#.[PN#YE*lR@x8VPdHsF;j $v lk@ ѕQvy*YU&u 0!Kȯj]@hWZgnrjjwwAp~ 4 CHa{Q#O)ܮLDxb\UOGڊ"H"z@gGĮ)yd$7q zPKÑgKJpvz 0s ~6xgc{jp[)Z$M%n4F)#o9+,oGO0/V?'"o[cYtzu,u*O6@ |y},aBzzl2Y别`F/Ѫ+v}.<,][>IrQw2H@C{ 3 7nj&[_>DKz H endstream endobj 198 0 obj << /Length 1933 /Filter /FlateDecode >> stream xڽXM6WDF֊H"I6f?`;M6jdɐ;!e+R>◆ͼ"Qar,zD3M`3˷RXQFd,ĦX~^\?{hwO'|Tș`U㐉>Uȫu6cG\8`[;<ł&+Q0 n.o& k/avʃrc"xjV復&/sW% V>mM^۬{S?eC;vcC C8 'LL2} fm3\\=ŁHdR]Մ2ď f,Sx|9:ؘaOD0s]Y9,Ra#< ͦQ9(wm*|`>0 `A?`OsVx;";v#]6lh74DCIv|ꁰn68kzsA\x.8, STG-oqxJM }z{NJs `%!-yG) t\ЅՇvd+<< 3' .`-iO.Dƒ났<Ȣ2b|v~$8{$ ^LxXm+ fq++VfCCf0 |Į#!($!RL :?dL7IlO $<[C$bSm3EcQ8ZeͭO"b[]q (DV'Hk/8Zv\L8Xn˷ 3)uuX7Oϔ1q(e[&=>zT:p X*.0,IfYaonuksŋAb"NN*L>{_S[ ;B.wu^'Э>ʭ#8|nC--vItȽN$NA#BAۓAhU9jY&VgfGCOܕ cziEί#]BYUK(A1L ]bbg>&wYͧIkxï>Um +0s!r?O Z!XS._^N@{ryfHnJb!7reo ~"QOSv(VE.O6DՇuYJ x k>2I̛ä4*5/"|sk*C^MU*UFd^OO "Tтȇ 6$ЛZzԱ:f-#OO^O&+mV3t +0ߜ3F~qվҐ%#N3tqͫ!׎64ʢ{V?{q{:S;wWfui-,qx!-QȢbOoFה=5{ʨp7x;Z|B;04dֱ{!:܀_xPo?Zg<G_BuuW., 0&XP +i endstream endobj 253 0 obj << /Length 2741 /Filter /FlateDecode >> stream xߏ۸WY7շKҴIxB!ۗEee pdW`t?tg39Ʌ-emng3-lhݳ߿rF3g9IJkz9W|-I"]g> QMQ)#ub]/jˏ} \(ZdD(@dDg}7mC63$W`ܷ6%Vj[q 1" 2b&'o}=pb> Omv"zo+~ss<2h볐oo:8)|ZRh kb)Mg< P-@JH ([ˉ9ak* J}ج+?}dT%n~ȳ0uúvuh~,4+>Up@,1<;4#m4ڕ D`'ÁӞTo jw)0PZ类eev~kN]o/UXb xvEnjXs'`ǥ|a$J1kmnŲ؎#FkWf]D>pQgvVH Fe3Ix5H7(K ]ώ.<݌[-'(]^tz8]P@r"b jTv>s|gXA!wkUƒvr}ڌ!I`]B)#]e02r %g1DؽMYP4İ Ԛ+MY\էv`:P;Oi:,[K ,IXC.ym:> ~pih~>T9:zBH7cE @,1 F sݕ!B'4ݥ,Xb`x0Мh0mۻ+f滑گ4d`l23̉|cX"z>pt'aݺrU4šSiIvPdя\m"p{~ 2t]`0 <:@܋Kսrp49JtDz8"P06z"GD2Ch7~߬e+edB$e:"(38.!28H5{Ѽ2jn Dez"sگ*0յ tR0 x+bpaǻ+%OP:ORN܆7ݫ3ƇSS/S/C'XVa%<ҵz> stream xKs8<c7<<츲[0Em*&? iZĩTz؍׍ƃYpLR4S_޾N=WW/Α5ή3xu<_\\ Hv4*ahbSf]iX~gT}۞Q .\kҘ8| ?LObx=e6:Ʒ?Z^}Ϗ.߽ $ L^+ݱ7rrBzvD1FaI1Gi;pT +}tBͣ&WHb 4WC,)ΡLA"ܿ6}K$lq/k' q+.7em} H%e)/9NScFD}(ffiD;bbP/re]V[CUܮ U`pS50Jf)8N✪9^pQC yc(dhN!rM 9bj[ys{~Yn)67ݪ*M~ !ve):LIw0X-HGRKb5$>H41Dn'}x8(&s>0jZ)V9C PLŮtl"\BPH9ϰZN;Q;QqN@ab?[f8P&A)c@ v`YΆĉRmaXm$L@c{ )ڝtǠ\7`?A9:o^\$դbFsX0)jHq:N62>aߔź [vbH hY!'1>!M0ѡw 2y'IXE/:tsdNwRvvN9M] AәIwL8 s{IHb5)'|#8eIylSk]omW]Ϣ I3Om o'ݱ2›KD|xp(O^'p9cŻ:bxó9,-~ؠ,WuY&61׬VHiN00  X:9wK6rF i*}Gzla<"DD 'BZ3Wm6bgD.30‹ ^tDِܣ=J{)#3"WF퍊In`1-I6,n@ٛHj/onϭ(k :twe`\gAl+ݱ?^͖cF!=GC>N&.0+(WrA(A >od?&sR0}Bx.TvoA\±QVPX,Ύ&yu.+IHMk<}SLH3rz+3-_nnvUY~v{mf׬ 7;pkMwBƋ{D.μ%5?Dxjav|[XO7k'K|#V\[)Gh\7cn6`5T]ZgJw1CD`܏ՓM!UƮXÙcHuVۅ;ip߰yY~.e]6<3F3=V%gɴj;M<#*l;|f;!Vc|D/M,1iefŇܸ7/:|›]f7yg/UJᡱ-GLwn29i=v&)*Zbi|U~ڔj}.ygw]mpǒ2,Oc<0j,ÃU'aؠh]*.yۮvBZTwAtnj` 㬆R50A8>$O?j endstream endobj 153 0 obj << /Type /ObjStm /N 100 /First 886 /Length 2099 /Filter /FlateDecode >> stream xZMW\(HK=$q|xcf1>K#yFKj =lI>XbuUJ%Uij=10DQk%qϖqJR|+ɺ+>H]|DŽ9Z(_duUg9UO ߪ1S3wtJTvI4ODTyU;"7*SZp.KcisӜtL9V=_JRA: "O5ATM3N!)AG'G *IݢP[a?JV&qInk4nLEV2q!@ xkn D!hU`Sj$̜`1M݌P+Z/nڨm^Xgne: ? :e+`,4  _p4=vqC\v!PPyTX݋OIﯯoV_}7}/onܦwk_|K`fYfe+~>xonUnn"ç۫7ןnN**i398|ӧgαҲ/çimOͫy`}5$kW<5y^žq9+/Vlۛo7PsZy:vfkeZԛJn7_n?l>Ooo?^m65 -MӼ>פ?RPJ.fl (a9IsuV =0V3<_|Q䑻.Vu};dy Hͭdzw7ۻۏ׿<v?7irOVyr&.)l*[Os a?uqk<ӳ7ZWMj]3ȳɅe6F|$~>E4,\U?Rz#,7}t>|7"FszЏ\O=>J.u}|Eʲˁ!"*LiGbم yo$9̴> .1u*r^|cL} ~Œx6gQs1_'}䜧ZTkm_:M?8=lX[[Gg⹑cS-M-L-ZECMDѕx=z%7o^4hx#E#ƌǥXc9FQc[=vG].hq8E"vGY2S4U]6q@*oK)\yO^@ endstream endobj 327 0 obj << /Type /ObjStm /N 100 /First 889 /Length 1944 /Filter /FlateDecode >> stream xڵYnG}WcfwW_#mIZaYMyɑ4!C'=sd`oUNUuO^(a|Z8'A JXgF@"D")wB+f&x(2XB# M΢PhEHE-OXId8B@OM;31CPf"mU0^%&$S$HaIN$f&yAY ihM : n XY+ YTYaIq k  ޱ(l,`Am% kF8y#A g-N8ŒG@P.E^A+^ÙdNRi4,){xM@#pL`=yYsa 4[ Z>:hDA<>9qOHJ1(v&zFHl:pf29p22/Qbm4 EZTg,@ {!G8!rfaH1^?>n 1Tl~um6Uիu6P, rޟA$Q/ŋb~#o_^ ͒9CZO .8ɉS1rV8a3)RJqND`L[ātLbqR28™*qlù30bjee8c܆đǸ*MD3ICIn U,Rgx/]a)N7'Ic Lx@Қ^gaf yOfJ.c9N7pRYPZ$ qt&f8!ް\[GjD20 iԙ(pC(gbAfq{R*Hܩ&cfF(w`\?-9N7p ~Rs|A*C3Q 3 5IW'1e3q03 >A;s8y&af.c1fLw/ŧhR1A/\E6LDb8!W3${J̈oJ_0!6 Feaf /B.=+8:}'8pKÊs3c9N7pD)?ٷ ōbҙ*3sߡ+ Fͯ5Qy=fИ5JC>A=~ 3F1{Sb2Erxց 5j90*:GMG'z(m 񉌆bm(ٯ׿kM\JڵWškjbl?D욎um wv7(+1Xو񹽯cFUo.]~xy߾.\~?a}SջVmU~-;n6lj/6:ͫBe/Mh_-%vݰ{kQ.ݲ.ˈT?p]|){_}MOڶ\/쵎ane:8=luMc%Uy;l఻nňWl}B/W9٨PwO _nVŦ8u^,swU8z/Iyy }3A_>UXl D3/Q6ȲWfQ?v|9$|r|~lYw}˔ʻxvv7b5aGCl`\δ#Oi3S8\ͶXw`z]-g NE(ם}6;Ow^.q2 x0z/cȜSt;b-S4;}w;MN%߀3+֭ endstream endobj 428 0 obj << /Length1 1376 /Length2 6080 /Length3 0 /Length 7018 /Filter /FlateDecode >> stream xڍt4nDN1zgw!zc 1-Jt!B%z'Dщsw]5k}y>vf}~y;-LE- Bp MnCQHPD ksB!HKD%@(/ -PxZ NȮrA1m r@|.04 A GuG(GA0?JpI9b0^^^wA8`0'kaC fG>A C_gx `hus&@=Hr#'CP+G:@[ES@v;: # ׀ߓC*sww8׊\2NCb ͧGà#f(/_!SW vD@(`PG_ |\a\K?B?w' A{w!C1[Inpo9{ oC!>_A*xl  u{뗀сrՑ(i_{%_qpY!ꚵ0HnBoN1W{ wwC\kz`ư?U@!;\@!U0;8+4#a:(w WZXP5!`׺gKe$eK`B"`^_%]+A$ s^.`BOqQ tz2͂e4 NMaNÚOWW3z||11ŋQ8XqT4@?uo&>w3VnޏMz;F'MTY˩or#:&|c\yn"܆0 )JE'U_ǫrEop}"eͥDqXvl٫&fwߎA#u?tY#vڤ#}KozYH9J:Ey=E]J^%)(x{&EZNK&x kSo#[K4,^ti;)Na.C]އC5ҭA*:s rTMWuܡ~;7ȭTB++oџNk'N45u3SJ~%*+U=n={ s\Yܗ7j݊g(銢 Elo>K@FR t+8f {_-&f7<yA|?T-} ۆMo{ץtCcPjY_-ώmTe^ #x3.i\NDLJr,W$i.N\ċ<] a3~]7B%IR5@|LjvZa6 iiްk)ZA$6~V)Kr93cQ7#0iuh1ϕz_2|?Iy"g%c|QR5T[+g~A"BkӁ gS|45n&݌8 a]ە;#RFjS+sP'W3ƌ|qć ȉ@$jCjw!zZ@ j9p+:vC7.2:i6).#5Mv!&ZIOmh+)VAXۛ̽~M+n5u@-"mŬx(Qx%yȴ@-9=`p&)gak)"SeTڄKx.9\?I(fMτ[>L Ծ>aLy6җel+(t &Ю9ΖSIWK,Ok7lCyB)50l>4;Nt+|c0Ϡ/w yHbԎx :'4`_ 8-֊+ha뇵_/GLuD4m #8O'~>d!1=xکE;|-^Q5 Fpזe vVK]Zg9u١23$a;:QQTRǟ|aNp<.-V:E yw8F}iCC-}&AϺ]ͽTn-f"YǷ2y S<%04ިTD&r&-93UtNŅ:T]V EG1u󛲍]k&Segu\,,}ӳ Ob )kRbAi/gz1!N>!Ä[I\n2>!ޜSJɢVM-J,(=sC;oWdO n<^b}*JLj+=NZ[D$Ͻ`&g9$Na/%yhq?ywoH܈;/ 6cH.6R w>QTȮdXlo[J'a% ({aXf`POLY/y[¦l? [|"+dۣV珿MU5n>=(~@@ 壤R0SPsħ:Iբ1WBp Zm& Iٱ}II[M蠦:O;|i.9v;n=Ab;ݪXW )ur?K(-xǩdfvo , ?wdR)"$w|-ꆮ(Z)eLC zv&XBlZ~5e}DLe +ɰ2-Ĝ>~5áG0Ի}UMhdw㮗vϪb'$UTAkTKB66*z\Ëٶұ-eo$ܘ ==/lXK#2ןZɯdWf ~Bx O=*ߍ_j6_~Y"}`*3%p%jNx<>+3h4Yhc.eT}֨҆y'q#SDQy!} b\P|(v07ڛkN&|l-RSQ<63tQ3޼ib@HD[xd Ǘ7߿ZJ`0&P1x!@ss[|qM"j-ٓf1,mZ"+ e)?)Gi7HY~5bbP1N~LǺgGnm+n[0$ũ-JXl3&lC=W]7RkD·wem% \Y9xgϯ.OßjX9G#kk0fm(.E-*vF@Ekv;>[O"d~cBB2+Ca%weFVS|e )*Z[S/6`.)v3YaNL:`}Lt z^+y"k$ES&ڂA~-%D_Jvr >)r ~Ҝy)O^Orbd\7].s'#7&aʛ-&egM0ϹT`*jP\N$ᰆQK(t?ٍp1iHڅΘ#1()7^O)de4[m`sg2fuiOS 7&GӚS(kϯcP=i@ӑՆ;Rˌ9yX] ?1xgg*-ܰu  VmWwuԉv\|sܿуΪ23sAKy7bUY-one1,<&eIJS! 7w#[2\x&B(n.lX[I9ݝ|gTG$F3;~uӌ7[NGrO-)mhvCãXJ1FɖH^rIggm~us%FSQ~.HPZ]jƞ+ցdRr#*-@eQj&#=jQm-oP5̄w4v" Z |Wm{ׇXO!%LksBEpXvvV&WMasfCF^e Mxi dU⢏OnCk3,Ĵz 1҉7AXz7TV+#Oc7SP?(l9Q ~/0;—/ݧ- SOAY&i-Rzc21q@ O.w0[ u> stream xڌP\րn{Cp!w!e#*c1悒TEQBWae3!PRjظ[G@erqBda.0q}7TtV.>Vn>  A| ws"@h@)v}3Z+//7Q hjmhfc?!h]]=<~>e>a@{??bf-E%%9_' `eeps7Ϳ`+ tsO/-c)9OϠpa<Ho=Ϳ &6^x\7-Pt|5ն9ڛ_.{6.R6*6f5Z4{_W ޷pyɿU)%fm'2B`y%6NN:[x=f& 9?#' `K/0!n0K!^,X ,̲,kC(Z{-J{-*=zϮ޳k=zϠ_}יZLл'l|?{q]iKi_|wt p&VY{9Y_,e6;sG#_;InX"{"' K 2?~Q1;9'{ch ?YMws{?$fWk?N5W8|?{xlHo5sf}_߯J O 3EG3PۺЎQƽI9=tZFP# l mMЭhHڮ$͍*ɋIklD[jq^;4Thw"xBF }g_ ;Vn9\g7|{i?Tgc5c J)Lp`\=QonsH~Ųm=,xWhQAޠP,˅G[-6 u8sԒvMm΄ǛP٫ts̾ v`{GWڹEd':8L]Z?K-@$q4U ojJUZCTHcpd՚4W*7;!pyMno~'f!«F"H[K{n3q|r@1(r6buե&&-V%w*D| 3e̫?ȖO1Zmʂ\B5vRAO$U6R<@/FP. ^RT,f=[FtW귋];JLE4ZgJ}-PE/\zU,սJM>Lu#rUNQr-*Y-KLG6@#d,֤A^q+S⽧0N=|tg 8mOH")os,[ ,[Vk!zq/W5K ^chDmBHCX?0#x6R) <>qUك J3JOkY\d">W26HcZ652۝LtD:MFv[ֻ+`Hm1 E۳QI%X[1*X;)_|Q+!$0:hm;,`X>w1!ֿOa۱Dp &{ͷJ=C|y%9|6fX/Ol??s p?nUvMo/)~/݊ 5R9*,^OHiJ݃H Є=~$ _em\S?-/Nt#q(|L}GCd6+6w!o7&xvT`,$Tg2K?q$&? ZK z%+ݧs. opCsbƟ#gH}jF3X7mK%nz^k'%ld"tMiQh{jZ:$_?dpSnZ8"eB\CQ?et/HW56 s@{9o@kH =weM/~ #RA娱\Wv1LՏWӣH$xPH6y` nG-r}uOA4 /6ƬpTjb, ߘ`TnayIx\ǔ(FG| #=G=Flka y<6Ddd+\g)dADyyuDjB]tiYn dqvBrUΜcIni6~ت$ hFܢC/l~9КGL@p/kULhn.Et)헥 u%+iPelI:?ylpC6Xr6_FO^t(~6Z\&8uhzF ,JjΙ?G;&M&? p^A#j y4)|LU\,"*5g:2 27#-qD8!!{~OA]lUZxUJ.qO]b!1?(r#VdQQs-&J5'jiډf.+XUdsUmG(msJUX{Tjn(;7Y21 T?ݦr3sV 92QFoS ĚEo\,G}=jR59H> 4Ta |cwo7o=9H( pBV?I 7T:ᓳpRoA;.{Nkڀ;Ü^ 9x&'D_#B$ܰ KCB/ n@R l-Pj])}Dfݮ_>nLvH>\S42qjAgד;̈́*J.0 Hʈ[Ni~ sҦtw9@FΠ-HvB87N CLd)lWiWMQ_kBEKEj9.E05W #@#c}cxu #NAlt툴dF}摅R&uFٚ4'Kр#&>%%l<̷Rk*ye4u`B!(bn` m ?Ezy={vSd ~K;7'U1Ys(sL{o۾:oTȑ>™z^ߵ) z} /O DQa7t뿼 ?"həIiT)pl> V7fHGeCzybl9r&x^oT.q%WzQr[[Ev @IKY$R5ijM]j{0҂ly(>ÁB18JrXQgKLv=>*}i{̦fj AR(<^LL(5%T7cL&$tJFT%n7o,ed| 84=n$/OIrQg f_o0" Q77NPZ#$k;͏UϿeL[?jz>6-g˝DŽcERm8 ĉb07/p%PT2)@΁x"cRf`L,B3͡DJvJC2#]3κh;6!PS4o +rt6e,F iN*4P?},ס7OR#)5j%a@ C 'NMpz 7iqRTMN 0'e它ǭyIZUpogR䷗/Nc7'&b\/'b):1oZu$j[h۫ap8}Ogxփ|]QP1]ɢ˷F\d6 /fU[ʗy{:4WN wA2'.z%{LP8MXִ~,K}rpAރ(ߙ0%g!/% 3W\=}<` h( %^":HhG\rO7rgDq ;~ȻPz|x]ȉ~URy|1I*ؓ/6")c;`L&YHܤrHKԡd̰P)ls)YɪA!ꥢh&cQ&uxSt݃u;9/ $۾ Eɀ3f(^%RPɬ7H+zMO p-(8B'2U12܀9s%]Z\@e[,uT@YWB&Z%&!ELt'TNCo/7cp4(}"4,'BN&'OCTˆ[prï5"CTR<6FYMI13y%͝by_1΄~&9m`_. V׭NY؅r`T ^W~\ZrZ>``!Q9dzŤzBnVJE擗^f**%(vvԾM8[WݖC,t[M$D<[=e`f1M;GdNdtP]a^$l$ Jj45*#&yj#N )0HsLqӖZJ/9MRsiiy&il6.|5aY3gt=!$XJz5Tfo9pbN;:YuD+Mёd/Y'cr%q B녴P)^p$4a%'ss#S3ɂu:2ٛ&\oAKdV#4NeiΑ3P$. 9pcy1v?)i2 &/i\ps [ Fբ2l?䄥+(AAƆ\ƹ6{ZRw 㷚RGM+$v3wӒ0ߡľt;Z%kg?0(* |[j=;|unOe@.CsB/[5ZԨyi0-dx l]2%WȄƴաk}h|_`KZO5|V4{'V,*a5( ׌=+Ҭ('0@h3[R{BB~͆p \KfEAhx6Cя2L#mڌfA6e{&U`|2' ݾi֚ǬM/sItp9O)ښTՌhJ2:qFHW qW\p˃2IqE4c9 &^oF\[훒I&YlBFr𜿎(Գ31^Er0^mZ!( E6@d.3&sENeiaEe~ۧш<(;I2S^ŌBL'.q pi*#{!8X!'Ѫcrf©[!DÁ-*dQqDuH2V`De0qf5u+‘3/'dޕ6e_7n|+:w < kuȱ'&ב@n=p\_FJ>V1+ͥ P[:nqAi Yqu&=3@%;"5)TQ#!mW@F G!'VE,?i+Z-~;`?gm `ӆ77=ZG=dMFb+!CH"fKָlWjڰ~2$Ş*Iu~ٶSAGV0hR=ϙb-1" t]df, d/,;n8pЅG-,2b cy.12wQ{e6hZ^C怵UrC&z.0WOJWW̮{%v E䮐cX98|HKDI>b 5TLo|r{=ʧ>'O=סTc~OyN!6]cxq\DhW!k[DBkMbv=!T3^. 0Z-9wNso;2y}5IͦUg \R~%Ʉ; 0/U(l/3My.?hoU H=8OKif:&kx|!g /.KGL 6x;(ug u@syz@t#8y<ח˪Dld!3 W fn+/8j/McyѲ/7n]oL#}4]=c!F8zvtz%!'\0-3 1%`AmHLT k @)p\&u:~oM+Fm#j 2(ywBPsFL噞!kHayL;/X57#"]V@@fuO(XFQp~֥,mG-r""BLy8;MV.{ fdMEڮ CmA)fo2ok-tۮ(inoHkea+Z'XL ‰OG]d1NbutD5o93Hvem&\GmCP!QP+5G_JԈH#nLoӥZ..4i&dE'|L:*I"G\~f[ÓE8\vF(¡ i8(R_-g%}h*YQJ Zb}9CIB?~DjvLhpJ ȁWU>fΚ WY,y@I_%|i%me bG@TT}v`u07R3~_Ճi߼GFzo;`}(-Θ SsM=<۔X&JՇ0Sڜ?$߯*b=iG r$\&o(dzNB M3>)2\nCDaz#IZJ`jN?7V0!3&Gy}2ϢW4K:ZVpYڡaǮtSt6y`sfw!ͥ~ޡ[%"ԃf/ny㸷6&I/oo;Q&J3rA#ɒfMр$c<ӗ5H ϰ2HYbceѤ}r$FaK}+]Bvk?k\̄=m5o,0n͵ƉᎬsT2$U+6K'&ktjҨIM(tȂ?p=_h3X,n]/%x8$ %UZP]>:SX,K 1հSBb>7kцŧM0`])4W@dPG3VCڳu3Q(A p4VxŁnu;&v;zi$6 zc9% fTJL MiÀ;WǴrPӳh1).+gʖ*[SaJ0H[9'dhyV PVVK]K5k`<=!gGApHq([z>J(yڍj3UDEȜHUU{rowAv: %cxV_K+vAE$,+l(dc5I4LKYjR2 ّS<*{8{_N=kBU%[=AoS~L Q•A5~?_7Ȫ5vwr}H(/+%+i[ \"#,Bj& 7Y+c~K/m.^|~ovbG=lHpla1q9>F9R޳VZN6雸vU"w[/Q_ͣx@of1|4R'(&> EV=5~*'C*#lmO@f&vfQÕOY%Fx4#M+ڸEa ,](:Zbq0MCf?L LYw e`DH >廑<(Fj%;}[ dv">aX )]7$$XMFX n;'X5wcTfw+S*x&i:;Ko U=v:fūo,ϳ&MWf:Շe _׏ d`,ׅ+5p(mKإVH  L]$',K/A~?8F;4L{7&YvRF曒? "vA͒hl v }TGG#udeYCLAmloD$V,CzqnQɉuGSKduxz0x;]pV0$ ,i6skW#X~ s0ExsF_Fq}-ل1]r1{.Mr6)vQ;]:@ӹ_FV&xk[w̤k5.)IG&eVq/'r! _kj6pD޻H%2ayA{o+F7ᛪQ^9#y%Y;3<03@/+Z͞}U]ۈP hdQu%t~eMj\fˡ)]ZHq@ Ʃa[ȐI ƠE/~X;pVDŽ+lŀ @ V["b\>.͏Ⱥv鐓{O]Z_ 7qh-#rsґ3lhYnu uCK4"w%!6A4\6.#;'. ղ'xԹL|SU\c˚$F9*g\r2'BL4Wq73C+&?~ki5ukwOZ2Uh ".H}[EF+$ 1Lʒ5'4\!7Ss`z?HSVpƼg r&Y7G:Nc|m-{]?GTB=֦W'0ߞc s[yLA8UBFeo~:o f`oAQT!}͑{4'4 RÎ# RG4k5rṺf*3d)'52;::Sc|J~?bEĆ|\HGRj k!EgkJqvS?9w)U4eMsDl QΙeC,{"%c?SUSG]wRA4+_fؿDʺ˺]XS]7dž^aڞ,SXQ㔋막nt=n{$EbE:k$CR:K[TDN|Ϭ#& Sy:51G;Run٪V$kfTLo۹0}H,G' iT|fK}o`k X5^o(ZJ/&izwS3r#ONRSEqC GSUwۥWӼ u H"Hε3C<-B~`7y\9{>H-O&ddz(ܶhɷjvho-}$0hdhѾxX`f!} TgZ5Ό錤g+6]ThA [ejR:l,RKE*/` vߘyY0*Wi]uǼ[;iX x_|As9\䷡%"Z#f2Sww*Clb]k+>XTBr;"yfC<15 r}4b ]BBw'ڣvZ듴-2g՛XuXjth![:V0 flCb9؉A op=$(%_ln3y&X)h.15qENLDaJY s MXabu_>5ѐ,"H..ѧ^ɀeQh+=W wH@я,+vfa~0Hb=CD91<8hbD<&4_fGqۓUN4\ZÙ91/;b=˴~FCϔT!H+8A".B)>l_,Rz+!J2&CJu:~^Tab+ZCQsNr{ [2cCۚ=IE%/$tdm6]cwgӤtIJFp=^%5\ݕI6LVI\KHZf {{l4z u;<¸PF=n8?tN&ށ"̇<2?oRAɲ: _I(f0VE}Ùw}2ӲyN:RYWdȽѩ!x6`[b*4$*FwaZ?*l8;:p$UmuSVAH禮]AZk#zĐq-I~<5 jdkTcKKA} RI$#6u<ޞ+P^O%PrI' endstream endobj 432 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xڍwT6 RDJD`Ih"^U@IP )7*(U@t"EEEus]Y+yg3}DH 8!0HA 1aHm, tB]`1 XR|K@0@Ujp,[ q<P> [܁Jp  A 8G+!#4AAp?B:phiOOOa+Vqz"p@c8À-!? o    Gb .H$dh poo } BQht#\@u]aNA΁, \ v!@u%# P  c.=!\ru#qXy} Jwo?uF<>K$ ;Z pskT8Hꖘ{AEzῌs5?4 'C ?,a~>i0; G'e1/%@?0tɚ0 oik i_FeeGHL($*AR[?B_-= x^E]>?ԅyt+JG(+"uw_v߀qExA# ZpwoBX%B`qao= 8o֛/  7Da_6–A ,M,apy. K:ԐP|D%$  I}5~("D.@B~@{p>h )0\Gl;CH˿C(LSupA,fQ.axIg`Nmnٳ}j8j8W8b.&q4=HV.]"2dmT9tpU1DvH~k{eI.#m/qMv;L|r}mΩ#z띦dp;W(NMMU|:Ϝbtz;+s|[K[7xo9&G ʩHTvIC|>ּ# zvXhOw-wzrK__x؇7UL&ɷg52j!j)b*_4};9"H»{>xӼVeI(d }4~f7&XM-4*Z麰[`*+÷J|@(% ~$Y6{8FTh'm7H Q}? NеxgWė${򺨈'~7h*NǛz}Zo- ܗ%.(8 ]}D7h-qtNSNHK-%r·~s`eΔajqfw]ͼ`a?y'Wf5=uA_pb&Lt3ZEوwI[V9\&k۵6ej?ڶ:={y7hjrJ^}J#ICH?z} x"7_^EoϷ+jqI|z2CMa=~+x?.>;B"nL~~{)04I7rE]hzcgrŞ,2 v@ߝۋ}EGL.՚~E}3LY]π7mD(#W^11zm[y+` 8k1WH`8"p!gPdaO|Ln-&텇T}W:UV;Fx^c~VxZe$2Z_,SQ? 7JS"Œ-gSowe?iލA_Wg :NSAcg3Ւ>xa\pѳjJޢ2Ff*hշ2*Dk<ꖼQ!E L1ȯ-6;!tKrJA3q1"< ֍} ӽk~;ٖ 'FyQwuc[ęTe,\L5zçpә1A_k`u +)pF'%Qc X*,rXgH;u|"WQkGb^nހjO"5GSvI ?Vy;Kʯ6yJb]LJМmP!G/3$$ג?=`Z@^ҞYXQlrgmVBnD3_hab؍$2J8aڗ338(3&t<3F]Ck*+&z{c1It×/-tӢ#Ku]j5kkw+Fz\@d)ڤn(Y[9n/G&FWc+ږL$K|f>Rxf"H~DA=45pQB;܋\MXo_V)ۙ*3ǚ2܎Rk".0pLMS^a $Ia/8yM+2Z@*a+s^mF mwܹ=zj7g([f Z˻L1dUOǛ,HСdyAJzKh(ic $U̼{-ǶSr/Ȍ:}: w6D?~ر ynK69i@CqgUjP0|9mR֢(+Ei1 /Wf2BjC,! vf$*~MlEMp ,c-pP܊ZbEsyLMt/|)|up`fTbcχ'~kB?X[_lvIQ&"BLcy˷YG+ [ {R \[ĮT׎n.nr>?hju:#QH9WbiX.JZhVpi2/܀SO >Ɇ&%L8,̑ %2s?~MPJ.=fAH5$`UƳfPRIŐK#7d.=xU{ȞsRA{^\m5Kg5TEx NAu?&u2U:[C393֌ |(%hqX+ƧfOJ݂Hms1JTe fR=]X~4!Zឋs"H`{@8.!.1xU:A7K,Dg'դ[=ՠT 9rZk=$3ڜ_%t,IѬɼ3%jb.ڸX(v[gT]FY[(G옊`N8*6:[zk\J];t?sU֊$39;>|g;VY=Te7 2N %_ivM}ݫRtSU-(t)Fq=vʆ9r,ݤĤq8+R}ydvI9M9Le3.jL=xeAVsE8.U\+JNp{cWz%nP(/zu9˴I8d|9.ҨIE6+]rg ')CXQ-xߧ~܌'aNʓR ! UI_űY>VMh#w(o9KӲ)@@ nK!a,S4X"ϊ˯F'DXwooj90a{` L/L9I`5U-зݼe{/xQez_n7<4mtonzC A9*6's&lxE+T եSkz.޿8U%ha誹ȶuF ~@[ϥLnsIz-qeqCѫ\<^3e~F9_\4 t8Driج}5o$*'?x"T1UsH-~^+%U{p#Ywq&aP⤉%ŲvTh4avgja`6]\+3ݏGwsKt4ljnvEA=d-[StjZ~^fZP3#mq7%-N&FCAx,6fD_ZI>_׊(fF'Q ԋ=|O{xJ_uN+3s0j?oՠjO޳* 2]Z d+_?xD9\WT"ܱeuWKXaC>OSzx'H0%/ ~Ƞ7W gUxkWB=p:6hn?9G$9%jJ tn[(k:b\a1=RZ߭մ)y xe+,t;c"[d4im35DcF5AH%DQtD!|  =Nݔ#0z#qЦ-//hrC~6~;G5ֺFMzIBg#WOU˙i.&?pg6сJV-Lt8<\]p_Ĭos&,yxVF Gͼ/ 9Xh%k?R+3y5;)y0\A=)d-*D/RdL}T16SI"wV$Av3/QQ | 嚟\8ҊA+}hPnչ[|2}u^c(h>H\I-uff[`9£xUCαw6z5tz0#Kiֲx̯0H38MxmL}Gv endstream endobj 434 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xڍuT6("LABa0$[mlAD@;%$DAB:D3~{}?};NV=C~E(FAB a0mp>aH4J!c``ަ hPĥABB@a!!h4P삄h ༏vt ߏ@.7$%%+ !`PC!`{!K9J h \!0,  ;&!C-{$CQP4T:PZ|? ODHԯ`0vpܑ(8ij p|@0 Ǣ`0lj TU qX,猂?YvppXvEy}E?ǀ:; N0u? ń$%D$Ł0' Y ivǀy#ma'00o Hh#Q0g1H7~ , QXPMOQȔq*)݀" $$,?x;bQh|~w.HG!'A rt !1! _!7dwloH{?x," -*;j\?3Hs4~egZk4v/DiўvI f&YwT<kGjDY icx G_ + Ʀm1gj 0DxQt_Tո8(/AZ(iF5,]= 'u%/ &5 d Uy6FOl2:T -_ܛ 7"BPpgt<xGBeRIGЕnlx%l_lq Շ_Yoz.Z\f@n"1b+;4Ij!#] .te& <2?ċB\ITj#$>嗚 7 4U[\ݦROi͌%ZzZT9u+^Br4)O=_?LfԢ]c#UF f}d?f|/s/sU{@Rcs+aU:h;\,iX RRl%ux1d"%qMꒆ|KYff$e7Qk.a+;z TL;߮QVz<D,2N|Ns=:l4`Pxo-Wb.;hi+> ?ɅŶSp.wnCe`aPJ^!M$S|{1K gwY2\ =̀|0Be= ~BFǤY 0GFBџŖLUT}N^4\aAT|~40l3ЗNe n]/a& ,^/+z`[,;_`Dy鲅]sp'JUfԂ)Ʊ'oP^&!`#qNOMUyI+PNqahN23Agc߭]'>)ҧ:Msͣc`D%Lu%K:Z$nD N=^$cUE ^q6Ǝ]9k-! >iV@ے U9](WR(o|@"Δ9K̼k7׾L8>׏ayi0Bڍ OEgKׁTS$< .~us%Ucݝ1Uѵ_t J,j ]⃒p7j]@bpTEFN_t$` gaI 7r׍0oܸeaA5YyPA})~iw6s|_+3<||/Z. !3td#d=?pKTXX-G5L7vp*rP٩NY ┪ůjvONF)_p!*&|Ua\[QV oτE\xAGrUvB=t+bŭHvDfhc_,!B=e>dj?nWɻ\ZKk"g%w f[0^ň|Su_? (51zkEWa|f m-8R JڴR3áDb[.ʖE?hkoAXc\fV^,Ztm^qMY{籨|# $ *߭SR3a20Oh{n7}ѨD$q$)Ԃ;G/9 Rڻ^ *}<9[fsL^`-iwmf,'<@{ +VvF,(*Cdg),VcW 8>S) Gp`VO*>&%Omot g_ra:#2"Ɨ 97cKTܣqa^={rÛ iPJ6F[Zիb&WU=B}k--_= .HF,`ZzWMWK'bV[IK_ica9 ,Jh~$3^Õh֧}RY(3q]Laբ0:wR]@g Dŭ37AZhx*l?T "Q\]|!hΖkAҍM$C$Q>A%~bvs#>bR_7T̿xEǾ6 tk@Ԉ1:cm$i9MU}-@3?nx{W8M H4, CY<V('^u}gw2MlT>8=z]0lFڒZR)-gB(V6ne-1NL{c#lc^ ogeծ~Й;d<ܩfp/#°y=܇Krɝe#cMZ_)GbNrZxYr@zNM_L*o\/iPa T+L,iNUuz6~ ,כX_*YU-\&,X9u{ՋYta)L|@!v3~4Y];-=TLڿ ȭ~)&{%m}܄4dTs*˶A[B=ǯ$ AONwew\rm_v?=yyU?3o$jHI6#d4d]+$?R}Oе`; ԓNp)},츅UG߃NiN3TW$]5Yjcij|ahZ蟅9 lH&n&H } MxHzRk^i>p?qu y*~=/Uѻ2_R˘aG쬶MF6/OnK?}" Q|NeiG4OپASUxtI^¶5fh"s7*=|fJ AȸJ(/BOrgh 55ɌjބI>e,<60)_aU.K/v=PX1,42z3>o$@*~K7}2SxP8ý5ɝmh1>mǫܖ_gy$Y_o(hJ/ȼ=ʢ S ^Y(N6oY~qZZ+"׊ ;"]Pn)lP֒I6djgǼ`̜Yߒ9e!17 xA?PU+ٍDv/G?߰?_j_율u++<3 ϕ-'2ᡟE/ʌTD3mc* &|T-Hyt(u1 6~LnY!O$q׹Z}ngydjDLK~dK$ߘݙP +sXIL|9*_ttV5> stream xڍtT. C "0twH0  13C HKJ*tt#t ){׺wZ|{gww?+g (a(^>@AKKM $P#䯛@B0P@@@(O0#@@ PB@TEP H'jkW ..w:@ A0eqœ9`(\v(?; GJs?CQv$ r``EmP q8B jgX]oBPd wr<0[ QCy@0_@# + w xH0B!FUsJ0kBO1g0;aYՙuq)`\$BP0x7t rc&r;l0C@|6E" Q+-F7揍Y>0b'C/k8?S4P3cp8WPD1/>, m\5 ]=e n?i1r3ysw⿪X )::sa/ZWFZp` }Z-5鿣j(F r0[ yP2b Ep0. qd 1!1jC^/?Pֿ'(B @$c,F(L 3 f13f7p_~"Ss @< ` 8Q}EPI;ڐ$^҉ P3"T҈r~zڌFt3my^J*O#^f [f#xcF :' L]Xw#nXvsPx߫蘊wSUnnn-KӤe7Yy5XAw/s):p5,,Q;UC$νRO_eݶu}(JG„Fs/2?mPyYܒݶ*\N8>Cnw̨$T{';[=l(@!0"QJ?`u2/X^HC բ#f".o ywU\ @4eڟvASe|[)\'F3wbqdNF}֠5,(#NUl`vk,mьH0Zݻ_0+>ʬN@Pف'ooRWHͲhE'B yߘk붲jrճ8Lo6e7:=)hrhԧ'0, 7͔aqݶQ.:2*H%A yoEVd+xEG Ive lyEis蒥ƍ8D'nLv>9QPFF}BI =`b[U|(?LJP=TtM )0y y7{KjnyzCPfEg NC )vFϕQ;݅[ =M ԛN9vy"V`̖#,Z&8E}冷QO -VE\ȮX{8ͪ7MSgtǡd (5&twmx X'+JɣC dY;ƹm@F!7 wy)Fy~ d!$gdNZXPW܏؞BLƷSy:Dvjqc/I/}D`wֱc$;=X7\]8%At| >;5m Q??-z+}R*^pzmx̳!xEVm2ӊR5hZ`]0C8BXKwSP=ͣ6BROLVYEnkD z>rLIsTKX i|OXIz&lCڷgXOʂg'[CCs& w?aIܧ  WEM:&49R#;~WI8aF J*סsncij?UKCJn;.ѭ wga˕Yw.${enj+ɣgnMȖ 76\*=*Aky_cKӟG|#p*GpiK/pIB6˾&g7q1 ̗~z\| ;$.ĵ2TXl+Tk6K ʉظI#P7m\~ycOLmAߢ=>*˝'![0@OS@yLgJ^uBt|P_=BM6ơ:FO{%sQ1݋1U3׃C]%yTR~S˩|بjEwߜxA"FNXJU,)1s9 K( cdBMo[U &6,?PqkhpnuWo62m0z0Et(8MfK75sY |{P+ڴƂNu &՗v Ui27qd{s/^W 侲O,jgaLX~)2e$`yL;oX/*ŦnZT,_"F[|8W&4DIa3Sz.4nr2cx'oٝ¿r<:q+.h$8*T7؜|+R<_ 00oĮ?*-zvSmȃ1^tStw"V?H_ϔs_ &?YSL 9ڇ;RP)39 JH&l7_y_=tK -Ȓ,u~kpShRWk5!)Fm_pʩmTHX]oQ(`ŝl?I~ H/LY 0͓OC}d D4M/jֲv씮bblsy`/hWT~W_~0o"K㳮qx3Ch5_k_+sjWЂ|~^FkdnB˝x\|m goWLHf(Q!X2rqjZAߧrM~91"XZ)"'즶(Ir.P9 .6M?%G"[!VɕҒHNow oR_@7|xj(AٔyZbE ._:tϯc/r+/m6ﬕ)[rShwXWKr*wraƛ(USYʟRg0Pe~꿀JGtb7 ˞X1y&pMO6txɄtͶ\ȥ$i48Nja7gURՇލ7qO<ˎ,f(rc`\6|i86`>r%XU0$r| ]Jeq;M6%ړe$ 5'R~%gxiT4b޴?aG\DGpVȉ@ݧxͥ^O"H$g@K3aO}DL=|OA/5*wv?JToD~2Y" N{Ps7>̹JPַ7Ӊt-B`3/NAv⁧9=?{KPe|sL3rwz(\ >'˖O+JÜ 6 .'v䰐*Ԫ͓Koݸ=revy>.$|N2r!"b~JGJtcD]0@z <7+SOX-۴өbuz[M]I&$O.NGQem㸻b>L7JV%kqT.p|׹J4tfI-i|Л J?'`U+5ܥ2(#Oqeͥ9i7ȑ&CN}Q;cj.g"Vj-eUNok@] o<țY㼏-xɾzBh0[XA7ND_Bv5> |{1H$)QKkZ2u60ҽ#?Sh-`KYTQ@݃z>/Te J6JuUR_])Үb;ùC׻[Gb܊3]nGo9 Tw4hUAF깞;džKYjYf5o"AVΟ%/FU%W$\7Fs/W{sܨ/i$p˖&N~ee/և5_(6t%Ӝ WUzMq:w4qFf_p"9ұRVh5/霃I9UMu1}JOT^#LOi KiPex Ċ'3:Ӟfj˭^L!ŏ'kwؽ6d-e&߭DjiUR$R}.C*V&#»'ϻj?NbZ2&(3炟z+G)QDf󺈓PM?=pYvGW~Dbloe(Qg"CVVɖK0]k+M|*_i)f4ljPF6Z Od9bB]b[fx23JtI3&ckIq.=ot3z\7~0-sޘiBfp.LMa+i}4> stream xڌPi-ww% `wB !;Npwwwv'mW[T~9}}jre5fQsS 3; @\A ƁHMnb njH tY; 4qޚvN;;oMܬ ,Y{ Z||Йy L &.V@;f&53kR Y8 ؁X-.VU 4*hb2Dj5o36ZAW{s3|9@MFYo&?_ 613ss4XXJ,..L{_& p)/&IQ 9[;X@ֶJde {sq;; @3p=Y;{w{ů"]Y5쭝\2oq,.n666^~N 0b^!/3_oGGd8}_Xk@@; !qd-Y.bur!ip\p'3sCh? 8D_繙3xD.q{?O@ q~L0[pm(;Imdzfy{T_߯:_~@_ڔY {>l kWizy4UnB=&A fVyr |C:ɕU9ֽKʣxq(tf[eGx9J~`ui4> 3 <$f l,#QgǧiRuP.> 8^,ެwaRϜGPY S3:Gjj}]g|+Vg@0-QV|UQ3NEQ$K; ^rfMD ` E0i&4n`WMbKwv +ET$ba6- 6:ӂgG!bll|0C'ܙ>|j[צ0fm1 ^x_L$XqJ JhM" X;TzVȓL>n{*KFs{?BˉfFS w Q$^m`XPHuI!ξY{Xuum )HNScu17rh4-mL2oi| uT~ ֢tK}םEhJ:gB1"5lJ5ىMM*o2z hX̀/>F<[Dԯh,WNW^Qµpa Irh1bħlxܓE׿.[ )yߦIM# ,/[3 xUz_0~nӓ~o )4M-:\KS"5wdAzfT$OÃlω\||o]cklq:Y^wTwc7]e?qW9 ;WFOod\N$ajQ8( aL&ia>Ƕxn)dVܘ(fAH%|$L4CSP}Zփ+}i(i[|WB!+\|5)%F컫IjIoњ)4pT7I2E9eEx||#mp ˟*(/WnAw8 gxWƌބ7@# <NBUeq/aʌavR(̊h^SǀPA!2N=MMITr%5kf>ҠˌD($$oճLc[5?Z-NE-O'N?ݙpUJ74 q w O^pe93^0Ί"򲋃߶F*HS[?ċYxB"DK*^!l**}p _ͦ٭ٞZif <|aFpE0M'GΛDdhXvau-+NCveQ0uO`4( }[FH!'*duu ِB4\(^ڋ$0ZjHY?#E?a7^sete<ٜFzhz^.`QPz'8]Ʀ\u8±/gr)6){6)W 9)v0o(yO4Q2"Rpm=2 q9B'?f7V0V14-_V*E\8Ds?jG%~D2Akc#ȟ8bFH7 IkYFr传u'wM#BjHBYd녴C5šu}9H%gB)?k`XA`5سJBx"I%ku=CEQqPnzbotfZا!WN-t|WT3<,elX6I9tbb<9"-$yHTJٝ~i<Yb9^]d{"U\!8>pZ5R3:Xb?/wnץ)&K`oGR͸o9xeĞ.kA'-~y0o KT xiw8-q@_֌vj.ڐLnY34˼Ȝ=Ns"#xVMQEfyȤ70F+F!q~=тQƤcDžrba+g| R~Jgp2@z,O!Q, r uHO%TުXy 7@AYGhzLUq<q:BۯHiAuom²7A88=wX:f**F%/v $VP .|[oIzֽޔ1QIzi;yt L|OYU}iR&Jټ)p>ɈnFqtTy:/jb`~&TQ"F.hnL[K񺶮^6)`jf\4RIHo#nY (iŭr?4Vė!|1) `N7ݷuЂQu+\4Y4r#)7n|_"߮y̺T8NȆH>}=hg8gu8$us"q+S'#wӲt=mSdK&EfRH"]P)pDRi WuoYJ |+(=$UZW:Zm ekmP,ʓ:@Q};krõ7vزq̓7$֛"K1AOUYShzX0i6;6 z>f#\͈Wu~r6Jg@sa85q>᭰#,E%}a7ȩDܵ w l{aӫ-gSBN :֮[-G:$oIT.ȇ1L&ŹVzS/jrq]rE&T[ߕ6<"zr<_%4۠s˴XQzqo҉bly*9F iz+E gf)|K kYf~J^HDDzN;a;̑ )r׎I0@nCNĶoΩwm0Чd6{To 7E^0#wirO包5Ɖ'?Aoz ?0< *Z0.6;P Dh 4{_ZXl}qOҾ\/.gh과~zaU(e8;uaNCB# wGvyQ~KMS3DyI6$PlcqH]" *TB* ;~;V뤛CG9 $d^afoyR+*D)vĦcׂ/$K#uXް ]h" .Ӯ8+P@'|AvK.>y>76t{vHJj|@WU\AB ‰/;ol* amH |ģk=vRmI(m壟ls04-~_C1ok0 NFy~}]Y9:K=Py3 $gYDs5cߣ ^WqM 3(׉:j.ƚG1=5"P-&xJȥͺer_V'z>Dl(QꋵVE4 ekԅT5w@B\ .n%$# vֲ`qe`" <$!b/[FI!G5l-Sb93ht8SA+`-žP>ϡUR=B}+S E\BcEuyH'߾AU|w O_-q\(f,_&5Mx>ؑU&ePJfM]ĽSyIU;SXEҜW I2B5:BƳL] F$U<>OcϺ<_&{X^CǍ xo͉LKLӉ6Bg,~=ǡV<c·9*0/V !D$*iq71s2)*OSl<9|鯨c̺`(eQ[߿k(G-qa% r-s7d#u=H^e,򑍥|˩W),;AT|? Bh=ir&E> w 68jkr=n߀ŏG)1pՍ޷}643*"nEA(3/LP{'С/b )+(݌OFR %##Eϖe "~τ|h܃88}GF^Yq28Ip_\) k7B!exR2tazXaFcpy%= ̟G*ƱwFhNԖ5{.OI z!%:vTAhukpH KBL,0oUqPŐת/դTF= ʺr]%x2WWlS;-fDF^B6Ҙ!݌^FZ Un ڜ dT"w1y~!-H(唨St罻{Z{:\!+yۺ3WY_ܧQ%^2_9m[>]JQT|dQEaeMzr:&S^un33pbUɩ7NܟiwiND ^).8Mk<^Y>B⨪{ZX*O/4gJK~)BWŶCK=CO3xH20qK.>)C-in]ymav%IXΰ="+)c\&_yɀ@ըjKyvf" :OWL^M9vzEl!#2a7^!$K7Vhꢫ2*li˭1L1Cb4>+%cB V+[c{a 7j K;c~M D8k !DrZJ24Ʃ.ՙ9eoYLD8ʇ99uQok acɒ Iq-JZfŵyPs\oʐ,U(R8iaǖzQS(׵vHTb_l'{--sլ^ifd{}L4x6+M'[;U_ ).(OGb&SUc;L U63ք6H*?-k#y:*O2DIyz|qrbZ2VGUpDꝊ@ _"ɏ1VIʵYۆ֬xԵ=!E;b$Moc%Flv<L^I`qJ^۲e.a! Ia:\ܦΕ)[0ק X`707,ٜ*%gqdpnc=&iK-[?wJǴ]HمEغ@^R ="t+~o%iS,UiY .aNX3PAu:>9mVJ5!B>b;MrV#)z[Z2!8dXRVo!#{k8MQWɶAaPIi$o'ڗpsLiDXu*HB"wPI̋L{OB3l)T~t$?5`@nRX]SѰGe{gQzEptЪH~pkiOXzϗ\;7.x͸5ʒ?oc0{dڇ;~lD&&f۵j@0~ڈƎsW^#Q!0 6`p_! ԥ2>ʽ@iY]EsRPYw23s&cxCUeTX1a}uPaW?Jm8QJ8.X~KrK~pXdMmvLI' t麤Nl &dDvĢںC6b$hːVR/xR񞺲jQ9:'6Riq# >p]!# ?މVWƢG?Y^Py=eY{Q9>s DYKQ!隱%ÛY AsT498?tӔ153 (YtŞxe$ S Jua K9|oiEQ8$`Q#0aH]W#cLLFLbSFr%G s'I{]`br!huP#Z)ӄ ECCC-+(6#Hu"w>+a2B%rRW&$%"s980jinj:5a]3N"߭[ԝ9 bd)6[=EC| gUwU_{N_O NI7X\"!Kp%S.9|=p&q%"R5X ԏg9'aymij[hNSqbh&].ND0~Xtk<ʷ^).jq4'{,0{L_g+Օ)ɴ\ ^M0SM}@9Lx/~?p$np%)e_ϻLv5F sIuRM|8MuՃ6 ç1тeފaӲ)/ }D7Cnbmp'1B2 Q=y*n;M1Ma5GIQ7>ٺ 'da_OB&Gʓ 뷂PCL_\7}W,؝ JY0POI>즜.ګԛqMDD!d01 a -K2 tOҿGRݾ L.%Ǥ򁂉"Mzִں.1S_Xڃom 6*dkߩZT"𿯋KuN!JScӐ&eegˆzo}t仲nH\i:wa'RPwQ"L%\S v:Z#^ׅW4ኯL_+ut4r,=Sz?`"#[Z9&+P\Ì^ڥ,="^ p&U9*\2/@j1(bPp=?,}VmI۳׿b{{H%VpvNnLj6Z\Mֶj-Gl;VUX'frO`ja= 1Ӊ̷dhKyQxV_-t$fLg0ZűrR$S(Ҩ  D|0mWH+46"R;lFj !Wf[:sܜ]"H< D.槦%kM"3<ά\dr!Wԯ?ϛT DfĻG{C+.{^#;ϝ܀ψ6{{9au`4& /J ~~mxE[ wX! sGЍS't&64Z=D$b c2֌CcDDXq:*G/ӱDtQ rmꨧ̗NmaB3*1?+!iBR|FfrNL!k綩?9o{Έ_[cY(O#?U}h}TdJ؆[12OCw&#[ jx=eЂu2!W ˚&cR-@] 177tz3 .R3b&Mjl˛GXi0'L˔y>DǤGez?p#CIЭ܈7N(sL)O\„ctMcj)9.UuIj_pfR^_~rpr+(]h̰]c}&M;WyGV˴PsM|vN.' dx7s-lPSyr][5g6kK9"DK篩p7W@ϕںiH"CYdi 1i)8dΒ[(7jƿ6 USI.Lqzy';N3:^Ʊ: (*:<Ȝf1L.*co![)MCZ=\y0~J+v<>2-rRuM#kH-8tg l8 =cKgYf,5̱D59 s%KZ`J Wa߷y9m= Z@&)_[KeO.h1IWK .kUU;bh??ޢ'@:&Sec,]=V:6#2#n꒭>"g+2:f HK^P gwv z.*:(D}( %.o (fɸܨ!p'2P%"m|N!'twyr"Ǚ OBSװ*g>y ro>4n%K0k_mY$ u5djvrc5yve۟^CzHTɂ)⢐ 췥L#T!8ұZ0"\+(M0<PR*VK1ۥ$:iLL0/2Oeu7AF=JU%֛~Zm-WB(5wJ{>x.pVGFd5(ՂDzwvd*:Dr 9LC2}ݜ^as)ʔO<ߡkTLEk F(_tE/2?GC5:XBtF!y*TWE:כqK[wZ3ʬI8n-&P'ߝqaS*{6\vϗ :tв<--n7?|BRuM:#'#ڇsL; OzCe'+KM{d} _er?ֆz@7z1 ˲|00{;@7~]w֔= t^*8j:\Fg!AJs P>Vu]r-A?NzWL8}¯}=?Ҿ6H@ǷIIYaPO`^zKjQ'cT GŏjBLej+6+8x;A6qͲGxz9ҽ,܎&wc>'#sgX!ΟsAeJ"A^܆ D :ȧO_a(zXs0?N[v5k|t3Mi_0@fVfTVJJWMtX/7LҐynh}A2x*:,Lx5!R4N"xc :IJQw xWwl4Q׃{D_u~锦Nzվ6ى}P%iwBFU Ti?c¢Dtto[f8 =?KYe/ꃚds؊Zdu ؜k=y2aOJBdz3n%nM;s"ڛ^e$O E.7F^'@H+~0/Mhw܏?#$;uj ]P( ?' `rR~c+|_@M4P[ y Bўr{VA_pvDi) ޻{a#o 0(mKf!8VCm!?d'dx[cdzv6T 6Pu2S齈VH8`/_{_]B:Y-PzU"4mn++S8%.v\ˇ9DհB?q.Ŗǁ04ݽCyO( awsU[ rjwl!ı$k~`м2۸LAb\J+֊i1èPԅm 8?ONk~#[ uj!/y*!umwKae`)+0ς6FV ״4` Jøq-NCg fOL|uwG׉e( Xz5-HűsDY3Y2`.-0Y4r2×ص4/+Ư!c2c7z7lz%Ix*QZ//3 Ɑ1Yv`gڤhaaC̏ol5c^s]}Vv#'Э( Cs},X)L| `Ňn+yM"ۣ{т$O4?[iZ#M9Un3$TjN6~FQ5 ѝvf%8,Pea(o[X)VһXF1GuB )K&JR݃˯>S=mKOgSn9rJOE ^͐wZKNUrG̲YmRytIbf 3:â:,l|hdk+Aj)~hQ-w&ŭ '@KJL0 <6w;)ܻaONߺ>xᙔT (!#'Ӹ 3|>B> jxKcY]t+dfA0\cB;ڹ}JzvMtl':͠zoZƟhL1Wt,mk|c H@|XܝT Н'C fM=6HHˡV/;&{\S[] L|WgaN8h\ORd&,Ԥs>I \f=L*.Խzz]Q5X rQ|/ M?|K]\" -N'/{r>[(RC> ϝCn\ T7gJOx9'>Qܧ@vCG;rd#e7&o!KXSo+ה4>RMW%'!v+v"̙#95$ɾ;hYI/^IܼēKA ,$>=K=QY oek/G9gg͹W֤V- j惢 I"Ŕ8w!ris4CR +0nd?4>C^u|C,}ʻnNuD@Ѧ@SΟv״Y`4,HArQɤ X%Fbԥ"RrЧ;] ٙO:gX 5lȧ@&cI 2&+t~7~$-](8,<.zзXYMO(T;,p@ 2nRژ|w6 h8eG=/"`eEFCG nK)#{O˜(P; O[F[\Y}~,Y*8: lD-̋2>4vۅTbfeΣ^c[4uډ ? rs/UnsW*<9Na1I{?}1p ,4P(b٬Uٸvk4DOok,۴d)S]6B_2F)5xB]gfiثUs;&;>/ s wkit GD &45}9>ACjw1΀wz_tkP]-s~hF{Hz B!䒓zBn`[hU-VIِ ?ڝtAZFA].2h8c?Jl${2W/\tDۚwG'UuahCvNXkLTy4FS+9b]$|` $`-Vѹ)/ͅfOCOr6Z֠z!N5^@Y&/ȴ󤽓sfHoSciWĐb1sehD$'!ZE:mɔ."H.RĒ~$;:K-b!ڶM2yRf-|WjeG? \ gHtL=Socr3lH rB_N(l5},P?莥#Aդ"pš7 erY2~/ Hƅ,{7QB?vm7FfʗaR 43ͫe\eDVggֺ0*5tT>)  thc?[s܊i|FCiӭB^"Q;kXmQN Dyp(畩 L%/jEG݇('<;tynBfYY CRZA4FDfvqhbԥ~*A|yWV0K[^eVHI[_ZcW>ʗABʭsp_e&|gAҜ@PmseOνG;⒚_A4 "M&ƈOB \`@S<-֓DHwV-1HN阓/SjT.EKP)\~y;jq_slZMjQ\ټ OE;5 ĵ )E\Tu.9+;Cug݅){ `q׺ܐv9p=,$*E-/QĔ[uEKFr);qcg/]Bu6p]Og(!xWJbϾO{ړ?ؚo&4teԭgQGHߌLMtw WѮ#%d8^d܋yibhtQGi8k@D94-(Gwc쾘KWOx7DX&n, TXIe-o w0xT+Y7^XWG* l5vJ:OD:b:R mă `HJ=|rAunk71Sw$MۼeH/ᴧS(M7cYT ya'P+ qu @\ˮ90OlǨ1D2N^a^!3âzsyd +e' S gትcVUq'YEJ:5}> #yjrE&ݚ"&_LⷒM|8҆IK@Hʹ DF3.ntO󺅷v!Ci N6ۭ[\3d@i@h{ $)Q\D󵭬gv#75+. ͝C) /mya j^c3JNF׸jHd#2X#Fxoyy@1CPx&==4]:(+\2ş^rĂ|¥[VLWz$Hh/=ٞ7T8<"yf= Hz NP$2!Rm}殪S_*x*Xެ2eX|s׹YXZ =J`Ǯɂa # OV`ʔ4owjh}e+;sO\$siPB 5s44T޴'q*ꛮM8p|"?>do:!@0-1<[ѣq=ȶfۺTPY !f4GN5XEH[V[COR=*rc<{GV+;9d|:9X>un17Rt][&"z$ol("gFG6-H ?/%b6FZIv7|iۄsшT@.=QHΤ' f34moBEwL;"4=^#u"cFozj|.,\ o6/`B}|I1R0*ɲl uZ*=g`nBWp[ dNi|fDp`#lIx~= ?W+ y!aSd:άK"q$ I]O0I8j`_qKMS=hyeD!$(_e=۵ _mVCG#;K?eܼyMxGQՏYU YpuS:wCshDc7L7urB;uFArv3pD+dT8[$dUsN{Z;(GD0#J:Sˣg|HV QyDBvǬoO"5!=ɕ wk|#ΐaBN|&~qj)+nRd 1P{ʳD{5F\$k78{"E 2U%U*)+qݹ EL1Wy-Al:Q_K  pʙV§Vi`lKg90(gQ*< YciސH?F9lJS"Vھ-0v{;RR!P͕W`}spZ'(dl>tj5=P$uoemUE$IorHː=mr &IN䢥Ky tKai$Rٽа:FL̘ŧ4`Bu2To;>өTHjΉ\ Ű},O1S"JyC69V0pqԄ|>5NSUUV(4l @Z>)'СMfboh3"4O痎;rNG,9|KhG9t彚Max=sZNwJۥ$Mf}sbPы;Fˇя{< g*\+vyafzZ9p󢙙&6AӁyj`T\[V\"{qZU*BhA7ν^Bt. Ѵ0M\[Gڳ[-{R~4DŽxy7ׅp||8MtD_:R=Fyk7Wt2 %}썛Qљ$3h=MO@I)a)[0t9R?>ZͮK_ЕҥJԸuQߚ`(ɶ[%KaP7Y.;do3|=ox,nD-M=mA .^<33\'F0?˔=^E LM|o+bjh ACfMs̥ z8: WY<,g#iB,Z|5MZ}#Kc׆ϕS$_`莝wn XмEl8\IT8.AS'`cQͼ'a$ vX=CJ0P0Gq4#[:H0\txX$vu9VBu⬊qB?ĉR 3 )W?ikg|Ir= '9k;ʞuB;4I~,ckt;DeB!x endstream endobj 440 0 obj << /Length1 2096 /Length2 16093 /Length3 0 /Length 17365 /Filter /FlateDecode >> stream xڌt.NG۶Nqǩfm۶m踣N}\UENY^(akDW012011wK Gtp4^h!3p08[Y<̜< \'g?FNC ܟbɿ;>?O:elkceTUST""nOzVn= ;Q> ?6&ѥ)ߧOŠw,ۏ W&v&71o]Z1`MՁZWyJ;|쀰h(a4lddQ\2~u4B331/VY~\ 4Rba88}bx21 02:}>yLl:Ov_! `bALF?(e G?#A?#E?3FAl|\A2? 3D2ctG01?2 G6R}tcJb?jӨζN@+Ŀ揲Al?.aq}q'5dG>9ო?Gc\?tǡ|x#Gx#goﶏ4[^5 l{sߟ%WAM :2^8qemWNh{KR׋^~+dީpm?,>W{/5?KfN,{g.9菮}n%c J/%3_ ȳ qH `hЮܐg2'߉dbi"Y=X=˾8vjߡMSx%`/z ,5e"%ѣ0V+4V-w0e%)⫋1H1+[ѝY-G&"mj&+3yNjČPu .<ҲX&/دҟ,]DG٫# MWյ_˒ .N;8GJp>ɤcۇ]N Qt᫔Cy`C06[n w|.'[qF[!Lֶ;Cփ>A:ք>_Ƹ'n~vB r%$e]pA&;^ No}68*:Ԏ%:tuӛ8W ~Һ>w-~T֘dd߄X+}2Hap0bu}ȫՁmZ֨vMҭ;4ڣ1WB:9A~@;^۝9[E9bgOYC|J"b1[E!\PTxr;Q)0dd^Jf9rpa"?p(Gq귶;+\h1{s^MQd$Iosb%{'GDe/<ۑfx/>?bRT(fc~i] [z N=)RsWq`:Fjg`ɒմ4>Pjw(}wa&kGPBt ݯ'}-!mHbuF|zPg|`l;l#A!Т,w~&Ҍe7~Ok6#7ru9Ѯg8b'QQlی<,XuF m?\\hl}$\j4 Lȝ gIME4j D]շK%|vH*!fgc|;.;nK| TX 44UDOVb5J*2ǝdźXtp]AF19ǐVSxD7IDO0iTKc8J]͒" Ԣ8&iV]MS }>e-pvYAQ -Io_az\)<9HI>; Z!ؤz_fg @/:Y@fg KgDr WFEtlȾUϭQ6}b˄tH/%)c<6۝^*=H8?P1͵]k,tR֗N삟N--•^X2mcj .K`M }7H̠%j.ZF4v~2I(F5ml=IGn+;6+ةŘ"Mh6WȐ{/JK%|9 ):Of#ãF~6c'K}^SnJ5w<)鮉G5j(_7| f zVDk_0Tup h=}Z6 V\:{it nI4lW$j(7a;C~Zl}Yi ;4Zaۙd`ľT f+n{Y),s&bفBn-^j\P(p"~Q}K*A8˺q;/ (Z1|m< Wx5~qLO 6.rt0h CIc*ކX O%wceϋ;`~O7JB Oh.Jm`}˾`VFy0%ej]Zaf[ڞilǜԲ ɷfصjW!Rltΰ[N@4 ',ȱ69_!Ioio؋hCw]i J(+nw:,Sm<І#yVz;]BEm#b_aBdilI.U}Cϯ` i\wK/1ːk>e aݵ6 n"O/f WfBQ3”? kיB&n,e4c) n@e1sa^iڡ+M^YS[–V0P &rgwN\,=!L)O}7Ch*8=ӯҍNDQ!}@/.|F/g{#I wOo[o@D~( Q0i SkO*kGIn#CNq 0r _Ty2ߦ| ` m|iBka%QO mEk21B81TN &6m*B <%"-EP+Nmp$cɘ~.V鰖)py}۾ hU5ku;4=OhbLGjayBl$=֪`{7xk5cvW~:ÊO L,yTӺd"Ds7FmŘd?,lʧ0fv}K/oI6b[kj5֕K;Lu^i/!Zq1%7| 'WwR~KRΎ>=1q NT61p$%H#p[фmQ /ogRRd֛nk% oNA]T'tRI!OIˮA8WH>&5m /i0 g '>LUD #Ju V- 1Ro:PX̜}s6vH)Х /dL~0LhMJeqgo}tz BP[IEۆsLu3*L5dy=gM y:#xeNg0dX) n<#Nf&k] ! mS+/ >3>ɭqs{ ,Bm!@ܯTpqQs%@LM;-wcb+Ai t$[1};XMD)t.GOpD4t dlHW.!2_=65LUH6wwŏLWNCI^sG{4)Zթ|OهJyĪ"#)rTBs5> 29 H{B{OUHl!c~] n'O` &79VK荄KBEuY\a+d>הc;lZKiXbW6ɞITK8wl`|uv/@3g$7lfW5۫[(w""_4!HG]tY;jYun}Srbޅ#Sl,0XtK dJEI d(N-N}L!?k)`Qa"7L-%yc4,ꁠ؊|1FY-tp⻇P.8QIuLe(}~& 2qb?,A"eYf>#}LoYnrnFcT\J#HV cXDq"W[2 ʊbϱ$dR<22*RW1&>`vh>2Њ "x2TIJ91>;EO"hw>[+oLѸ]Zhy$믑bVM(i2TkE[S{/xT%7닗Z9nF j`[[AmӔ2.}BQ:j':N]A"*,C#A#mT){D,ݎVVu3l?B(ee>F%8owF$"IZb21F#>Y BXqKhpehMi3w rAtx1 Λh~n4 jqzV?eGS33Btꊇǹ 8a7 xLӷ|Im06ޖq\{\i,A܌usIsU M^L3z৒E;-DoZ+P}38Ga#nӠ)$*zݦuN\,HԁuL ?w$cg,]˓0ZTuQ o7]"Lk b K\h@S 8tm[̏]Ryo"Y>oe?ʁ4Jee/D"4"||0!0ux,jo& nV@N".jT@elSpKH6#Q&45| 3/=7łd_>"[#.c뗴sEm6qY%DAȶa^"SG춴P*4&+$wh7{帆&Q|Ɔ^NXĢ쪫ŕAA[q*#f3w7TkHlZQz7w)Er>Js~ 'N= ahQ|xo+9rOmGfU[Bq} SͥhV]qi< YD£'h_ 8:twoV+|.‰a]i ϶]6}. xmk? [$gP4$҅2+mZjԐFB0 'O Z/]C'XG\UN;7Gza^Ak-IN0v-8;}U5 !|HOOl`#X4uH;ŊfV2<߶8WWK٢Y{il)g[K>BZolQlWDž${{4r9+GyG䷃’5UMzMM)-)ěy=xeo/&`́/b? Wjɱ3b2ېs\T!i~@i+xPzI|#5 {ϱ< D3qBĕld{^XQ3/%װdRfH"Gn[m향Rm=0")G D7{˫nKYWjjǯ-7p0(jv5PgEvCsfĂ-)Uf[x%-:]O~IXxC>_ j.؊(^S;(/ QNQα- Gi.T Pdd&-Otg. QzVENohX 3@Zx`|SmNҙ =VcOe,m4z\$H|MK3^aZ 2,\2L L L{;드tKx)=c#G=Vl$k/_s6ØyS2p,~C#5 lliz:|=mYQ5GPz;SD}pB\Ɉ8J\ !#.P/hiYS(Ĝ*jhL\Yv/'UE/L|1k ̞ooA~otsJmr%BÁ3 b/ߌ@"U %Rž|g;vnE^SZKT^uaB7Mk?ʞ=eG ;^2;>'ew @OW$l{s =¶:/soQ,M\FE]d"%ś+O3 kʼgKt,O;2԰-$ o_a`# A   Y7j0!=>STȧlГ$ M;JBfg|g% ^=-tڃZҔQ|3I.hw2g;8AUȗ+6:As\g ]t4Y|z!^˵DwS#E @ !A<ӡM"\1?+(%kI \}t%Yh{:pP,d.U+dпb# F~ѩ&ByaʧxLuE_ML~0w{I{:`;D)~A3&N]v* ߄A%QU9b/a]F\S*uޚi:JR"g]{вw9'de+o9!r D}@f#Xl}S:Ϙp?w1*02,aQJ!^ M;;OBADMTd4'YU-iЕ!-jit{!7~ސ-B9S ٺ*/J ⭵W. x`Շ ʚ;W7!$M;ԉ4L{Ǻ1Ht{,ruۜ6 ?Ocmh$&4w_3ڦt"k(]y1Ya@li1M>/qᦝ"#TnΧ}" w7D~R dk(ð.pzQ,bNzs{l*qS/x8\ m`'뻕O~mA r#]!|OwvP;ϴB =#O?i*ȿw "!eX@{!#QY12KK/?jC$U5 0%UӸhHW  ?6 ʉ_x$` 6dw8 *|7? %1Ki֦;ٕbMɥV>JJiݻ{Dm=ÄduI-(2$/Zu#<^F +VXXDZ4dJP3>X3G]}P,B6En:c{>[4MzYdHp](ZKK@!(8J5#@cqH{=(G-$V\ЌA5XI005]oǫR<y>N9T!dn?M4lVN}(RӮfidxe ?}ؖ;A@R=&5M)6/ܩ K瓪ֻpMCcLR4eŞy!"9%rm;[5+3݂aHAxnއNn no@(+Cpy "dwERr)dS`:_/>" l*M6;(gF0i=ζ̞ehK劚`Gtߊ&}cOh-i=pIL p_4e@@O%Ʌ4@-Gl/Wj!at&%Jj)xruWZ-Sb#n;x$􏉻vBU<&- ]m%"}u8eC\ {`lsCVRiKek1[?3Ai؏WE+U6Ay ,&ђ\~ cI|lFi8G {wA1@j(W -0Iyξc8k.5,n,xVMD eȌmJ]:lgYEE ~[XGmX:leP$6XKԔ"aaSKei~ K"TIutR҈;> ( yP8U6|>ŀ!e_<#ȮJ 1 .\>`~F^gES]b9Fk۞S]|ܮiYpRpecx4SiĦK$1?H[r4B*WMi ٚ7 %A,9[ *ۣ-8Ng#Oerյ}v*KXל5}OuwHD"`wRǫN݆S mhKSZW]kKW_''O{r{~DP=Lh2ah(?DfXpK) #vO2ۘCٛO` iJt_ WEr_ ׈'Pffoͩ0<~5tWNYF/oYuAr=(kBa|C66QS;^T 5(}A9v2n"Y`T!"{J :ə J-30D֛W_oMY=$q{7w"5 dh%"#BnSN\Uvu $L/Ϟp.o(Y%kUeyDnΫ @ 9%q,0GnQ^qX!DUfx}~oFsF|L/Kv (fiCe1}PR1 QjP| ;EqugJ1lT >pj_pʵlmlI(J]h3y.d$bwT/FTf3zZoȉX4 S|~ن~FwU&8%Z? `Glaq`2;:Ш ƈ-YO-FOa de y{DLBW)a,:1i)icn#|4'-iwgND9xH{5OLĈv 7⼹׽J?͌&Q ELrC;#ĩL+7!Q3z)b6}95$ڂ SRL%**ՇY#Q<)zYȽ.on!_Iju&(KkPPLEAŭ%6/pH*T85x( uB^3O4Ƹ9CG|Bdʐ6-BW#*)Ks"tk%W+.oEĔ5 Ih+PˇtrAxꟽ({vY682t=+{l]*#kxI*drewٷ8G 4WxPuΘHq omٙ㛙ҍ@#QjV\.z:C]ڡ+xOes]mC2X oLd:sB؂%fSSH+qyܡ'vB1ӘBUc~%6ïo?䚈{IZ*L$"41t#j2U KKƮ>Z2ndv@g^d kO]_ J26LiNB\-$j@hldfhPw IFQ6""-_qdKt* `1}dk"SwٔI13I*%e_PwKx!}5Y3'A-s""^'*8ѕCH㸥@1`Vb`O1n#++lu6&,6D ?AyiUQf\MbZ S{'yE)Z`{|P³,یceݺpP@u9݂@NcMϑ~L7A0? q]Ww`c0x73Վ_[?u s64n~ے*UG9*un!D9(|;~ҽ-d2 FK^SYcMJEgbF9ysTmK^U⟪{`< W688Cb_~%!Ysc עzrG>UGVM8\zdEyi{mӀ"o2O_UT\~zLPwFMqI3S8ۏЏ)- ^l V%S'PɅzP6JW;:l~}^/efiWszL%gҗrb'Th~wiS/ؼ&«hkD"FW.GVA=8O+4N${%W].٫mR]MgQU 9~ՆI!Zn\))RR QmjB)Ly-X9aЮ<|$qR?luSXX6%!xB /u^U=V;몌L%I$+P ?Ӊ0'zn1 J ˄xb,RԨ!{Yڗ}߆8_-uTւ$YQ^@@g*Sż9,ġ^jozjvz[#*ֵDlbz{k9 ?m3ɮ5dCN[?꜑vS=%j9Q9ѿO.S/]DIklImyM:k{d1m~IUUO+?s/-xC!"*ׂEXޓ=\I a +zۍX Id 1ΰpWu:@?f퇧|wV1Zr(VK|Ny{^ [Ժ@.ZaX>H(bOG[t&R18YoY]ʿϙ6`FÎ=^O͍mZyt[ih=TM:XB5ߎjd.9t)g gW@~/7ؙ5{܃`:Njh4lpߔxFWbퟡL)aCqo>/ T} .\oV6*eCZGCvg,:_OnO_.#G崲#>[xo:p!>@\!|^v?uo^kd* ҋf\{c|J?i؋Fp̄ԭ@(^om>2LӢ$}.F6ݲ@.NQ} (,U$Z6iWj!b$ "B8CcZ| %?8zZsQ J6)L,_iF$"ʻ7ZE7/| b$e>Qg$B;ƼwSD*jCrgO8bb[5wkuj.B2@h bt4'%ĵ/Jg-Ht2XFgxv1Io_`8 fY"%aȫ7prŵgTj&T `qM Zt,$ħ˂PS!*Y)vD>NH#n1-:+'͎qƅBP]c3~m6p(`,ZF{ ݼ܊/Y8ۻwPd/͒%GS V˪@VfJ#G+!kWVxU xyMi03$I ]r[71pdJ VܣnԐE`$%[RmҢ҆&n\a95s\29-%.E߿Dgڮh}QhkCSe~}FT5ra?:*[bA~m;F#ާI'$ LtqdLo+i+F(I&TCQG1`*3D;+ǯ60b3B2>wKWgrOosD%'7v}OAC\L0'soň6VZ*>?Y }gV+n-S f.r wؼG!ܡ}_|u8QC7]˭w GY~Npm89>DNweGTDGQ*SѸ\I7{1d~6aB-zQkЦI|ۿm {ۢ&/mŬ:S|9Ol"c%am|ILD`hgOM徑4 nU3#!{K1=嬯͝ۿPH;F+ڪt,'."x/Xc˘$#'&'Nn]R{N=SbVwD_4NR'OtLJ~7J-7րnP/y$.:PVә@q1%.}V xO ZN.d)l@;1(rT݄\{`HB7;i%.`1Ye6qC/gĚ-: a9+*Kh&Ex\];p'"d?V؝,_/Ya ҎWu,fw3=\@+Q9w(Hj#1 3;a endstream endobj 442 0 obj << /Length1 1750 /Length2 11376 /Length3 0 /Length 12486 /Filter /FlateDecode >> stream xڍP ݃ =8 000[ݝ`]e9{ymuw)Tԙ!@i33+?@BQ]ʎLMr#G:: vbH8M_e&ίDE@ `qYYC8$M\AEfL-pYZ9#֌9@23(8[m_#3\ Z9;󳰸1:1C-n g+ 4Q2@wi +_ u#*̀vN&.v@Gkt@hY/#18ilbf7Y,@` @YZݙ`bgy7q5ML_ nSVw}Nf {g'f'YpzRv[[Ifwsm nv^A ;s?0wgѴ9e%漊Y\<|nfG {J?į5xCe}@d/'W o"d669` !U :~l?>}2x0s-fQ%wUC^L&v.V;_v_龞Rv{h^:RN.@Ϡr~?MM^_f$7=fN(B^wR"b& fg:L|̜AN w ꯡKǺAv@ t;ffz8N* oX);3 0qt4@~m+x.9Y0A_M%, "/ `/xE,fEb/` /zEV?W_b/_|M,,br_,: /kZ.i r'n8:lnkF@w,L Ⱥ&J8;'Ej%G^/5Co/6:6iumpBN .;zvMjCnWt?3?o):Ei8bF@ @jl}t!:~@*?ε1P^*@8uXx0M#EKpiT]J KvkB$Ke2&NnUGYcK?N&oPV',nK2~襳A#7wӖ>=J6퀆2q1opYbEl2u˿6 Bb+=xH H_aX~h|R"`4,wfWt2)G5> z4t2~N׵Sa 5N:&@,b}Ӫ7_^z0mt]|{-ݣ]nOF6G.f,bہ=7% eofyJ㺡Χ%-G(1 ?rzpf+ "kr?|ш(@,d]”p8{y~='2H'ed=Qg;J xwڊYr ް4zeidCO_?ӤNT`CI/5dHDum"p=JQ4vnD֛s Ct ݲ!'a;q(9y%dʜ"_PVz[0kgt=׊fL.5GsnLmyk|07^L#m4toi(;gPG4Kk" 9h7'0[e`UĵJU!ȟ 0:GPBm{u-f6(b'6| W.2TV!u1e&jPB {3H9ޱ?|Նt)""΁؅BBsqnU{q[" K?o$w<Vk*iAY6Lx_{HaYlHO¹hxԵjOsa'ԻmmQrwKyp2$z@z@9S)N ?EjζC突7hbyÌu[CKW3e>?eՍ6#3D3W7aÙ00IġbMFHiHHfHygE |V FxYlXm?im>꼂8siSبY o5>tiIDxAԧp2bJ&)Bi5]܉{5y \P˞$Ue$!OP &Q>^Fzd7 1b?| 2J(2-QZGa5 #SUޭ9 hܞp70ALhzzNzCS%آ\g#V3 gzfݾbF27Xc]2ֶ'i q̫_H!*A53,2غ=DJV~Hk\A?ּJOḌ̌"PÛ)?=הM_3Īғ?pݕpBXUT$*sClָ/e|z{ rÈ@ߵQ@H^> "ˀkUywIvQdM%(.Oy&|}JAxN(RbfFһ&C6~IKYt5ă=@8mln5ozw5' vЋU=BKjByYcijV?<9p";sY+cN%Hԛ/1or55zٱ (ӡH4L&i7g65[M܆Go|)jff*NI# n붚_sOc5b$Ѻ~ہp*;BmmZߺΆּUz.Q;28s;sD%j7zq?Z&p,z¤]  -++?w9=5-(1{YVeo2͇O_"v_:ڶM"}+%d{gQuѹI1aGi!״st>q-*AզpdjpV$>tܯFB&|`>L:caT!*͓w3/3ps )L4M;vDvh:Pi23g5f!YL@rak*pr+yQ+oh}@{h_Yc.n#yxDIjD0˓S"t@\.& l45]Hc/tdR<b~5Q] pf$PlKӗ)㰥k+t73x3w: L%V8m $:3D,HTkVO;EE1 59Ko֕.@5,| qv+|myD);ZMd5jjYh~ qӑrr0d"dNb.FP\I3q. m'?Mt>3t_1IՄw PD77e- i\F7pAǔ Y?U^_kƼ% M!r2BӦc{p~B>({a|0Ҏ4͑W03=ϦYih ="mLz*`ǸIga'<ȧOU0\=_%IIqɽ h2/&i_].{gܯK|ivL6Bv&P?p9J8MkIejdp.*~PݼcB3xy0+bUvNN)È|8KrK^Ta5lOŽ /ؚy b~y$:xڍ HVjPN1\W7U_h_7>V0 u}!#uCE{I=Iy>*ݸ'-{MzT;л^튘krI( v9f熠ؠOg#c#B~o{lEeu2r)롛ł̃N2 .fab7eᅦ".*灭bz v5|?K.<{^&S8edAp~# z_JLadۗDHuBc)͊{Kbٜ&ꏑ+;.,Y7OAZ)q*-mqɳ6 Aw; _lB*sQ}e)*晜zǫ{Fv~G{ªwX0Lp{=:ڄ<_[ OW\{C@س'6(p!<h)r+QK$ү7@m0pFnMQ[~3ZsLDjAv\E -|b~7<|\P otdQV뿜w2 ܊Eĺ y k2x6&֣e9D;׶}Al4uRιwԈZ>C, ʾ:^%{(8UǦ (n-or|s= aQXtJT )& ?,(;Ri?=^a| a5AЛ>GږLQ(o5(i/ZeV{!{MrtJZ#H'_NL4=)3ƒ"[0X[պ&Q-ֶ/7EїmƊ  BF:ꋧ%u6MҾԳ`*4.ԗ?tnjmMD`_;; ,|8<2'7 I$֊եfM5?9DUGwm +eze0Hu avm \!2F4Q"I;ΰ1xa~ OF(VZ|$D祜ȊIg炙!lkD{벱&tsfz] V<>ߥeRA֙Xoq% @tB=bA: a΋umhM33wTLS)+9s1bGv8M`T 'KR]6]ү--7g{Ɋ.}ņ~=ֲ=0Luv˨2pQi{Q 5ʸwb”t=`BD5 ^i]\2FGY/h98I1X-P[* d+K7V yM%jX +dz~ 2tݟPeq=|\]+N?Ғ&ț!̧ͅnM\ַB-{L\BP рYE(#)-zT+Z=cFΟ!F)c2h "H2Άe%ӪRcE px! U/Ӧ}څT%!=xnG#X /H_[Fsn2Dj&Z(1or]g&xPɾΖTuLf)`+WMhLw21:|[O|.wH w"2sf"=4fj@)SzPHmǡTsp^%FMW&¤#a0D^'v$0~mv7jЖqݶU%)=MobZ\8ޫ~):҆ Oy\;1ǣ Mq^{="ּ=o+,*p`xL¨j\&9cE/DV181I D-8w|}' c~-Oq6%`-ϭߔI$[_%k(w_XUY]X zZw3Ѱ =)ܐ.1p(BZ4JP8p=`pA͎82yk~qeAjlZlUn\O>6#~_JjURgHS6')wf`^?$$E) @S3}/8 `mg"13B*c}'4ߕfяlq]DsWx~(o۫gy_8QZ S:6T |9xqS:{r`1 Rއ~Nv+xy( 0rz)PRTI1&ku>l:س)Xa[/g$ZbFG¬^aoo'3R!jTۭ^؛uJ6;M+DiL_zj1X%lJE[=yFKq#?KS,FzM\A˙BaIY F )!h Q1~k^:^oqð}CؖK$I3\}^v?Llzȗ*_5#Jv4/cPϲю4VO>E]ʽ(I`9SN(^،GξoABA5 Q}Ppu=Iĩm0S>nXZ=fMq;72eyܘhPAma_Vxxdp nӗޥ W kUYDr= qׁ-۔{wm͉zdhnc!f]W?m*d;3'(E8q]Ƴ"}#|N4CM`S>MW(11Uk#] <q{@@+4Cͦf an"۔rѦIJR(*_#ܴ4wT3cAdOېT>_3Tq 3/ՠ;Fmj;I۳{o;wbrP Uȭe2[DY9)@Dij1ا05!"B@–U]gJ5Ad]day۬EI~Bzf1 )cМGOwB_oAD!qS dGQWO`#?+ ; ^ @ fcwSNfcJ #<9aH&E^CXLc9/{Dnzx7"߈,|u/%-U{bNf :Q2k%iFr 9 ϚBjoGtχծ/WzWHg^ߞs$f } g`mnoǯE{:"k[坦tB^pfV.᪼[( H3J=CCV߿Ϯ3Fӥp&Ǯ=h; 3s^.yb~'r)jniQGBpRטKK2I%؉lu r"Çdt DClIRjZZ2kH{qKݫˡʱb?~˷WxI  a7n1+?Glc:Yv%9dt֋dcC gjNvNVR0|FQ+cj;5Tv?.]3OZ2THUSںuD+4)|wx”@(Zl8xf뚖Z_//yH^l1[*b(B!K[i8Z$-Nr(xp 0%OUYjOB"f]4&* %1y(w >.-,i$ژ&^46\]*-PD/i*toy *]Wլ~7ae9ܺ: %Ml]뮣xa=ȜRj,C2~eKlto6INFC:bW )wVG-ҳ쯯xUoY Q}x̭Q%ehXv?ewL"-Ģ56('3F6 ZruPБgZ+&?>ԣǚ]&j q 7P?xT%@AS;"+<`ZX$Ka3z!XCANk6#y!zlⲇ5M3 r-72 y͏WaJuсfF4 xTr*jAix 7q:+Iٰ{sɧg/uo#="} ?AK($v\ބ5AKVVg׻s%X8FC[)w[;J55*)s-2 ++{*6L`} e,ڳWFg4@%2fZ!=5o z3=z{=Yx2Lk:s-Y\fWY@$sa>Ox]@s|pY qe(y|cIbZY8%Cӎ rBptmݏBN0Kq #~.(y%XoTU/'ڭ?JuuGj[5)bO8h0j=JBSh&N6S{Csu7%W`kzh/%[<u1J8זx6&DًfCjB[FcKM]5_YxSFjϖn:j+*a*[X[~gby* coeiI0ݛIFao:d@h(f0gKfU tұ P~Py{+0z_\6Nxbk$YTnO}TB;yvGLKkoKBΦхE¥R704kAxVKI;P:[&E'' IصdK'֌Aj9uMyxsK߈_Fު-}_I5"ij8OY]um3YA$hRb0\r[5S+߂|Θ{5UWRG1yΌfLBhTXǶvܓx4XSJg!"eIY~~Cp:F܋2P<[IT%qߝjq$%29OQXHGgjishW6);M;]H*,ߤcKІEn!#C3<u'c/ 6EHf\{A9w[ꕢ:NDo|Ipv ijz>t-B3ĄbaK nR,x 5OA7DrԷS;B>aAco5Y#P(_2SJmo~`H]8hw$1dU =JWդj 9Qu̢}W^|?{5M'xKbfC+W%sZ0νHH3Dc wWr)q̽@$˵}F8'?2c1B =2 Q v,Z3{{@BI`k>C9"(){U\`(ת0eAfӞ K),c!Xcf-:@{| endstream endobj 444 0 obj << /Length1 1809 /Length2 10207 /Length3 0 /Length 11337 /Filter /FlateDecode >> stream xڍvUT\[-SC%w (\ ww'H$,hG>ި1Nlϵ\{*2%U&S;c-WSSc@vf J Art#2č /vYgk+;sMY;[2#ҿ_&tV^^nƿ"6 G-@byYjgAbldlh.DpC,* ' m ?1#S,NT F luzIr59^AXYS_ٿ mJ6217uۚ 3 05hddob62~ @RD`:t2qCֿd]e%lMll@' wg[ڹzf[1ugQ;8dbBf8@  7 ߋۃr6iog0{i 6!{:Gg矎FȬS ` 2"S 2ϛދLl Y$UܢvnO&6  xw!%#*ckfF˿@9w-] 4yyWrt+!W _1/vPo)m+1z [i32spm;I@J`_2۬{ %;' eL^u*akbg{8FFQqr3Ds`A|^J7Sk-*!,;_[}ExB $Y:^>|@ˀƉ;Ymv,Ù^Q4N)dH1V 7_H'۽Ew]i. n`|((q"_ %gOFZd]ƦfQS-\ ,xdq qMIӞfcMv' )v"pCrd(C5"EZ񯟭w$ fCёd?aQ^9*wO7#:b4~c#->I=J1 VMz_1v 6J y=\)Y:PE':x?aGoJڻETd P%IJ92$ ɼ]ӕ 1&a"p::ma툙׋&d @ 4g  $6Yunʷz@&0 ^nt%>dpP쟢bĮC&bŠD~kj X[29S޼țCom7u,3C RFN#It?3>*鴵w9ԎOSn2!&uslgv/ =~&׵;)ExHMP,R}i?{g)gpۃsJi[᭚EHnT-*nM+l}u* i`n;#<3 CRpRՎ>r.&'#Z?k#_'a?\ʰُ2wՆ5XPQnCIn~V=V;hHRX]]0uw#܅v:Or"|xkVCo@$}Ok7RҊ2(9&n=D f}w1܏S3L⢦ӵ{Z.{FdN*Xb!+q\[(E 3SA/}ӯ^y\},!! kL7e׾jN_xYw%+,%t"4db)IJ2T{(@GˊEe\8b \s(FN{Ar*͠ ΐo᜺AS]\z9ۜR5/j&Qf1~$eY2d'j; ڊ! 5RlN_6^&q0U7Vw_h6EWbKxh0bi tk/AEk"I٦dB* C.|dyǓbA" ?|;i%xɿDA,v&n DžiMrD(Y-Ǡ@x?5N@B>;2t曨.sJ CG5sK+[׌rЃ٬bXA܀[o=aO-jJCliSb_pnjQԹ=ܱU1ycѴm6l+JrQ>a-ITh-x@ol3vC^X0&pY1kQdJTCvИoڡ{'|ӧ W'սi4xk/ /RJPg?P-+^5 C5bR{1DK\uWD w^gzϕv5<&<2rRIF:22c.ȓ֤+:y%6Ux^9J}=0$8 ք/Jl4,"M4[ Ɉ8Jg/91َG3ᩒ'bt 1\o>}ri6hH$*4fzsT-Q7FuP\\E#)}z0p]Z&2 z؎>Ҷ*Ѵc>neK,.E|źwƖlq>]O.-BiBT6NY'-ۅ?#,q7f+[ɞ:Js6'!Tؚeդ[LΏ*w(Ct>LW66ۇ #ek-$p#u, th;[$~mqa"H-:l)]eu7g2 qf-D̬`Yޔ)پfۼW4|7'dfF`I ^N Jr'MrkX ,>.0\ʏ|Bo׸u2c\" hӚ:SgZ`InTS_xoJ,e oTRZ@ i5`Z3 B"x%U8(36׻:@9j4Y<0uQ:pG5iGPny [uѪ|;&%EϗoBbaYn=iYƟD I>p7Lf 0`6acg&/g֛ÒLuM6 x5rٔpIdz ^ۯjz͞^6z'D=,hB`ky5iTnF.g.fk:2sb S#7leNk寬M<SšB Ƒ_ޗ$g㧰X!42tAo뭟FJł LׇyX: C[EbWPG[ fskUk@1;>*1[Ol.,D:ٽMX_ț#KypЇzH 2G1>cSL?KsEUȃx">z|纺3=,8W\o:=uΦGŘk\xa\G_X;%4D;:+w@6!sHL21 Z iVp~p;+{ZfS'֦)GNLybz A7":kwrӛO'XHE#2b)mwC{|8Ɉ{ &TwA} *E5 ^պuE.+tjk8# OPUN2ޅyWBb8M ^::ẕ4 Dn#گo 8DS=? ޲ieX{-϶ΦY>ӋR*(Dz$SY[7*(#o|1xoISxd6`-۠Y#7+4胄uqVQjc~iR|=QeMG'ԙ)ޯ M v|zV L L"2UCgT:LB.S "k,PpJ5ft^YFX Zʦ BݬVyQ, >I@Hlg۷-' -9pdͥGkg;8"G ee*i  P z;,R+1g_x`?=XToYA9C3m=KC6C 2F g#3I$2X\p"v0:=yٕfdNٺ 99!i; `vTc3Yܕ,cgLN_fT~,cynkukbdӱvxҵ;}nkθP!nlF NZpPy)=>awg<qUG: ufMXXKMGxurw~Fr sS@o뺮 |\q()Cd|Ƙ;k óWjz3P(S1rlc!q ׌"Ɖ |'tg|-wI^p)cr UG%9i"H-j(/R 1|#~dfo89x t!=YATFI9e`SN77-S=gAv6~ WM8,ݒ._e"CʤSU_8ܓl)c|lۍ׎ubQw:64!" ~21,ph} 3pј/mȿ|IE7.i}FJ)P>FŅonWG#0vxW \GEڅ,^KcB_Ӕt=6h*򙛈0ݒ{;s"KEH粌:d^e/.WtZ h,١ZbgJ\k7@畻s,;KdU[ֽabܤ-6?M`&zsD CG^i](2{CRt;|YSfNߨ n86:6++bO+uc7v2FRgB]i]9JXIޙ5O}I;a72E ^SQҪVZޢ Lu?mp.}A6TP?emt?P#DJ9Pn0`Lr߱/>|Bsy) >}>4zyׂg;̹HkJwLS_SX}$+*|#ΝqAIɴ/  ŧ_cvB-_TAIކzc^TK 1K4SVY ;no%ŧƸb#<&zih&O?44)o1jDl*g_lretXj6'X4ز&գKj]egUtDvSn*7.$sڦ(T*? z18(JзnLP%#9Zy})V=Q;eq:TݑJ甼\dM1p-cARF8!_ M|II9uu{.sZ| 7sS74 CVM. J; L[-봲p(KgƁB „ !9̹'%uIP:ԯfEu Qɞ" 3 ϊ`!F;Gn7K&JMe-͢DKԯZ˅2{zi1f[$ &lf\ѰPED'~կsTE ݜ S)tAvfqGxF&X eMjz~" `[-@%(-,7AY$J_FIۉ#\X:GۿvBNypnBe>ÈbXt7k< ־@7kyD Ļnܯ ږ+S+suk]$n`~\i Gjp^aaR]֧Kbþ_%ĔYW+. 7gx%γWcWXi9sv01z^l"6u+AR_2l o,cThUX/8!w<Ҷh}p}YG3")mi IyPaq>rGÌI[HBфSPSϖD7_aeZg;ruŲ͚w%oc 7CYimڋaqs5eLK{_Z|91\P3­"U D¬#.՝Iȱ x3nYn-\iKHKO`R/ݵ-#] v?)[=1S*xe#RVUO>vvSqAB%a^a0Ip\`( nG~Э2Ƌ}t~qшpo`*=Xf~/.(q.L"3a*ZJia[_GEt}#^^LTU S)hpԭ_LXN>QT dѱkch9!\)!ـ1~ʫ1NN t*}iFT=$< OcA1#>Va>ݐhSc $~*9hcMIy"ݘe3A}w Ji(W ĜpAQw$L"{05xv[I.Yw~pm0<85J>S޺gkM3k3k>/x^DbVvrAd{vG`WlsڙZFՏD*;4l18%0Y)^1C5\jΔt5](k`= ]&]mL̥`_#zGx*ۖE8$C"#u!L0=?9خU_T7׏ӄܷMTrR|3b?b3b|?Sl0 \iX?PSkcU|6ݥr؈(YD5EKB]fiίE,p|%p<?K- [i "uѰoÖ@\wz%SDeJ{$Y>d((2N f9-a8[!n*>`&r'z)g>y2C&_~yec.zLSb|h .v )]R9ټp{x~ټ0ȇ}˦IN)h\;2eE7zkm#^9á[mR`.!SnzL /fTFUKL K< y ~?i. Fɻ „^ֳ{(^7fb[3Czsɫwi{k fqf-#sS [KoE-ja=dG$R{^Y 6EIpmFl8j[6+ F p~粼]-K+Koк0G+oGq'ɠm=#H#KXso4HGM#$ xؕ]>'úgY )PhsEOH2tNo#Tolo:Ye Y߿ +ݕ@\Lز!d]2 ١pGcYUOi'&ٳ4|!\fDxՑy=pwMĦ ޹J0#:Q!r5GZF~P*0b6-e䕶e~'ݭz#l {hs={li w1Abq[M{ lܟ6TMY $UR;hpI;NNeeV: ż6tg"\¤靍aò`TB<TD>{XY˞uƴN,MQ}Ϡ߹bX<t"U{- AvkFq/PlU#J\'iV]A,vxoI3*>uVxF100sXyO1m9oHsnqm/f wPdC=j3`wxZ*">5;@1To&*6\>p4I|[RJ$^>h֩5(]ۻ~ICcyj|ץ@`p (d,6Ie=T6~ a+M;v$u!;Q9f$?sZBKPh'u}%yX:(5'ps ǭY8BBQ2hƟ*s: endstream endobj 446 0 obj << /Length1 1401 /Length2 6058 /Length3 0 /Length 7007 /Filter /FlateDecode >> stream xڍwT[6R"C7 tw03 ] ҩH(%] " %!)~csZ߷fg}]{_^aa㑵@0$?/H /$¢E@B<P8L?0eS#Q@ 8 Pt~ ~Q =$T0EupD rܿYW 4HG+-ЃB!H`rD"$y^47 E: bBƋ;Bzp{7 .P[ A<Tu@OEr~?ODPد`- { RRE 0'삀^` :P ̇!~Am"N !x?Sz@lQpapo_+{(vn|0'DEeA H $@#n_Nf np75$jA#^ OǿWx @0k{@}3~7 0࿎OIDX;>??# Qaq i?mG Mu;&E\A [ԃ_!?;Rtqg `WH4()j\ *H0J 07P@촡H[|m74( G@-?_>lQE_.J=.P\Qz1 #Q!j@L@@?]_Um==PN/fZkKojn+TrV)Kͳ{~5IO0s͌rveړ%#4;gC>Y!s)ʹH4Ş%=hjDZ"k3L3$NרּUSM(:e1wb5bscE|1Xx n 90cjkX/b9YXŚFi}xp2 ZHTE-͵8o1!G0g<-Nx}:lI Ec&sXsA$qV]66Ϊ3okb.YnCZSh9iMX{#+= O"pRMG4sAIz [&^-pz^&3c\сi'%m=oD+Ek{UZ\]K-b4'0Xz#ᬉS:Qqˋ Png "eS?)<%C2M@GH-]D)מjZF!&gNHݑkN4dRyd2M扅}Yk 1tmb#Mp Gգ9L Ӹ^䉁ØifԇGz%`l恼GL{?u~dٷZ* C}Ce0#O\鶲LGnKRMz~9ei#涡hϟ|sa>9ݡզFǖִ` r6el:&cВeS @%ӱiGHC b/VD~"J]VM$Q& XsWc ?J#OYj1ۯM:'u+Ew"&LBs 0ݰ>$+jDk֡))O*ɮZb19+CoDXF̽GsV߰  }Gjd"L^WW/.Zi!M9΅Md[֮@&sb}ApP9ۊM,IΕSsKJ;w!\#-)%tipFT'݃@f & %^n›W.rv>K]7$e%: :fSnTQ}i֎L˱kz]#7{A" l81`ڗޏ >&~ʄۡei*PZqՠ*Ey F(A>+ufj\i{[ ,ьk;GS'AG)] 'ҶW2Ԫ'(l- {wf4 ǁ$1_N a*`XwMa4!d8dGZ 'mu&G% 9Np6~jR\剏˜Jh^Sp&S*>_#%ӼタJM[@(L3Mhcă;?#&$O3yj!XPoᡘC[Fi7 ~bʩ>ogNwvqi'N/45)PpeXQ~Gbwؔ1g?ZGQ'K~.YNab>#|Xͤ᲎o79WbqנGVv$uW?sqY|uRȑOq!k܈x~?gd!U#y)QzU679/^(K88-sAYav¾^5`QnW-eAh?G%.]S _⁋9sn' ?=s(o@␡GeicK48H!eg3n.is5A2{ֱ]S_6S צ\E̫Xg#|_s-21g Qf^&O>O6B2׵ȺXp<Qj$]ښY$k'?tWtymшP4==v|8Zgq1~y.5m/pUxl: YEd 䪆1kr0F mUϢJٻ>ŕ80AC͝a,*}lU0SX&\Tss#-={,^cR22y;} 7toQ%ـ]ڶ0TŜ Ux1)vCF MǘN2H'ȻdșK2NNSMI-gq "8hwTge OZ 7!yBC&̸,lǗwW"mJ7uY*_2 V#H%#- u~1_rb*s roF@cU\? *07NҶC,f[ŕ !+E]Ŧ@mXFuvOG>b۫\[-a#ݶG.gx;Ǜ7SKU)q|\K:͏/c:Q$HI{w?dzjltoc~=pt>p)UD,~Qg4&H'xPnk1~D!t:j8tśΪJ;tAcP ƴ=}<6O ܌~w%d1w{oƮMf̤FyUX+Zyn|2ηı4δA%ޑ1!Q_DH^K$]ْ]> ZWW͎ ż^ ,!c(<` 5 GnEΌ:S7CS™R%<ܵK.{˲0 zx޻ "i"h{fޣ-hT I>oȝ9jSōdcX~Uk?of-v£1~90?Y.y$Q̟Btz~1ó?Ljڬ;Yݸ2 y@6g`6Bo `geblK շjvL[̤8rܼe OV3꺣bs5Jwdvc2B7*6ψ Hj{);zByt^_^NA9H~CȳQXe.KΕ!ogaAf+^*h(>; X2 i?9RϺc;`v0A|{{P ޣב}@,T_RZ Z[frr*RG {5; &_&;?.`O^j㠻Y3|0V]Md[S>]k$iQ4/.[Ե[rkbWe=%-YfP0`?ꏚ̜ީc~YDH]5 TYȑʪ3Bo#NQyH]^i[[\dٔ>q]P>>UtD0%FM4K' a`t|I3_w^x:|,=s^޵E]ӎɵ V3'hgG6LtvbigoUn *ޤ;ȾFzG=h"Ic2QؖȜ 56N[LŎ:Go karj.t"MޜcqTZ7u|b2KЗ;mC^I|>HUxҌ}Q%󈔗Ӿʨ-zc%\+KKa52&ɷN#̟E<UB}1T*/5 >6#pvw5Lso}Pp;W5T?ox|8 _#`#,C'GlGa]%зa^ͅ:L#&fRcR[ cGL\u+'aNzoEk#z-n;X HDm@Kc3(R"ҍγqKXW$E˯ˈq̂>vqrTX5zSFZ}ՙ endstream endobj 448 0 obj << /Length1 1406 /Length2 6162 /Length3 0 /Length 7128 /Filter /FlateDecode >> stream xڍx4\ڶFAA c3:kD{DoQDI$z'B|}9oZ{sݞ,F v[*Jt, PD&`g7`w$;B۔A(4PhzB"!1)!q)  J DKAP;@ ؕ>PG߷.07@HRRw8@₮F0G ()pwxAQC  r5;0Bأ@!p$:nq4z +_ѿAῃA`0P-F@p_@ @ǃ$B _3 JfG! ~ u#:^pWP1<\MP7_6 @o>f ~W=z H"C#VnHiO7thB\&#(;_YWwG0o?@a>!@U@kP3@.@jP;/t_xTzC( #_Ot_>M.ZC#~MXT rw UiMfB3VH h#4?& AEhf׿xC tz/ϣ+ }Q(~xYjSnϗEL]y? ^NSCa+~?v0!ӣ I[b[r&^lRx݉|( pѣ)vnc>`a[E Y<"#w00| ;Wln9./]@Z*W%w8i*1G (zTJ[X|tA[ GR'#uYܞ#lDwj٫0Ά2E`yLܺ7:ӈs mX'"_&^<~($l*RQL:lox @AN1|Oeœ9~]POmj*8#kVb{2S1Tˆ;>7~:0/[SMkI1ٜ&Fm piRb 2Wb#/dBeR%O>LR6؉']c:@PZ+]NMhvWE<ş&6O?wyҰgP5nraCƛMo3 !5ְ"XEchR?Ue?H߽gľ;`W ?$"U:A~؄QDDY}#LNk`ےis YݥY/Ek-/(DU⇧Ozb|]{O7CtZp,G4Xόh_ ܩj)CxORnqv{!..t TRw3[1O~pgUoja: bR͵=,)]X>p1x Byl2e8vaeKco~dʎOlef)o\_E s*, ~%ofHӉq~uuYOfg #oIt3Lbq|7,Eܝ˦ӏm!slM$`Mn5k,o@Dǘ{ uF_S<1 D2e>x?dWe׎OQX EMM>eȂߺ.\?閅`;#;`̭Rl|4]eY|#=EÒ3Io<{lJp I&wY \ow'ПwK=Lտ9$LCGݠ*M<8Hvʙ:0 \ʶUSce,y|M{6\dKSM{8{_8+{?w4D.t!t~xE@Xb3q8r2&[[}Ǔ\S<\޹` ԾѶ[6:#׏䦸'9ge(B;Zs*l Pκf ovU|U K\opkqfZxpuֆ;F ~Svs+UUXs EOf}' yLoSTq_/`%o V1Roñ!Y JG)- E=iMˈ)A0KhX ^K<,DĥY)˲R2ъ1_GhhH"Oak5qlLZBm''n.\(a1"+v me6 to☆I>X S0b i8WT8-VÁ4jWݢAef}æjn7/+Aivg|1T$WjU }wi18N!d(O5i@{6=3^$P4/U06ĢBCoVVFN߅# ܷ{gwfSz3>hkn}V^[H!<,rHly韍viضI̖~pՔMlL~/Wda S\dF^W n aQ2¤y@o-4ajk +БX?dchO3Q/_S|cs0(Rf@K ہJA+u S+9@~^86$"E{]u+f~Q( _p{=~0L¼fy~^ SdaĞ+}oW剝0p/,L\|3@s5&JmL5iU$7I`Qx]3\R8ƁD+<+A+c}Lt57[ )`⪠O|8]v2MKtb/npfdcq'j-(^갅1>se]spԹGstCraUDA@mO%jWj&#*יٙv5ؾ9M ,MhtWfAd/ضTǷ_0'uNJ`Q KoSǻ)pъ~0ӕrn yyC}fd| ~z@?|$/W&B˝;b4j?Dy{%R#[k.s?*7y^zjrڦ5[>e VpC鳴$ɹ,4ba_I?0.UŪ:PrZ_W耡d-1 6i GtrGx>-2m!=g gjZuOt-5l}oo~0{|}Ь&g۸$!xJt @Mq灤[G[]'ZrtE⟕Y}2$dN'1_ SdN]bN/!-b\ӄ:3x$3iuh LuzVkT{m>8֣A`|dqCWZ3&&nouҗRz<;Nui &e7q1Ox?jLiY+&eߖwCVs,#^WbzKOsPÁdkeudEMUocL!Yf}6?M3΋URswX3}K*:_$uI|c^"7}(W  $t}@t8^?Ͷ317HB,2ඡe'DBӽ/?9C6߶ UQ`&9<%5; XxyI+!kaO& |lqe `tޯ@+S#刜hc׳%mt`@.^9A(y䶆ꦔ\*e>Do O$bYBO\6ҹsؼ3c1u Us$vNs"&QvT*v~}VG.-#iQy>H;p8ɒV['}ɵ*ndŘc} {q'Ҋze"߻xԅz۰ؚV4nlp!?'``{8$_@mg:HP|TM-& ,bۃڶ*lL^bzk,sjh5$j,#B7{Fz~~^KE]艮oyLDcXE'Y?O~wp) Wve9dvVC( o~|5)ïyTCF)MZ KЫ %^!l ~0M*i'6S{gxYڼA5lC%Yv4¿Q16I jc],~3U-݄JnO{F 㡏 kc;򗶼zVjOb^Gb毕Hh#佬M3{,l ~dM Yy{`M/sQ'!ga[پ>I3l3v ;dp|d6d/7}ݴ^~Ы.=K;xh+^co=/|occF(֌sN!*"?hz_ZϼJ=פR7{)LjXSO6>sADZu[n6\9,W6CgNV{a<| XP4[v] oY 7xd@D/x. KqSֶf|ڴ2xMwrPc#s;$yb.=a}Ky~NǷ1"ѡAPpSkL?JMљ,O6 EͽKf%20k}w}:xGG Raqq~~"~gKf[QƊjL`HL*)P+xC/>ӽt_W՗`J[P{b oq똱 =NΤa4/ed=ɼFK{ys*~ب]"?~yPS'ߝCO_I{i0b}C;DI 7nAk^nm4x){V3/9rEN(3ڏE?|sAcg3+UӈGKB!MS`9~_@gKKVX$D8X0HG1%RG )Y灀3/)bL#m(]KltV凐xWӇJ9fZ"/!8 kDKeC.U ̅iv qЋm ”Ҧc\^Y+4Ĥ>tRYx9i" '6)Kvk3gVӥ&+iIFi+^Ûe'z[ ـW7't(mHXXؑ?J^4Un8j:/ݥUçJ)L%g7ȧyHb8$:J)rO=g. ?yՎ gfJ-h endstream endobj 450 0 obj << /Length1 2058 /Length2 16275 /Length3 0 /Length 17522 /Filter /FlateDecode >> stream xڌPҀ # aNpw, 圽UU0O{=3+ ZE@t \!e F3,))9,*ڊ_Bv@=лLXn(cmt02ٸٹL 19dV@{XR!k;Sc{\( (4,vzV= =@r& ==1/% dP?ZYnlbjBg ,L V.V@;{v4@h_4o#՟z֖6zV.V#S @NT YagaogjngzQ{go`gj7G?¼f+C!kKKM݅5vrZц PBow?2c &$PvdCރ #sz[045ƦVD3u|gx?F?z0Ck+ Ѵ,t ,MEM /faj7 tKf`?U߼"Vֆ,+@N߉@?@Oge zw0`X"v? /3E!F?{L@/g/qgc*CsT|j%w޳C K:k7 h/|_^D࿣L ˱j9B?Y8lV8 lA@C}  f-5kWa/|o_=: {tޛr7/|O0p{zߎ h0kmϬʯB׉vg2ڶ㞂sv@n:S[:{b(BMG#-q#{i]6 ]f+Cc~k)JLۋ1nR3hc:xPh,fx2JV Kѓ|уĞ!&"pӍDCCބN6)qvS$u7TKp EuȞxHHutg}MTmCbs]Yɋ:PyDaaD'ґܥ+&cSsiQ䕮' `B}"Li[<}¡,tV|@*9]HpH!O_}TsN8M3㇟Q*O 3gzՆBuĂga;*l h 򱲌=@MndߦnRu%`}ݗ'L^!\+Mߒ,RU*B=2mõ hKb݂:H*UuW;ސ6&" J"HW]P;[vY\V^04R#lKVvMNW% O>Tgؗ)mi")l\DDl5UB $n1h( $38TjaG^`L_UMBItkS@1ˋ~H҆6)-{ax|N@o#)ޜ˺p8e6>(8p,5) !e8] .Y=XEq^Q" Ið”S54quѝibty<N{>v,[OT"BN(),E'r`n/&@TE;O4arVΎRfBK<6 -8u s֒ne\T΋wXa&Ʉ֬s5'1x)GxCv7B_ۭaVY]ashd!].c\㤜==hz\?'Q#q.0I_Qs ʦf&S,G䳛 Qd5Dill:66V>%vL7`0WZ'=%UakGȧ/xM^V6Mma9Ѽ!L7qm,b91Pߛp a~? .F=<>p,h4A/X]f>/zc*^9JI;MS HV7b鐺U9TdFMܘmK)/;Fg] A~^kQٚ5X \VI^ȵuͅIM7Hgt6ץ]Qw"! 'ݔ܃22f2+G.>kj+m kjxjMhoX-rCQ6yB 4]:g/V*gYˤ /|Qؾ#thzjMWK_iuyp0ˌV(acD<1"h|pSEQ?k žufү{Z8bLMaRw 9O-N;-ܑ 'R0kqlXMUNZhv ={senNϲDFsbXc~z9"4 @?Q3A X?k*1i"h]pE90+aoLEą۸}w_,FU!.)MqPAn4 ·ayϩ&@׶ v~MHp趚#9BhN8>&3tFRAXrm,H_6zبk#/L5u#cVt3.>z8=s ǫp3MArlUalkDazwDo3#{W%;!lSc`ȩSh(o= #S }/RLFF >~;t?~ GF w ߃TMK 7%(غ)d1)6e ݗz5;9ﰕʸܨ϶ک)4"1!8AM B-55t-#n^9)#alX_F]Eu3嵞cږs*P vj=nMQ!/ tD r6ӆd,XD4w<O]0 |C=Gr3by8c-sjYH-/u1g4$f#Kk?>ynflN' Fo7NrRa?@HBs0'E`t8>DbA(Tp 4jncᨿ: 1^ߥ٢Cv>YPKF'rSڢh"~M6M/ |#v 1vGPP[Mѽ/?XpF=e?2Bjov`XZwBq+`iL?@1=Aïթp;ȵy*c8s r<ڀǵFoA\wF3 v,tE|AL;IMebyoJYvs2lc82,c^ cP:SF;@1y 7҄_xY<vq#/_U0`GKvcMMw ?$~za dnRZISg2x>0?3m\ #[6рz̅Y1%fISE-!7`J9솪WQVW+Y\ikd|֑e~P~ALD9oD)2OR9}ڲ9'-Ox" YHjNI&n]3eS`K}`a݉&J5Z$*=[1 g{AWzpxߏ*r0b|%}o{sPuPgKE6V4.x,#\=βɵRzLď" @NuDԪMDަ{U+-#q.*W(̼ ǒM~ay»] 黇b}oJZˎj+g;MH%a[RuE>{טpO()KfˤV/VtO)rKE4 VStߖXcq&:9_6cj?s#>V t,C7 9|lr!jٔ4"ʍ(_XnB㧚 auݓV/7-qG媖*D} ׾aXQY.VVox4RU~ZSKTȚ|/<:`JGTCVG PYe+.,4a;[ 7{Io\o5Bh|^˹s,Qkd#Vk6!Ra1C;DW{OvYy1ծ헣AŰ&lgfxaS|>U%r,כrw9կ{vS\}__?<*}ۃh|:9(Jf׬1X!u(A?}^A/մX-B@ uK2M| [l"fep:E`UX_OS;J @/sdzVD<̈MD-f,zAڨnMo VCS{ocX=qe}x? Y&X,;z!%2MFE2|X}[$sh})ʠlW ՘7UJ[ +"'הvyE)=#"sy GIi$ SCte?sNz[*ʫ7̿MY;"_7 %R茳`Fz0LJ%29|5n/95ӓKGkVsؠZk ᙐx"v]-pSIneiaJlo, 4Od^DCVEYatYS-X r _4dLp,ElӦ3n2t6l;c҃t4|3RySZc^pxuߞDSݶ]30m~r{bNXh؄,n֢o}5 `VmW{*o8ITl޳yMa! ?m,+~W}'6ɝ lI&eg8 b +5c)lOs4d'%q`Kw>c7(A /펎[ޜ8ԙTqV{ }ʘ|nֈ3zTbb92J|0`wթ%55Ae-C $C&I|yF0 2g%iT#E;jv[ʨg~Dl&UWlg6F*ՠ9+3Pd$[Z8sE9_wظr7H>}yFV~љw`ɴD1/(o(!M}xw!qS.x]w)v6 }l/NS!v#@|" 8!yW Y=0< nE'8/8͂$蟪)!ohJ.S$F^P-t6FHu R%,p^ O E `|3w񠤉/M7ES,G–SS~i5Lzlv />M"OgM'0_6J?sdT] 㴍]v@lD>הjnʤb BX,j107~^&!Xy)_mkn$swpAVb 'pgI-L[Y(*o!f6Mhqʼn~p/4Gl+;\D`(B,rS-ɡ=.\ttn1Uշ1kمieϝI]傜&p4e*>P'Róx*ܶ%eKw"}=G4TY!k`ĚJݟ@U7UlxFS͠.ς8vWF.Suvc> NX3,jGg 3 8 {_$ikλ3*Wc}RD<{BcԚ7{L6&R[ߤnBi8oZܶ^I_(*P BL`I5f #1vNJ7/CkxX< 蹿2-_#MPu弣WRQƬ[*IdpWTΛN''S_mK-Nb}pxhgG{f-b7e= 3t{}IWO3e]TzZY#>@v(6{h8JU5xIZom`C!sb縲LX w ӖU\4R٠{^ Da'/5ȁ#U~iҌTeO[ĶYD핱,Ww*Cp%2Yl.>d<]Lu|i!e,o5zc[xWLץ o._=@2xi(A}jQovތ}'H,-:FOh/&Ui auk}]S,H[:w~;u3aƕUL [攟dnu-w覛I?67|բ!YhkԤH5HM:2$St7bS C:?[.Pфz[ͤUR-GP;}pFw"j{@#BC 4NGL6`8n69* eN*IK[G{uVt$$B I9(K.D,EYl=D6qlϐSk^·g1) RAREv[A;x~\a1E l! h'.&W3 ɂ9qJʇΤCA-ʯS% Q`h8Kmo[MK+8v.遦|R15$PZ `8 ~;9eM]kcp9x =`ۊҘr8G?8zaC/K1^ O 8;82 e9eW򣚡SlۓlAQ1:/)ǖ{MnuXbٲ=&22qZfP4&SCnȨ ?A$srCf2<x^Yv<5ź~4WL&*NJ̶Oө 0֯\o(Dm&9.@>~M{!*( r\IUS(b5HFULfSk ?GxS/Ր5Pjh#b ]gfO i , B[;* .Vof n5]["g*YlEV 5Q&ի) qJr޸ڮ}apPWCK[~j JR egU""ˈ()ּۢoþy:(@+!QlkU T yj6 _,5B-EE;9Ėc5)1j#~ ?]}T!sHp&rؿ%8![9D[KvU-$ -37,BiJ B0Ƴx~SLNd耶W=L\M T(H26>*KO[1w3a\s!Yᥜ(~ SZD[@~), >#ƾhm  R8e\`1x)NHau݂L"t!`QOӚ&e+>r*!"P)P$O+2e{~9ul' ^4ſoS^GK>r8Ni3VRKWt4I殺s$|Κ*b\L-< hzj&5I+"-V|7: D5Bow+7tK<|L1o?Uq+&/ 焺>AVy6X6nNz!a^)܎FWrX"K!0p"_$tj1(_5V,# Y(,|dXlAoZaTGIu Ƚ ROHZ ?d+-& ?#lp$OgN*Vfٔlbnģ-VM_ƫtw3:vY7* :;Es >+7uO"m]$$jh/&\$jp`jI(41Lo:~cd_@L `ǮJDYrvSE*=/ AJeN/ĝ;c%7qCb/ݚhsJ V;ɱхE%"ѲzfIaWZ4)qM࿮Qe‰ϭ罞[`RRv'gQZ+vn miD0N<⇦EuWڬ&-hoG mtxOdB;|Z0{~=u"Ưn'F\Eא bjDN-twy6 ~Gcp9(Ou6g-O\CDGo麘hm- I8 4P`! &y_&* . iP6 2R*sS('lFIHml)Qiv hAmE}0ҥܥG-f ǸbP_ tbo$1U"#8FSmY'VXQBJ#F_i/]e0.1`ɮqר9#`*Բ4͕4ч[ &*ǗcFo`;i{=8uTX}ιjHqxX1-LL_Nmb~&=-,`;E :&=lz+rq2=#uϭ,#Q~Ls5X)NکdК&sD-+ ~dq=Mxo|L??oθLb|BVEB"F'EM!fJ'>L&Z}h֔V$'}< % DUsdxzVD_TJuO}ۣn *ZSMAPfRLXl4qcJL~ΉL\%~ $yA>wJb?#?\Z^XHEWj GxOGyxsKVDWG: iCj ãpn;4IhE:. jVJIf40&9RD5p5|Qf7 AseÃk׷HE\Z>-=S漁#v8|yyq V,,<\["v?HMr,ڮ[D ~<'r&ZD:PX}9JV`8ֽETmI>)G ا>Ԩh '& 0pU"z,)!x)H_9TkĪN=?(: )ԙ mJ-EcG=ٴ7 .#DI y*;Xj$1KWCˇOkiP]u@s$ قw{82ZŇRG&ԲЦm2``a -s)E9j io?Oʖ RuiģjZv{;%@p@H-] 0i.;d=Ȯl&P&YӸVh,jvj S9%u>8]M)x8ٹf#-Jkg{t-f銜FH] ,IrEy,H{!^ DR?xc;ԍn\#sq.wѲ"J-Q8%]`tpVcY&-`a2tA8UJ#vmToP>՛f*=0U{3fm (֢~E ¢S~fY/hvv{QbNH2H,Ҿ<OB.ѵ΁m)Bn yjRD&xw1̑=0p\xF"?dMRnH.Џ%uN)KA/lkZOfrSمLe*kc\^ᵟ *@BI,kyԇȜwi6JWZ J6;zCI+E".y>r+KA\ވm7NO=0K NyDt{3ttq=JΟij.Ci#g62kj̠ۜ@EͦnA0{#Cc-tHʉ>|קש $9lӼNu& 5 g*G6ya='N4q! ڴ'UŲ,4i<C-L?sb||1vɔm'+cUXdWfW)7Xh/QdS7mW$ﲣgMgz"Fo:h]LKץ겮5V;d7\>+qx9ajv(j ..pФ~{3ح`?QG]܊F4&#"Hv7`DD&_+SQNoWA ?D]n b/Oo•4^tR9*v n"9ͪ.C3?#yǔ>ɖ/ZIgf'Bxv 遭u L&9pgUt I0 NHn2A)*\ElhchEei9:"엑b["~VZ+.p=6$S'?ʊFvyѳXWIDkeZ1P_MpvqD{&lVgzQ>t8s tnMsWaZ|c3OWi5Զ1(˚C>Z؅7M"tn4rBZsӮΏ>a])s <}j n KU,Q * nIwHJs"z2 5ЯΖh+Oҥ$$i3+2<ɎBs#}(6MHzvcIS5DJU/QF5r"d_ v]Ѕ'͡ '-'%#LS&XSCLc4%h K ekVb[B[u\HFoFR"h8?>Ks/7סt (Vx1cKH_wtݰصs1._3"VҋڼM}5 -ǩs=u Ģ\dނ<M*tҘ%J@1lzl8>ݬ> stream xڌP www N% .sO꽢 fպ@M,f2JݘYJl66N66$jjM7{H@W4$\n`XQ wsyyllU$M=l,J,y#ZbceG9=/sdf t34@6@7qA'd$brgxڸYԁ@weSߩ Q4m\st4u{s+4*N@(+G wq,#ǿMAN6VK{ @EZˍ `h[7075+)@ZL ` \]l\Y\m R +$m\{\;G4,ܝXm݁rEHdV@77' z[&vu[  zn.@/BbgXؘ̀V6H@`p]llc!x,@j1,)s(.2s989ܜ~zQ5;Y9Z \ -@g߱qLo/c#v? ?6k J &8_UW haOL heO!m\m6nZ r}x+x$:wA`b$nn/;x-^ 16X\~*[ `?xAlV?*qXe NSx]+A`v]A`v?̮qX5 p,Z]A`v?]ۙ8vN }WNi{ ?r.bٸ)48HS? 4s15-%[5 87d-qpd'8 ˿4]xYCLX1`i/AX>Oav:K,Gj/nݿ 8"W:9߻kn`jGwտB?A}eN1 l;Oo=+xTyـ4 \X'{?qrZa ]mWiq N`3[pbƜ< _.'_`Ws˿7_翖_/ϟ|..jswpszK__@/9"\0̶!}'9}Lzf.G44ܐM[>])ϾM)jO~g;JNHI5E! T=x5T~XW;Q@U9.|,o΍ }V+|#Y;H%Z^EהM5™( Q++"~=1Nv&BSC}>΁퀞O%*:%}..Xf)5unp՟mzvd4}C\SMVLY )U`I @5%<'Z 2#~Z3?Y=TaK6c[d9–F5o{r&jLb9HkmZ]b;{Tlz(Lq>;ai#ut漴2g0x\8(v+ϻC".ֲ‚6nѪw>L}NfI[Y.Jyv WޝpGIu±ӵhsɎ~3Ȭ@027׻Abǵؔ K3n'!+r2:Zߏ chU/Z>׫Fɞ; \|G9Lhoƅ~Y+mZbMtftvp zn0cҨs06MCwU(z^|?H}u3a̘"֠P֘2NXj!'ӳɑX;'-D1A:_u| > SB$NEįbipi~3M'YRq{ߵsa Tb0TW#Y/Ta+YJ%|%[1ƣC n):m`iSccmٍqeiJ~I8s 꿺 vjKU,n'q oLly'hZ/U^{YʘIb| 1 ◊+)4["XYb?L4K4la6Z֙qD |m+Nc2t${\a` |ʫLew8FUt.^XotMԊ`Ծ4Jq_ xAh~-Q@}b3CaI4xǚeVM0+Z'u"XN}ȫNq˽=WZP|AS )>E_#DR ) |,yM C)o6$md->I(NcpE?aBL\Pw>]*f2)HҒ$Fx[N)abIW+kz>q\VqS  K7V%Xh]6H.M**V`Mv}^g/\MÏLEjGvWRMctcl,)u7-bC R5ijS~Iu!͔J9,|k&^059koTw(HpQu^亓p8"[ۘxnoDgҬb4> p5}ƣ -c8B30>%f6^M&.߰h\zIPNVۍ1Q5N4,`o .MKj~|%XN4DW2մ̱2˗M@`@^K7 A]]y#X-ltŴkyz.n@nb۝ETz$ZvK_yw RJOj,鬇⍼";RӰ6@YZ//s.M]uBV3k_Z Fs/Ⱥn<\җiؠoR5u'_ sej4R?E.#m*?D?D@ A{9\vSpB!iZad},4͜ *͙*(-3ftKe/[DݬkT_TUʠ61CcI}߂^9 v$#g@94 &gqC[h֣@Fw˛b+Z9Delgʫ,zs -EbXC3.;yhdS%\`y]~$UA2_g/HpV"*UȆÍ?G'{\N8u,N(g$3?dc^B31,REy'V Z(. H+>89H2LiJ&2'e"k?ҳ_y)GC@~M5/Gy )iL U~V2IAm/~OEҍ0* m1"R}rib.o$c?.;WkApl[Z5#wySܝ9;]v!yA̸veբ<|sB/Q+W\ &Cfw"Uڴu^d(} xCEJ7ѵ?f)]]s&5$jz<? Q0Ss+n(ab1 -]@GZŒ翠ɒK 05`~ŜSwMZ"BJ]=L5#\JɎ[GRQ:kYy.'4y`Qi3_=,[#KqImU" K\̯:߽*!MqśHG .pf!n-YTӕEgCtyl?UKē[uH%FsbTO4OL;B&{:5>qO1F 00I&Gdn4$ 9fb|N(4Ô|Vk 'TCEgjL;hV4i/y aZŘi,cb~&jW[AviI[:#@6ɣ"̌aSѡG/927=kRc] 3,߼$0R{ ~Iuffy z*xټ &MZ؞o^Ĩ}(FC)9sdsNl8_"u2ʊ t(?eJ{(Whzi7Vt)9D*hB B*n28|u+#tI`J`DO1Dqʫ\ LV0A@jj%3IIRA_%%V(KuHI*P|j-"+n³q*xrs]K?p9xD<E^RKg+7vxV\^-6Cq7)$\@Z4rQ=ꩃ CF#:i*YqAAX:9x̝tbsW&b&ڛ=n #}F+M\tHoJ>-&[NQR^ E6Ōa&s.hK^ŖȮ>8ӤqbΞI\ϟAZ6ĨqPxրF>LWDb%j{B~6ґg}O!Ӷ] ]@Sk*r??vt=R&Ti&a.jPY~&(q,=b5]T^G][~%H9⺢"o[16Ģe; 4=%? 䘿Qe_stÜܣGHN.]16}bNO|} H@2UVuh}Nv{qp臀Ǖ}oz#QF(5>o{9iL|¸ԮQU]Yh_5k@4l@6drB%jkyɹ^/E,^_sfTp:3q=_s|yK}gX?i+^X6ícuήqS|Oӷ;De <=>GOG.걙sa?CD=rWYnڱ^Bq>>8ߗ>-*y yZ.ǩ6 WO=pFBSY-/ef6-:vBWY+38? 9;UQug4Hߔ@dE16mpU]x *;}>xo/$sT[X^"13.xW]ʶprS]Nz)+'qiybR]^f*ew !K|cBD۷?_Lާ;O4XY Xu՚@xxЈe:JoQqY0U/-bhË8pـV;@o5 e;AXZӻB_n@U<}͂Jڒ9Mi;R;s|i2m T=^ WFj}J'^YH"g P]+2"?`|JgƘM%Iˎx;7ҿcjbHpQ-#`.41P(dq!gv.UBzQV^XH[r48C7iq͓֮BfoV_1XBZ 4;`uhBɎW[ jI!~(h]._jpkG\ik ^9tT>]bzpLy 2-cU^?e+9tJۈ͡ސ]T`\d85)/lC,1*|*SQ])@^1Pl~1f#⎙WNkVnͽ܊WuV7)ĻC*ؐfPnco#m^J`bѬ&Dϰ ('xU)/ljb45h$>UH!bF;/u$6C+a/#py3Y/RY8-~#G_@?s.DG/aq;Le,w mr@pe0ۉoC>)jˏPbAAG~~G\*MB\?b ~k{eqW8Bi9WWVa8{uO1߾nRZ[dEc֞!׵tF*7xH'6i؉ h RޕFMzү5%=q"f_]eBw_H0zQhsz{A}0ivmV68.ے (v3Jy,' Z&d8zd.1U*] ^n7w[fjyQ_F ?%Ԩ67ҕZѼ/Kj7okɹ\߸.b;G[\Y18A(c)v&3bP#̨ ^r饒ـ_Ĩf DW5JEiL^pRbx<v^r ڥ.gFKt ~mf_%˻ʏx+ 6?]v=?nm щ#0/d1$(cm4)IW*$V@q hM5x%OhJ2>UJW6NWUt>XnelP I D_JD=jpqyU?=#" 8 Z>cy] >)78;F,t+{ܚmӵNj $R)ƳNߑ4Y>^CXӗ5F C)0FfxJ!69Bn,A' ԑީCwKZCD\ړ,% Ž=x=w{5B3xlܧM"V^Ţ9T{`|i<ixhNn%C)釖dj?[vQhj;9SnjL*ݠqAmݽXvc 1p33q?;E`ͬ^OX8_Zi6fU͡%ml#/4 +ej2 $[Ч) 3;lƱ|CGhV ;N)pz 8cz/;^("SړǹE_ -+jMaRfK&pa#R +v:f}p qoAvju zGjmw PCy W];ϯ^IޙL7f{B2 ʔt]J3Wjz%Nq< wqcr2n? +qKX_kf|&xl.OUG #h ֹHm>Ny7v{t"C;w\Ws2m85Oj𧥊v wJ[dq1]% fә$xpۖfv& HyZpWfs/\@ĩdH^ ?(q e{nG9eTH} G*r/W_dP;M٣3շ8:g#>1),h"q0i3 KvT a+jx_i+JwXDii"'Rpfi:`hٟУ1&=ӥ}jO|%z]#W~~ꑒsىB8YzW^[_^Ӈ{p ?޶ C/+ˇdv. 6As$5Qr?g*BFi1Nw s':%&UY1(;svK~Ȣ$+"uyIv9:[+5u?%R}ӰHw[0%>TI:fI#7kPΨ|:}&.}/KzZ}_^{3$Tǥ8|k;-'\OZA[m4.,JN>`f8Zi6Ҝsi0޺dA.)>$1qFh%8.6>f/%ڳ |DN/ QW&k UV7x1ygE7/}V⏞kIAɦRE)CuVvnΟ[A^~VA 2NGfGI!0y|X}^蝷ͥkĻk|'g2IЮ-mIQ wӦ* FEld[1-d:AӁ'uਚ*jWGI6!bEN/EI0-v|^R667qAQЏ{5;"V5 ENHu6^O&HJ!ާDf,9kjFbyyMp8WtI^D%7JBdס>6~%gLDjLgAk:Q:yHFRB]Ǘ Yt7.e$Z]fKEGɡ&r(;6!p%|:56 ]8Hy_lz0'2h4L|V5<*O>l23KZi6w&CUrVC]eQ*;=;N٤I7ozu6?ţ{yŒNjpednKfҽ_Q̖*d0{11RuRH~X։6ϋTbռ2B#ߺŒ`s=c]zaШqJYkSWG &=g-ykaQX"]&gw'J~՟c~F |L.#$TB&(0韶MDTiG( NKFCDU.rQGoX^$)Y h#HSpt(=; K̟ܫю¦<TT(аrv/6N4#D Dn̐URL|,M*IZzp,1Oz :r$u .Lj*# BOT¬ST -e6~oz S5k/k (Mi>/@$|E,BCN[i\t9ؕBYj mNU  ѩr~IVP_8|”$g\jv&,y +[l}Vªq5젪j¢Z+Alϒ0oq ~mwx;o;9=sM>s 1&OVD4)F4ZYl+=~Z;">3AA;ܷCPO~tWPe&kmh[M;^8㙙a 4B(djh{Tpbd~VSᦻ洑 -D0k_ƨLGNYʄKB{CU}lyJ+مW ?Es1 l>'7-F* )1Ef>;ڮS9K^;NVT+FY{PY 54u?|3< eNu Ik4Ftۏa 0*!6RC ,,;odF^nqbc"[Ub3"^?D,u ħ-/g/Y{<9 aj0K,y|[Ro2osI5Eh"E5u`a}bMjᎸ &9zX1-†A[e?1R`̥Bq05HŽ116XY"/4 ]l 6po_n;}1Qv DCu"Qjz:F;qHQ빑TzǵFn~|WPlUwwOzefv[隫oLVL4O֡^wV1LG{TkAzKc`dLfn.D7XsdKuGj?}oB?d %89!8,'yðLJ(]@ڪ8t94WY|~ 7(U6Pbl-jS!vOIT GPc17D6%!.Բx _і*EPPİխ@8-W@?ogqs"8{{iEXO@ PIRS`!֤\\/,1U3*$NC&@׉PtW[qBAU3Ml3tT1l.ĞF?=Bs$o֌u 5+GoTkqL垖)ݹ!$f#Lxwʮl ̬j_ԉy>6P+KG!,9|,¢uU**.uۋs>h0͆Jl&+!'kMQL^>͕5 匎8d4:%^V8ssyfE?6vhL 豕_˗#꤆FDiɔQ`pnq)ꅻ='~s޽B]&8@ )oY0Dxd ]*R`_U/:jrnp -bhQs[Gκſ0a"M{ZUGL#dlgK(qٯ&UH_)-pwQ@~كN[] ePJcgS^oz]IN)APc?$Z7Qnu*Cx>^#KqXISQJ@;I#\֝1@GNS>o9b5E4.BnDOY@\ni SSD05d4;R #T9p9 b^ekMFw$ %WP\L'G%tN0edw_k Z% ;NQT2j婞ZB-lYT]crC-#U*1/KGq{3t l$4Sy4Вu=M.\O ,!9KQ9[hneS []H2XLq1>\9xb7`w FM Wv|\ޢnV 00$ƵuZpSv&xH~lQ";!8*nW49XjNy*18maIٌ$iZayT[ M&!G<VkRb+Zk֧K 7ÒgpdwM8dM$2U<:&O2yMc3W,3Y0պ%\^YDsۊ1!ӔO G]=W@!!&<^A9g$IgB A70AۻgZc_ޙ(P.ΣsδsR._㖣Hĥ:?B8DaFNdoA2\v)`ˉ2*[z#DKgw "g=.D[FP.Y!;663Nͮ ;tTTus]=hjz뻡0(%G䶡SUˣs q+|#Z:qh4㚃J zb?by1m)Gf!QB!N9;4t O< *ddAb'װg!9.j㰈-mU Gvy="|cHB @w!VDQ :f' sa¯lv]p93FaBϏ^+r.bMD:k8Is#Qc=Pg uewI9xȍ~0#vVC4woS>ns MoMāwGA׫>* 4Hƌ$SJ>}kkFt'9,f8|OA{ZJˊ f2¸&?XC>`<3PSbHSb^1>WR^bltai:/ &8/CA|u"_eQ5JV@J^ō[mzrUd^Q¬#73>Y,Y(oi> stream xڍT 8mԫT2*?jYfƾgX3a2fƞRE"KR"5*Kd+;I!Ϲy9},Oq )d,Jڢ$RA`D: eTBV_УX:ۦ2`MP JYDH/"c}x\0AG]s~8)"=@*%X>%6F{# CAP]dX4⁕ ֚غi?6@"@2MƃT}:`c,=AO2'AXCn-z%(X $4}2_!bI4 ;%.ljX};\돆=49#b% {d$iTǞbr9"xJxoO q&o+HHz/ r'D=xR< 0H?To0(`OA<G\@W";; ~bS1$[~(q27}k-ե(@V^APWՔ?XakU G @g)*gMeAaeTB_Y!WW"CoiI?~`֛s {ڃ?=5cٻ&$fHVD:mU?v+{F"A+ ($_>rٯ-Uޝ?O4 (%WRT*d+I^I @@ȑ)tv. P+US*Z_Q\aT (v*:Ȏ\udAeA_U*w7~V/ڀ/tuPpSy\Cv"oMB>i.L)܊DW}^9"wA.UP/jַ[YEѓ dbiV)AFsYn_x$ Gr<ͳ[UUa+ PVnr6r^ 5/>Ծɐ$4N֎R6; h T^.e1.iɢ4oKqZ<7`ܔy_д Kr`t7e?@/t ^(k*X5q6~GNICń侗^PL~%1vh$㩹#Ͻ-S'(~{'g&WֿO^쁷~$|0.q`օ0M _&vzSY2ΝрxHkZϚL'g_ <1AWtADZ28"5kt)y| ѽ=TSL"6K1/rny2_[']1) 0TN:'8WoT<֓[(\ս?uл:f6}ГhN}-%aLo;Eoto(>ˑ$ÜO9o=ϫ@@b#c8{^<9f wㅮ[4`U@R2&by&hict0hEGCUg[_P/on5hh*~w#vhaqSnT௓˭.K'n;sS;Xf{݈r\Fy&w|[b UhMxT Kcu˻\1>( )䟯,J ɣ4Ȥ?;2x9mVKu8vlڰ̛CRM7L|>^Q5:n1 *QoxyVoɴ{U.)T񻟣j._bL+ sHԤ=drŏ>R9f ?t( nvH鮝wݝ&-GpɈQW4AY<]tˋMFnvJ[FvbXki v))?7fLƾhF؞*0>܌bl E==8AE:vYm1+Sqmx z1i Rp;pKΠniq 0\Ku{;,bȝc|Er!&=~"yzBbM-*k_(Cud#ogmZ%IŷjzWU F,3~!a= 6u ]~$wT|3ߌ)x0v]-h0BrnA{=̤0jR1i橦zu2^@M*o >!מ1TY2"p!+$wNT-pW~ _zR?'>WP9JLh?<,%[&*'YoԴ.sRيitALpyѬ$"EeЏꮥLF#<6zF6.M٥rj#Gu "*zqSmŅGڌ aANVj|R3R <[˻fYqVlQڬg~6}ZN55nV<+l%hE_f!Hm¡TEۜgTu؊<UW=IIM'OEesmɱNG=[_WIm x% 0{ɷerSmɽ-z.;p!:-b8YI9Po:-b8I'QyFp'p6k{|r{\.MڢCWU2~|$wJW>iMʢJf%AGFsAW60nokhqOD*QVg-3naVqӧ3p&t=v|_NQ*_^5/O Y2Qs.m}>UBν+yv< ~W4pƨe'UT a&Ԙ boaZQ wk skZN>'SnleqHl 3vIV)h zy;Xw ’I/t>RWR|-WrWbd}2ىS*UjP+!ʇ 3^w˺7:5O4cz'NMLn1xd,I'jGg<jLŚe_@fB.?8j` RĄHہ-1Ke6UfsGhjz5L]@1rxQ`愠t?fXߡпzUikz=y3;wae endstream endobj 456 0 obj << /Length1 2299 /Length2 14304 /Length3 0 /Length 15653 /Filter /FlateDecode >> stream xڍP۲&'ww'K5Xp <%g'WuoQ|=GɉUMA@ 3=3@TNUONjlW Ott 4r~9Ɂ2.6fV33'A<1#WKS@dt'{8Z[8T&fnnN¶@GK#;- @db t/T|]q[UD'gxviAB/֐2y.\Ȋnek㡋JfcԢuJ?g/s'AtGCϝE$O sZ䥽QԃKCy>>C%r"UZſDlכ)bXDB/D{]l<Y z5sMFbodoyR5>WK: d„^;J kתmpvHlc^+BܨJKKG22/*`  fMVN9B-v?t>oLJ24E9l |" q$qgHI[QSv9"4.bTFԒB#wDl\|HYxMs09w:cE$Qsd`3s i3?`G\bK,NeX!Ϯx#gULsRoyw&^U kĤl˜+ƑPgv6#dO?G侴.o*||~ñTxPs~lY_SzkzTh d'=4Gi:IEx%L{VyBL.id$M|:]򫸋WChXhl4o #F- j{1znljC.jfeObݼ4 &Su6Eı #דV=;)?/(iN 1ϓr`XX26mbj dy+QdVIdGQqzBMBx RfgR1ݞN"٨ؼϦ#{0V~[Ø#t;B4+C׾kƶ6 l¢-$a'L(OT8K߽Z:(B 0 irApf99$y,vN F{~_o6%CD#11ӆ?P=Al\voDB[r=Rc~Wkq|.<@_=,2E|[1$];>bXH|*m;K,NٛW9SC 7巚5- ]NDI t:③\{ ܔln9]F-MQzVT(/}\Pz__1&q/NExkx 재׌C (?|%.%Oْ*ٟ?gKEٍG )h~̕e$lp2d5^Nu 79Cq \,ťŕzI^;_$u8Voi{r/#K4^A%BhO#v^U{vc!0=\BeZw -TxU+TDZ한4L΢nF$z:f6 pۇ1ƱXܶUc(ʿkPHU:9[|.5 f-W5L C?}ٲ#@ݔlp9A6`R +KLM Aw’1D=UيbI|bO b-zb}U}DP_{o{?V.nH+J`B=9(V5P/Khsn;z4/!,xp2[_8%r+uGMl@:MPnߚ='_ ~@UZ}9A5gD5ɲ̾yZ&3=W NP7ꥇr;|C2 $)>/%\[l6G=2֜% 5ă8;D*4uH7EY^?!s4h Op I"Qut5ی- R*[eb ozVCABx˘!~I+o8O٧J06Θ[/܏lNRB* J '2[m1`+>ֶܕ悉^K;f9oRE~5`kTƐ|U69<(K%27c!c1a|zJː..58#HV=U~0BbOrI9>+O *{ \uB Q$qY*Bp<:AB"Qi,[̑MD/6cC@v)/p^K4kgT#W9$qYPI;y oT%M2pE Msɮ- ѯR8hbk񛡕G4\2H >}!$;\HZԷտ]{~aiKK^62⽗߸V[1L:i\ĦV2/4~|v=exYa46%~lqSvlϱ:>A޶2#m9Gȸmus%xϽ\E i\@i/p cgmT_O?OH'A:LPU8Wu+l*mߴ&"Vf}6ԀZa[uO$P#ߞR7*T:}X{ӿd@j|#(׌Q:ѭ>VwQjGHf_VFMc90~mkRPJ6PT/q9~1.ƿWg#بxv>j%6ᣰGJUeqᄒT4]1B.7X"\N|bi<ɥ>q\q.>F{Z-'&ğSV]:I\Dpdj0ncm3 Y(@l%Dr^=ܥjս?pԭ![1[#lS +VJk[m퓻C[clK'ZKg p(Y)^) nC.?ډl8)kC˯TT8/?FSXCJԕLb^@[xٽ J-:qF/}qFz:Yx輫ԛmRhgT=k@ I]~Qj_T v!·=l<]jF4gsR]^.WD50N6[wM? B~rG76lg˝O d`|w;ؕ.~$;i7M]m)r7 vC݃+#?mIi[[z= ƿ1m;5*YRN %>C0FmCvU -/'M2ml6h>h>ݟYr/Gh-/1hlk3a>E6~V5ibi3p`D䡩 X ̳&f) GS$ܦTPF7:ҷ&Bh0Xu4w] fP$b"ApROPFJܞ-z,Ic!tZ}mqj'J365ȩZƼuRSe$uQCΘfk$W :O[0Tp'i7l?FQin$an¹"Efg/ς @E-_7w`?ICk{,L!Pay'N#u9%e4%_!]"L(LD/}4g5עxgUxZC:F ipgv` H͌1Dz2YЉVI]-b -RAX>>Ng]!zF tO*_y?d^"ɕ`UO_Q_4G.8M8mAgiP J%}$_]*MӴGєӑ?xc@g!fXNFd3]9aLiOc}\`䐓lYU!b?ex;9&nvfZstMNXeoW?x\W?/_&߉ORyQ49iҹ4vL ]pfִa1.|4K ~(znRӰ.U3Ru} KHeoLu8]$4#JYd2i&z I~}`~Ѣnd`H~KY.eFfɾ$U$ִޭpA$c~ $3w^UQ )g{ݳ*^j5WČi*OlaHЯO>ԘRwxIaLin+v{a)QgLOkL ]J5 @O@q)\„6nfci "?Mb.m^@G%́dK>9+&~Gw〘/m{oC{IP=]1QQ/͝RB5ƒ*6phPA o׳Zg@ j UvKKd7I7.|MJ:琛ś~]r@lS3zoS%Mzkcמ ȣQr"+{ܜȇI ިfDR..UTYx9!.*I#NO<,LS::;8KsJ#P]]rxy!+S̜&zO#8ƺN ҜDF3^N8hXlH7m&Fuwόg+ 0#ofP듕j|_{T[9wɀ%N_H*[ѥlRoWHHͨ84EWۛu+PȇPb-jO!{ qڌWF"8P+ ۱"ӕ+}]EogJ{>~[AJeΡ+CnB1d}zx󫞇uǁW|b`qPWC}mL/k]*]TaG!S=n7JrΓKʕ T$ҭzuu}tѩ}/0D*'k RR;6=2bXJ:p}!80AP?P;3//_mZN&LpS]N߁q5%3 x,*S56&Ηz J'~Wk3~=*N"v纪u v*^jhh'˞-.Ýv,PdpITGad5/j?җv _,%VVYlm.g! QmævZnMo?dq~){Y--O&Th0QmHБpI݄QV{M:]*]pkd\. UY3;xy}3Zp)eJ Nn&Rόnx b&V#z#S馡e6F^'6n! _9+[Ϳ416mf,]6HRs(_cerRUfɹ6d'ْ5]8X;=Pkha+$N9@.\ܦ80M,^j/2m=amyJ-ї,][ GVJQ&>n9»lYZ+>@b ]U{Qud{{> ҩHs:nTG]˩$w r5^S&\ԙ}EA_~^;\C0~'ɐim;y4`6M_=2jj:Xu ^%|sc%s{ОFYFY?w1%ǥ^1}`RUVʺ'mRD[L ˔X *JjI}PΈȑӖժUQ#l= f; nU6}hFRHYa|dX=qvlk¾|;m}Z\NqGćBO(k]1^JLㄕ;P B\ROi]#E#SHm$yMIf 8ގ&n ; X_o汤"[pD |qyG ,3V|Ⲥ c>&rxaI['Ȋw݄5JEAu&&XS{wLeagMP%z6GDdhyp朑Z0IpwD=ԶZ~vRkX,nc^ rv4%t5yH([p=$qSjL|}08,PC…p$e3Ckf 2OTwڍA\I%l 3ebNO#- uFBNy4ZgΐpiI/9GKƵ\Z 2XӇkU);8M& +.ӹ\ơgNq!˱[+ȤۅMTr&$P#at^~)P3'knᦾ.(٩/ȳ:9/|.ԧ(:(E3Dz2ul7@?ocuǘK' Ͼ.J&& , S F5krbO)C*'jBW5%xhiNCuM)-;8"\8-2tD+RHdp}!}x=wq^B2j?Cn`qj =e4C1{Wvcvj/+0..x+'emï%˾>q srBc}aC _ᐰݓ)}>sq/rj`ab@mg7t#wJwlnx2pr+r8jvkg/4S>h8m+DC+\LiggR 3"}L*4T.*{J<6*MLn,գTLGp:,"x3~lPsRq{Pz|AX'.ͭWQhscw`DFC^:v}yԔaOPj%-e6Ӭ pE۸J0hPe˄gmmꟉܣ{w\'tұ1'ŀW ,xx zPd$.Gd1v^:p5f#ؽCo/d&>g$betKhZuQZZ(Ϟ٘wh~W<[7xrqՠUsRD-c:嘦6uXq BfdujOnlrd["7X-Z|CYܻPc't|% k|ីMۑb' y(3|8Dx||xGi}*S69 mo>yح@3֘,jB7| dG/2KȖsvإSO#B3řB;G6"GuԨ]-";!?E2UosxGcRG4w*y*`{8<~ViƝd?)orr'UL6&t 8,U$;M4%Wbps;=^fH2_ m94eұl i{8|In7IOz% *Cݑj˰uMV ԯgd /05hTTERCE.B+at8z.>3ʭZքE&`2;@ܷQރP3V ~DvDjT̒'ݴ.CXj/#6s1 '}Mܚ2jP;Ǿ<"lFaJE_T%O73 [BB"e+N*?# 4h1& rWF@WzEW_t<׺e -"םQFS׸ĔNgJ9ɥC(^0ҝ$|[Fx/4I /-Z|M/7H%(UX@WGةFjsG5B!so^lңLm`nLN擎HW!w3d&<2U :)]'4KRUm@Wq?\vJ P>yʫ[ #@vʽ0Dmcsya%a T'ױ D̪n.䈝NCpl ~foB8q6 G@%0Z]+e0);H'C(y t2)I.H6:oA0 xqM{)u5iE\u5@Q呙ASH3Ec"N8rkg>#2%` GdkyEvXvnp `12pd*N:fbaD /k9 e G F ~SdR{iB/aclɻF|wJu&)rtF'̬"#b,qrǮ۾L8:Ʉr 6GTx2e"3%gCqVF >Ŝeo\Mi깒>w>]A YMnAQF: S <+cA0n8sZC+#x.(d{lLگ[HC2^Mu`J endstream endobj 395 0 obj << /Type /ObjStm /N 100 /First 919 /Length 3690 /Filter /FlateDecode >> stream x[[Sܸ~_PTJ%%d'8 ;cr_%ٖ=*FֵVwa$#"<,a<#2Sd OAs+|j­!B0x:"I,gHL)> "R&Rfcfp GH3薜. p{$= *j=Q{q:d.Q(eVQJF)%hE["yy 15{# ̨TX!r%NN q ӠJ28cce@+ 5fLp6Ҩ.l0h̀Xꙅ&2 *e~*Y+Z L,!_&@`^Do!k30aZ k@3_h#Bl$3qYH!q@[XMB Gqk[(@|"&xFjlVAh{U'cPB 0.  yPPâoH25x_=z `UPxHD$p2oH4nDŽ}AlM.f󢼼*E^b<>zrx]8O/5?/~X?u>c>?-G`z e=)oU7i{ٷ)V*q r4+?+#a3O.AH,&O3Rzg^Op餘]חQ*㱥KvfӳS~==ϿK?13>9Vm*x*0FX7U,neiL kl# ƹjc݁x(Ô43I(#t)P^"'n@Zhڏi$~zv՜h¡N.Pe <_ yK{-%of^߆6*uV33c0 UH \ 'JM<$֨ VUY-!%8`8T@K.1ܘdTI{чfR^cμ3^8`yMiCsEJjX9pa/ޜH"S5J*S?M+K`/{v(JqV\8CTFLp`nz}yh6tOXƗp Pɼn(E-+Q0O SZct}~m.߈qG{E5vk M-U4 ᘏҞwt4D7G??s~~; |I 69`ȏ![921׵tVH@Ml-K!~'nYq[*j*tXGuwkq0nBEoʲ1fmH(Եaw)#@MKlYg+9 '`8ۡy1%oڨM͠ V}@źx0^VK?yjԶ+j#HI/a3\֮;,COƥBVظKXPٳ=q;/ټ.go``p;,bAd=Nx Zx} ` CZ0sg|*/..i"{pu9g[ӋINq_}ם#).q^'tL'nk$$#GϟIޠ0F _ HҸlmC__.}I_ ݣo>=􈾧~@SzFiN/WWhn^חO:WtJgt65u3+h." wZr67+F-ele|x({*H{Ő2YDۂ hKבɧ GH$HtۓW^"/w@qiZu} _es2C\j>{ Oxt>>3/'>gl l2!Hx<4:/.i> nƓ>|!dEUǑiadzsu $#򵀧 2!̜NVӟƢ"D&7;ֲy~h-+_/ˀWƲ2c0- (-i@݃Ҭ\+hy~j]P18^i SFEO@yq˻^ ''1 |Yl@phYksJ (!.Vຕ), $RImu 㕶Q0Fզͻꌲ/[zwmCPq: z wl垟@ MyG"x':U|D͝xK؉J2 !A*lu!D(qg+!WEYL&q@Nq\:T9Kr]1pX`|WΒ^'7zߗ]s9>tEu~ XʊM(_[Gsl޹i7^阎~ǰvݚ5~N~';w0ʻ-[8@I7ob'hg{qdPkG!E[%83oDZ_Z ~8 [NN`].sswj}db}접V[hx hW.%jdgvEdL]DŤgx1DA>W.7h;Ւ |]W|}<4Gb,:Qxc&c],W7U'\;PсKc XXبf\!~viV6DK>\vlhVWq5ZZFUU%V.}:}3W|puUѫW!Jݯڵ$Dt4f.WyTm1&qO+&ˤ9t Ѳ*T,e2:ZRuXMdZ9HuRGq1xӈ>pO+n S C-T L 1turXQġ]VLnp bnblaQp]nHǖN1 F:1apDd6ll]&Mǡen SZJ+(Q>8E >7W endstream endobj 479 0 obj << /Producer (pdfTeX-1.40.25) /Creator (TeX) /CreationDate (D:20250413181228+02'00') /ModDate (D:20250413181228+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023/Debian) kpathsea version 6.3.5) >> endobj 467 0 obj << /Type /ObjStm /N 12 /First 100 /Length 692 /Filter /FlateDecode >> stream xڍUn0+xD@ AYziseFf!EwFr^<{IBB“P2'Q )I2 2"Y (ЈĄ2) Ed1 '$ْo',qHNE#FF>DCOzuܨCWNi1$g.Μ:5:55vꗪFFCK+Tt4&|>Bsҥz M;S0[|F%Cܛ ZDyUU*]cGu!+?.헝ZOQ飺n?k%kޔ֔&Ō7mP\޽P5@jz\sYT eo[؞tS/y4Ji F7=$UtvpЅ6,6_譶p|R_ lT5#hUs?~ш؅$e'HQFe'J.؃?da;sW2$)t팄YFҜ]TJvI 4K*hxEp x6%222;uJ$OO?R8 <4F6E954B10E83BAD73F22030EE310143>] /Length 1146 /Filter /FlateDecode >> stream x%KlUU--}ЖR (=-miKE'F90q8h3<#N0ѐzɗg!XfB 2(XJ Ӣ/!p}IdABk'- gI"L (PcTZX5&5vEOՃ: sp4 +=; Z@b5vj{k]4 z@/»4S``/WG10l!N0Fy8A*Y蹦jVc>1 -|)gY0.sU<&0g΃Mp,XC%p,Y W2k`oOT]upl[`w3QyVg\۵)O=G.z0{kQSAفR㩗t z+APmj&zׁِCt'lbE2 f?V1Yl3;&z*tulu:9N0:cOh` i:r99prlr CC\W88 W :"6@GCfjmpG7eȁPa2'oqiYb   @!KA (eTTjPҒZP0' _FA hmtNA}*[>9a0Pµp%88ƞ٫KdRq읿TНHǓIpo2Iw΀f,69j#$Io%`th\"]' H׈eRn*X!N DcT,y"A*ۍ,-:.2CKyK~.'111r'?aČ*bgΨ&hDшE#F(Q4_E#F]n(Q4Jk4{6>UQZQePffEG:,OESe٩g->RkoSg~EkPQ6!RH8ql<t7)MilJOSzΔve{Q~?+ endstream endobj startxref 290251 %%EOF gperf-3.2.1/doc/gperf.html0000664000000000000000000031730414776761154011041 Perfect Hash Function Generator

User's Guide to gperf 3.2

The GNU Perfect Hash Function Generator

Edition 3.2, 28 October 2024

Douglas C. Schmidt
Bruno Haible


Table of Contents


Copyright (C) 1989-2024 Free Software Foundation, Inc.

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled “GNU General Public License” is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled “GNU General Public License” may be included in a translation approved by the author instead of in the original English.

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/

Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.

1.0 Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

1.1 TERMS AND CONDITIONS

  1. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
  2. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work.
  3. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
  4. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
  5. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
  6. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
    1. The work must carry prominent notices stating that you modified it, and giving a relevant date.
    2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
    3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
    4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
    A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
  7. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
    1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
    2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
    3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
    4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
    5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
    A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
  8. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
    1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
    2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
    3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
    4. Limiting the use for publicity purposes of names of licensors or authors of the material; or
    5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
    6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
    All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
  9. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
  10. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
  11. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
  12. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
  13. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
  14. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
  15. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
  16. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
  17. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  18. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

1.2 END OF TERMS AND CONDITIONS

1.3 How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

one line to give the program's name and a brief idea of what it does.
Copyright (C) year name of author

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at
your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

program Copyright (C) year name of author
This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
This is free software, and you are welcome to redistribute it
under certain conditions; type ‘show c’ for details.

The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.

Contributors to GNU gperf Utility

  • The GNU gperf perfect hash function generator utility was written in GNU C++ by Douglas C. Schmidt. The general idea for the perfect hash function generator was inspired by Keith Bostic's algorithm written in C, and distributed to net.sources around 1984. The current program is a heavily modified, enhanced, and extended implementation of Keith's basic idea, created at the University of California, Irvine. Bugs, patches, and suggestions should be reported to <bug-gperf@gnu.org>.
  • Special thanks is extended to Michael Tiemann and Doug Lea, for providing a useful compiler, and for giving me a forum to exhibit my creation. In addition, Adam de Boor and Nels Olson provided many tips and insights that greatly helped improve the quality and functionality of gperf.
  • Bruno Haible enhanced and optimized the search algorithm. He also rewrote the input routines and the output routines for better reliability, and added a testsuite.

2 Introduction

gperf is a perfect hash function generator written in C++. It transforms an n element user-specified keyword set W into a perfect hash function F. F uniquely maps keywords in W onto the range 0..k, where k >= n-1. If k = n-1 then F is a minimal perfect hash function. gperf generates a 0..k element static lookup table and a pair of C functions. These functions determine whether a given character string s occurs in W, using at most one probe into the lookup table.

gperf currently generates the reserved keyword recognizer for lexical analyzers in several production and research compilers and language processing tools, including GNU C, GNU C++, GNU Java, GNU Pascal, GNU Modula 3, and GNU indent. Complete C++ source code for gperf is available from https://ftp.gnu.org/pub/gnu/gperf/. A paper describing gperf's design and implementation in greater detail is available in the Second USENIX C++ Conference proceedings or from http://www.cs.wustl.edu/~schmidt/resume.html.

3 Static search structures and GNU gperf

A static search structure is an Abstract Data Type with certain fundamental operations, e.g., initialize, insert, and retrieve. Conceptually, all insertions occur before any retrievals. In practice, gperf generates a static array containing search set keywords and any associated attributes specified by the user. Thus, there is essentially no execution-time cost for the insertions. It is a useful data structure for representing static search sets. Static search sets occur frequently in software system applications. Typical static search sets include compiler reserved words, assembler instruction opcodes, and built-in shell interpreter commands. Search set members, called keywords, are inserted into the structure only once, usually during program initialization, and are not generally modified at run-time.

Numerous static search structure implementations exist, e.g., arrays, linked lists, binary search trees, digital search tries, and hash tables. Different approaches offer trade-offs between space utilization and search time efficiency. For example, an n element sorted array is space efficient, though the average-case time complexity for retrieval operations using binary search is proportional to log n. Conversely, hash table implementations often locate a table entry in constant time, but typically impose additional memory overhead and exhibit poor worst case performance.

Minimal perfect hash functions provide an optimal solution for a particular class of static search sets. A minimal perfect hash function is defined by two properties:

  • It allows keyword recognition in a static search set using at most one probe into the hash table. This represents the “perfect” property.
  • The actual memory allocated to store the keywords is precisely large enough for the keyword set, and no larger. This is the “minimal” property.

For most applications it is far easier to generate perfect hash functions than minimal perfect hash functions. Moreover, non-minimal perfect hash functions frequently execute faster than minimal ones in practice. This phenomena occurs since searching a sparse keyword table increases the probability of locating a “null” entry, thereby reducing string comparisons. gperf's default behavior generates near-minimal perfect hash functions for keyword sets. However, gperf provides many options that permit user control over the degree of minimality and perfection.

Static search sets often exhibit relative stability over time. For example, Ada's 63 reserved words have remained constant for nearly a decade. It is therefore frequently worthwhile to expend concerted effort building an optimal search structure once, if it subsequently receives heavy use multiple times. gperf removes the drudgery associated with constructing time- and space-efficient search structures by hand. It has proven a useful and practical tool for serious programming projects. Output from gperf is currently used in several production and research compilers, including GNU C, GNU C++, GNU Java, GNU Pascal, and GNU Modula 3. The latter two compilers are not yet part of the official GNU distribution. Each compiler utilizes gperf to automatically generate static search structures that efficiently identify their respective reserved keywords.

4 High-Level Description of GNU gperf

The perfect hash function generator gperf reads a set of “keywords” from an input file (or from the standard input by default). It attempts to derive a perfect hashing function that recognizes a member of the static keyword set with at most a single probe into the lookup table. If gperf succeeds in generating such a function it produces a pair of C source code routines that perform hashing and table lookup recognition. All generated C code is directed to the standard output. Command-line options described below allow you to modify the input and output format to gperf.

By default, gperf attempts to produce time-efficient code, with less emphasis on efficient space utilization. However, several options exist that permit trading-off execution time for storage space and vice versa. In particular, expanding the generated table size produces a sparse search structure, generally yielding faster searches. Conversely, you can direct gperf to utilize a C switch statement scheme that minimizes data space storage size. Furthermore, using a C switch may actually speed up the keyword retrieval time somewhat. Actual results depend on your C compiler, of course.

In general, gperf assigns values to the bytes it is using for hashing until some set of values gives each keyword a unique value. A helpful heuristic is that the larger the hash value range, the easier it is for gperf to find and generate a perfect hash function. Experimentation is the key to getting the most from gperf.

4.1 Input Format to gperf

You can control the input file format by varying certain command-line arguments, in particular the ‘-t’ option. The input's appearance is similar to GNU utilities flex and bison (or UNIX utilities lex and yacc). Here's an outline of the general format:

declarations
%%
keywords
%%
functions

Unlike flex or bison, the declarations section and the functions section are optional. The following sections describe the input format for each section.

It is possible to omit the declaration section entirely, if the ‘-t’ option is not given. In this case the input file begins directly with the first keyword line, e.g.:

january
february
march
april
...

4.1.1 Declarations

The keyword input file optionally contains a section for including arbitrary C declarations and definitions, gperf declarations that act like command-line options, as well as for providing a user-supplied struct.

4.1.1.1 User-supplied struct

If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) is enabled, you must provide a C struct as the last component in the declaration section from the input file. The first field in this struct must be of type char * or const char * if the ‘-P’ option is not given, or of type int if the option ‘-P’ (or, equivalently, the ‘%pic’ declaration) is enabled. This first field must be called ‘name’, although it is possible to modify its name with the ‘-K’ option (or, equivalently, the ‘%define slot-name’ declaration) described below.

Here is a simple example, using months of the year and their attributes as input:

struct month { char *name; int number; int days; int leap_days; };
%%
january,   1, 31, 31
february,  2, 28, 29
march,     3, 31, 31
april,     4, 30, 30
may,       5, 31, 31
june,      6, 30, 30
july,      7, 31, 31
august,    8, 31, 31
september, 9, 30, 30
october,  10, 31, 31
november, 11, 30, 30
december, 12, 31, 31

Separating the struct declaration from the list of keywords and other fields are a pair of consecutive percent signs, ‘%%’, appearing left justified in the first column, as in the UNIX utility lex.

If the struct has already been declared in an include file, it can be mentioned in an abbreviated form, like this:

struct month;
%%
january,   1, 31, 31
...

4.1.1.2 Gperf Declarations

The declaration section can contain gperf declarations. They influence the way gperf works, like command line options do. In fact, every such declaration is equivalent to a command line option. There are three forms of declarations:

  1. Declarations without argument, like ‘%compare-lengths’.
  2. Declarations with an argument, like ‘%switch=count.
  3. Declarations of names of entities in the output file, like ‘%define lookup-function-name name.

When a declaration is given both in the input file and as a command line option, the command-line option's value prevails.

The following gperf declarations are available.

‘%delimiters=delimiter-list
Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines.
‘%struct-type’
Allows you to include a struct type declaration for generated code; see above for an example.
‘%ignore-case’
Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored.
‘%language=language-name
Instructs gperf to generate code in the language specified by the option's argument. Languages handled are currently:
‘KR-C’
Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’.
‘C’
Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you #define const to empty for compilers which don't know about this keyword.
‘ANSI-C’
ANSI C. This language is understood by ANSI C (C89, ISO C90) compilers, ISO C99 compilers, and C++ compilers.
‘C++’
C++. This language is understood by C++ compilers.
The default is ANSI-C.
‘%define slot-name name
This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied struct.
‘%define initializer-suffix initializers
This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following slot-name in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following slot-name.
‘%define hash-function-name name
Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file.
‘%define lookup-function-name name
Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application.
‘%define class-name name
This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is Perfect_Hash.
‘%7bit’
This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions isalnum and isgraph do not guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.)
‘%compare-lengths’
Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (see section 4.3 Use of NUL bytes). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via strcmp. However, using ‘%compare-lengths’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table.
‘%compare-strncmp’
Generates C code that uses the strncmp function to perform string comparisons. The default action is to use strcmp.
‘%readonly-tables’
Makes the contents of all generated lookup tables constant, i.e., “readonly”. Many compilers can generate more efficient code for this by putting the tables in readonly memory.
‘%enum’
Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark <jjc@ai.mit.edu>.
‘%includes’
Include the necessary system include file, <string.h>, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code.
‘%global-table’
Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior).
‘%pic’
Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the ‘%struct-type’ declaration (or, equivalently, the option ‘-t’) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + o, where o is the offset. The string pool name can be changed through the ‘%define string-pool-name’ declaration.
‘%define string-pool-name name
Allows you to specify the name of the generated string pool created by the declaration ‘%pic’ (or, equivalently, the option ‘-P’). The default name is ‘stringpool’. This declaration permits the use of two hash tables in the same file, with ‘%pic’ and even when the ‘%global-table’ declaration (or, equivalently, the option ‘-G’) is given.
‘%null-strings’
Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as the declaration ‘%pic’), at the expense of one more test-and-branch instruction at run time.
‘%define constants-prefix prefix
Allows you to specify a prefix for the constants TOTAL_KEYWORDS, MIN_WORD_LENGTH, MAX_WORD_LENGTH, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘%define word-array-name name
Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘%define length-table-name name
Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘%switch=count
Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each switch, etc. This is useful since many C compilers cannot correctly generate code for large switch statements. This option was inspired in part by Keith Bostic's original C program.
‘%omit-struct-type’
Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere.

4.1.1.3 C Code Inclusion

Using a syntax similar to GNU utilities flex and bison, it is possible to directly include C source text and comments verbatim into the generated output file. This is accomplished by enclosing the region inside left-justified surrounding ‘%{’, ‘%}’ pairs. Here is an input fragment based on the previous example that illustrates this feature:

%{
#include <assert.h>
/* This section of code is inserted directly into the output. */
int return_month_days (struct month *months, int is_leap_year);
%}
struct month { char *name; int number; int days; int leap_days; };
%%
january,   1, 31, 31
february,  2, 28, 29
march,     3, 31, 31
...

4.1.2 Format for Keyword Entries

The second input file format section contains lines of keywords and any associated attributes you might supply. A line beginning with ‘#’ in the first column is considered a comment. Everything following the ‘#’ is ignored, up to and including the following newline. A line beginning with ‘%’ in the first column is an option declaration and must not occur within the keywords section.

The first field of each non-comment line is always the keyword itself. It can be given in two ways: as a simple name, i.e., without surrounding string quotation marks, or as a string enclosed in double-quotes, in C syntax, possibly with backslash escapes like \" or \234 or \xa8. In either case, it must start right at the beginning of the line, without leading whitespace. In this context, a “field” is considered to extend up to, but not include, the first blank, comma, or newline. Here is a simple example taken from a partial list of C reserved words:

# These are a few C reserved words, see the c.gperf file 
# for a complete list of ANSI C reserved words.
unsigned
sizeof
switch
signed
if
default
for
while
return

Note that unlike flex or bison the first ‘%%’ marker may be elided if the declaration section is empty.

Additional fields may optionally follow the leading keyword. Fields should be separated by commas, and terminate at the end of line. What these fields mean is entirely up to you; they are used to initialize the elements of the user-defined struct provided by you in the declaration section. If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) is not enabled these fields are simply ignored. All previous examples except the last one contain keyword attributes.

4.1.3 Including Additional C Functions

The optional third section also corresponds closely with conventions found in flex and bison. All text in this section, starting at the final ‘%%’ and extending to the end of the input file, is included verbatim into the generated output file. Naturally, it is your responsibility to ensure that the code contained in this section is valid C.

4.1.4 Where to place directives for GNU indent.

If you want to invoke GNU indent on a gperf input file, you will see that GNU indent doesn't understand the ‘%%’, ‘%{’ and ‘%}’ directives that control gperf's interpretation of the input file. Therefore you have to insert some directives for GNU indent. More precisely, assuming the most general input file structure

declarations part 1
%{
verbatim code
%}
declarations part 2
%%
keywords
%%
functions

you would insert ‘*INDENT-OFF*’ and ‘*INDENT-ON*’ comments as follows:

/* *INDENT-OFF* */
declarations part 1
%{
/* *INDENT-ON* */
verbatim code
/* *INDENT-OFF* */
%}
declarations part 2
%%
keywords
%%
/* *INDENT-ON* */
functions

4.2 Output Format for Generated C Code with gperf

Several options control how the generated C code appears on the standard output. Two C functions are generated. They are called hash and in_word_set, although you may modify their names with a command-line option. Both functions require two arguments, a string, char * str, and a length parameter, int len. Their default function prototypes are as follows:

Function: unsigned int hash (const char * str, size_t len)
By default, the generated hash function returns an integer value created by adding len to several user-specified str byte positions indexed into an associated values table stored in a local static array. The associated values table is constructed internally by gperf and later output as a static local C array called ‘hash_table’. The relevant selected positions (i.e. indices into str) are specified via the ‘-k’ option when running gperf, as detailed in the Options section below (see section 5 Invoking gperf).

Function: in_word_set (const char * str, size_t len)
If str is in the keyword set, returns a pointer to that keyword. More exactly, if the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) was given, it returns a pointer to the matching keyword's structure. Otherwise it returns NULL.

If the option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is not used, str must be a NUL terminated string of exactly length len. If ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, str must simply be an array of len bytes and does not need to be NUL terminated.

The code generated for these two functions is affected by the following options:

‘-t’
‘--struct-type’
Make use of the user-defined struct.
‘-S total-switch-statements
‘--switch=total-switch-statements
Generate 1 or more C switch statement rather than use a large, (and potentially sparse) static array. Although the exact time and space savings of this approach vary according to your C compiler's degree of optimization, this method often results in smaller and faster code.

If the ‘-t’ and ‘-S’ options (or, equivalently, the ‘%struct-type’ and ‘%switch’ declarations) are omitted, the default action is to generate a char * array containing the keywords, together with additional empty strings used for padding the array. By experimenting with the various input and output options, and timing the resulting C code, you can determine the best option choices for different keyword set characteristics.

4.3 Use of NUL bytes

By default, the code generated by gperf operates on zero terminated strings, the usual representation of strings in C. This means that the keywords in the input file must not contain NUL bytes, and the str argument passed to hash or in_word_set must be NUL terminated and have exactly length len.

If option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, then the str argument does not need to be NUL terminated. The code generated by gperf will only access the first len, not len+1, bytes starting at str. However, the keywords in the input file still must not contain NUL bytes.

If option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration) is used, then the hash table performs binary comparison. The keywords in the input file may contain NUL bytes, written in string syntax as \000 or \x00, and the code generated by gperf will treat NUL like any other byte. Also, in this case the ‘-c’ option (or, equivalently, the ‘%compare-strncmp’ declaration) is ignored.

4.4 Controlling Identifiers

The identifiers of the functions, tables, and constants defined by the code generated by gperf can be controlled through gperf declarations or the equivalent command-line options. This is useful for three purposes:

  • Esthetics of the generated code. For this purpose, just use the available declarations or options at will.
  • Controlling the exported identifiers of a library. Assume you include code generated by gperf in a library, and to avoid collisions with other libraries, you want to ensure that all exported identifiers of this library start with a certain prefix. By default, the only exported identifier is the lookup function. You can therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration). When you use the option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration), the only exported entity is a class. You control its name through the option ‘-Z’ (or, equivalently, the ‘%define class-name’ declaration).
  • Allowing multiple gperf generated codes in a single compilation unit. Assume you invoke gperf multiple times, with different input files, and want the generated code to be included from the same source file. In this case, you have to customize not only the exported identifiers, but also the names of functions with ‘static’ scope, types, and constants. By default, you will have to deal with the lookup function, the hash function, and the constants. You should therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration), the option ‘-H’ (or, equivalently, the ‘%define hash-function-name’ declaration), and the option ‘--constants-prefix’ (or, equivalently, the ‘%define constants-prefix’ declaration). If you use the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration), you will also have to deal with the word array, the length table if present, and the string pool if present. This means: You should use the option ‘-W’ (or, equivalently, the ‘%define word-array-name’ declaration). If you use the option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration), you should use the option ‘--length-table-name’ (or, equivalently, the ‘%define length-table-name’ declaration). If you use the option ‘-P’ (or, equivalently, the ‘%pic’ declaration), you should use the option ‘-Q’ (or, equivalently, the ‘%define string-pool-name’ declaration).

4.5 The Copyright of the Output

gperf is under GPL, but that does not cause the output produced by gperf to be under GPL. The reason is that the output contains only small pieces of text that come directly from gperf's source code -- only about 7 lines long, too small for being significant --, and therefore the output is not a “work based on gperf” (in the sense of the GPL version 3).

On the other hand, the output produced by gperf contains essentially all of the input file. Therefore the output is a “derivative work” of the input (in the sense of U.S. copyright law); and its copyright status depends on the copyright of the input. For most software licenses, the result is that the output is under the same license, with the same copyright holder, as the input that was passed to gperf.

5 Invoking gperf

There are many options to gperf. They were added to make the program more convenient for use with real applications. “On-line” help is readily available via the ‘--help’ option. Here is the complete list of options.

5.1 Specifying the Location of the Output File

‘--output-file=file
Allows you to specify the name of the file to which the output is written to.

The results are written to standard output if no output file is specified or if it is ‘-’.

5.2 Options that affect Interpretation of the Input File

These options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-e keyword-delimiter-list
‘--delimiters=keyword-delimiter-list
Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines. One useful trick is to use -e'TAB', where TAB is the literal tab character.
‘-t’
‘--struct-type’
Allows you to include a struct type declaration for generated code. Any text before a pair of consecutive ‘%%’ is considered part of the type declaration. Keywords and additional fields may follow this, one group of fields per line. A set of examples for generating perfect hash tables and functions for Ada, C, C++, Pascal, Modula 2, Modula 3 and JavaScript reserved words are distributed with this release.
‘--ignore-case’
Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored. This option is therefore not suitable if a properly internationalized or locale aware case mapping should be used. (For example, in a Turkish locale, the upper case equivalent of the lowercase ASCII letter ‘i’ is the non-ASCII character ‘capital i with dot above’.) For this case, it is better to apply an uppercase or lowercase conversion on the string before passing it to the gperf generated function.

5.3 Options to specify the Language for the Output Code

These options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-L generated-language-name
‘--language=generated-language-name
Instructs gperf to generate code in the language specified by the option's argument. Languages handled are currently:
‘KR-C’
Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’.
‘C’
Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you #define const to empty for compilers which don't know about this keyword.
‘ANSI-C’
ANSI C. This language is understood by ANSI C compilers and C++ compilers.
‘C++’
C++. This language is understood by C++ compilers.
The default is ANSI-C.
‘-a’
This option is supported for compatibility with previous releases of gperf. It does not do anything.
‘-g’
This option is supported for compatibility with previous releases of gperf. It does not do anything.

5.4 Options for fine tuning Details in the Output Code

Most of these options are also available as declarations in the input file (see section 4.1.1.2 Gperf Declarations).

‘-K slot-name
‘--slot-name=slot-name
This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied struct.
‘-F initializers
‘--initializer-suffix=initializers
This option is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following slot-name in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following slot-name.
‘-H hash-function-name
‘--hash-function-name=hash-function-name
Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file.
‘-N lookup-function-name
‘--lookup-function-name=lookup-function-name
Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application.
‘-Z class-name
‘--class-name=class-name
This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is Perfect_Hash.
‘-7’
‘--seven-bit’
This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions isalnum and isgraph do not guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.) This was the default in versions of gperf earlier than 2.7; now the default is to support 8-bit and multibyte characters.
‘-l’
‘--compare-lengths’
Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (see section 4.3 Use of NUL bytes). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via strcmp. However, using ‘-l’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table.
‘-c’
‘--compare-strncmp’
Generates C code that uses the strncmp function to perform string comparisons. The default action is to use strcmp.
‘-C’
‘--readonly-tables’
Makes the contents of all generated lookup tables constant, i.e., “readonly”. Many compilers can generate more efficient code for this by putting the tables in readonly memory.
‘-E’
‘--enum’
Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark <jjc@ai.mit.edu>.
‘-I’
‘--includes’
Include the necessary system include file, <string.h>, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code.
‘-G’
‘--global-table’
Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior).
‘-P’
‘--pic’
Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + o, where o is the offset. The string pool name can be changed through the option ‘--string-pool-name’.
‘-Q string-pool-name
‘--string-pool-name=string-pool-name
Allows you to specify the name of the generated string pool created by option ‘-P’. The default name is ‘stringpool’. This option permits the use of two hash tables in the same file, with ‘-P’ and even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘--null-strings’
Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as option ‘-P’), at the expense of one more test-and-branch instruction at run time.
‘--constants-prefix=prefix
Allows you to specify a prefix for the constants TOTAL_KEYWORDS, MIN_WORD_LENGTH, MAX_WORD_LENGTH, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘-W hash-table-array-name
‘--word-array-name=hash-table-array-name
Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘--length-table-name=length-table-array-name
Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
‘-S total-switch-statements
‘--switch=total-switch-statements
Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each switch, etc. This is useful since many C compilers cannot correctly generate code for large switch statements. This option was inspired in part by Keith Bostic's original C program.
‘-T’
‘--omit-struct-type’
Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere.
‘-p’
This option is supported for compatibility with previous releases of gperf. It does not do anything.

5.5 Options for changing the Algorithms employed by gperf

‘-k selected-byte-positions
‘--key-positions=selected-byte-positions
Allows selection of the byte positions used in the keywords' hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, e.g., ‘-k 9,4,13,14’; ranges may be used, e.g., ‘-k 2-7’; and positions may occur in any order. Furthermore, the wildcard '*' causes the generated hash function to consider all byte positions in each keyword, whereas '$' instructs the hash function to use the “final byte” of a keyword (this is the only way to use a byte position greater than 255, incidentally). For instance, the option ‘-k 1,2,4,6-10,'$'’ generates a hash function that considers positions 1,2,4,6,7,8,9,10, plus the last byte in each keyword (which may be at a different position for each keyword, obviously). Keywords with length less than the indicated byte positions work properly, since selected byte positions exceeding the keyword length are simply not referenced in the hash function. This option is not normally needed since version 2.8 of gperf; the default byte positions are computed depending on the keyword set, through a search that minimizes the number of byte positions.
‘-D’
‘--duplicates’
Handle keywords whose selected byte sets hash to duplicate values. Duplicate hash values can occur if a set of keywords has the same names, but possesses different attributes, or if the selected byte positions are not well chosen. With the -D option gperf treats all these keywords as part of an equivalence class and generates a perfect hash function with multiple comparisons for duplicate keywords. It is up to you to completely disambiguate the keywords by modifying the generated C code. However, gperf helps you out by organizing the output. Using this option usually means that the generated hash function is no longer perfect. On the other hand, it permits gperf to work on keyword sets that it otherwise could not handle.
‘-m iterations
‘--multiple-iterations=iterations
Perform multiple choices of the ‘-i’ and ‘-j’ values, and choose the best results. This increases the running time by a factor of iterations but does a good job minimizing the generated table size.
‘-i initial-value
‘--initial-asso=initial-value
Provides an initial value for the associate values array. Default is 0. Increasing the initial value helps inflate the final table size, possibly leading to more time efficient keyword lookups. Note that this option is not particularly useful when ‘-S’ (or, equivalently, ‘%switch’) is used. Also, ‘-i’ is overridden when the ‘-r’ option is used.
‘-j jump-value
‘--jump=jump-value
Affects the “jump value”, i.e., how far to advance the associated byte value upon collisions. Jump-value is rounded up to an odd number, the default is 5. If the jump-value is 0 gperf jumps by random amounts.
‘-n’
‘--no-strlen’
Instructs the generator not to include the length of a keyword when computing its hash value. This may save a few assembly instructions in the generated lookup table.
‘-r’
‘--random’
Utilizes randomness to initialize the associated values table. This frequently generates solutions faster than using deterministic initialization (which starts all associated values at 0). Furthermore, using the randomization option generally increases the size of the table.
‘-s size-multiple
‘--size-multiple=size-multiple
Affects the size of the generated hash table. The numeric argument for this option indicates “how many times larger or smaller” the maximum associated value range should be, in relationship to the number of keywords. It can be written as an integer, a floating-point number or a fraction. For example, a value of 3 means “allow the maximum associated value to be about 3 times larger than the number of input keywords”. Conversely, a value of 1/3 means “allow the maximum associated value to be about 3 times smaller than the number of input keywords”. Values smaller than 1 are useful for limiting the overall size of the generated hash table, though the option ‘-m’ is better at this purpose. If `generate switch' option ‘-S’ (or, equivalently, ‘%switch’) is not enabled, the maximum associated value influences the static array table size, and a larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. The default value is 1, thus the default maximum associated value is about the same size as the number of keywords. (For efficiency, the maximum associated value is always rounded up to a power of 2.) The actual table size may vary somewhat, since this technique is essentially a heuristic.

5.6 Informative Output

‘-h’
‘--help’
Prints a short summary on the meaning of each program option. Aborts further program execution.
‘-v’
‘--version’
Prints out the current version number.
‘-d’
‘--debug’
Enables the debugging option. This produces verbose diagnostics to “standard error” when gperf is executing. It is useful both for maintaining the program and for determining whether a given set of options is actually speeding up the search for a solution. Some useful information is dumped at the end of the program when the ‘-d’ option is enabled.

6 Known Bugs and Limitations with gperf

The following are some limitations with the current release of gperf:

  • The gperf utility is tuned to execute quickly, and works quickly for small to medium size data sets (around 1000 keywords). It is extremely useful for maintaining perfect hash functions for compiler keyword sets. Since version 3.0, gperf also works efficiently on much larger keyword sets (over 15,000 keywords).
  • The size of the generate static keyword array can get extremely large if the input keyword file is large or if the keywords are quite similar. This tends to slow down the compilation of the generated C code, and greatly inflates the object code size. If this situation occurs, consider using the ‘-S’ option to reduce data size, potentially increasing the keyword recognition time by a negligible amount. Since many C compilers cannot correctly generate code for large switch statements it is important to qualify the -S option with an appropriate numerical argument that controls the number of switch statements generated.
  • The maximum number of selected byte positions has an arbitrary limit of 255. This restriction should be removed, and if anyone considers this a problem write me and let me know so I can remove the constraint.

7 Things Still Left to Do

It should be “relatively” easy to replace the current perfect hash function algorithm with a more exhaustive approach; the perfect hash module is essential independent from other program modules. Additional worthwhile improvements include:

  • Another useful extension involves modifying the program to generate “minimal” perfect hash functions (under certain circumstances, the current version can be rather extravagant in the generated table size). This is mostly of theoretical interest, since a sparse table often produces faster lookups, and use of the ‘-S’ switch option can minimize the data size, at the expense of slightly longer lookups (note that the gcc compiler generally produces good code for switch statements, reducing the need for more complex schemes).
  • In addition to improving the algorithm, it would also be useful to generate an Ada package as the code output, in addition to the current C and C++ routines.

8 Bibliography

[1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect Hashing Functions Information Sciences 39(1986), 187-195.

[2] Cichelli, Richard J. Author's Response to “On Cichelli's Minimal Perfect Hash Functions Method” Communications of the ACM, 23, 12(December 1980), 729.

[3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple Communications of the ACM, 23, 1(January 1980), 17-19.

[4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal Perfect Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27.

[5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58.

[6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal Perfect Hashing Functions Communications of the ACM, 24, 12(December 1981), 829-833.

[7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect Hash Functions Method Communications of the ACM, 23, 12(December 1980), 728-729.

[8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532

[9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator Second USENIX C++ Conference Proceedings, April 1990.

[10] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator C++ Report, SIGS 10 10 (November/December 1998).

[11] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions for Reserved Word Lists SIGPLAN Notices, 20, 12(September 1985), 47-53.

[12] Sprugnoli, R. Perfect Hashing Functions: A Single Probe Retrieving Method for Static Sets Communications of the ACM, 20 11(November 1977), 841-850.

[13] Stallman, Richard M. Using and Porting GNU CC Free Software Foundation, 1988.

[14] Stroustrup, Bjarne The C++ Programming Language. Addison-Wesley, 1986.

[15] Tiemann, Michael D. User's Guide to GNU C++ Free Software Foundation, 1989.

Concept Index

Jump to: & - a - b - c - d - f - h - i - j - k - m - n - s

&

  • ‘%%’
  • ‘%7bit’
  • ‘%compare-lengths’
  • ‘%compare-strncmp’
  • ‘%define class-name’
  • ‘%define constants-prefix’
  • ‘%define hash-function-name’
  • ‘%define initializer-suffix’
  • ‘%define length-table-name’
  • ‘%define lookup-function-name’
  • ‘%define slot-name’
  • ‘%define string-pool-name’
  • ‘%define word-array-name’
  • ‘%delimiters’
  • ‘%enum’
  • ‘%global-table’
  • ‘%ignore-case’
  • ‘%includes’
  • ‘%language’
  • ‘%null-strings’
  • ‘%omit-struct-type’
  • ‘%pic’
  • ‘%readonly-tables’
  • ‘%struct-type’
  • ‘%switch’
  • ‘%{’
  • ‘%}’
  • a

  • Array name, Array name
  • b

  • Bugs
  • c

  • Class name
  • Constants definition
  • Constants prefix
  • Copyright
  • d

  • Declaration section
  • Delimiters
  • Duplicates
  • f

  • Format
  • Functions section
  • h

  • hash
  • hash table
  • i

  • in_word_set
  • Initializers
  • j

  • Jump value
  • k

  • Keywords section
  • m

  • Minimal perfect hash functions
  • n

  • NUL
  • s

  • Slot name
  • Static search structure
  • switch, switch

  • This document was generated on 13 April 2025 using the texi2html translator version 1.52b.

    gperf-3.2.1/doc/gperf_toc.html0000664000000000000000000000616614776761154011707 Perfect Hash Function Generator - Table of Contents

    User's Guide to gperf 3.2

    The GNU Perfect Hash Function Generator

    Edition 3.2, 28 October 2024

    Douglas C. Schmidt
    Bruno Haible



    This document was generated on 13 April 2025 using the texi2html translator version 1.52b.

    gperf-3.2.1/doc/gperf_2.html0000664000000000000000000000351214776761154011253 Perfect Hash Function Generator - Contributors to GNU gperf Utility Go to the first, previous, next, last section, table of contents.


    Contributors to GNU gperf Utility

    • The GNU gperf perfect hash function generator utility was written in GNU C++ by Douglas C. Schmidt. The general idea for the perfect hash function generator was inspired by Keith Bostic's algorithm written in C, and distributed to net.sources around 1984. The current program is a heavily modified, enhanced, and extended implementation of Keith's basic idea, created at the University of California, Irvine. Bugs, patches, and suggestions should be reported to <bug-gperf@gnu.org>.
    • Special thanks is extended to Michael Tiemann and Doug Lea, for providing a useful compiler, and for giving me a forum to exhibit my creation. In addition, Adam de Boor and Nels Olson provided many tips and insights that greatly helped improve the quality and functionality of gperf.
    • Bruno Haible enhanced and optimized the search algorithm. He also rewrote the input routines and the output routines for better reliability, and added a testsuite.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf_7.html0000664000000000000000000000423414776761154011262 Perfect Hash Function Generator - 6 Known Bugs and Limitations with gperf Go to the first, previous, next, last section, table of contents.


    6 Known Bugs and Limitations with gperf

    The following are some limitations with the current release of gperf:

    • The gperf utility is tuned to execute quickly, and works quickly for small to medium size data sets (around 1000 keywords). It is extremely useful for maintaining perfect hash functions for compiler keyword sets. Since version 3.0, gperf also works efficiently on much larger keyword sets (over 15,000 keywords).
    • The size of the generate static keyword array can get extremely large if the input keyword file is large or if the keywords are quite similar. This tends to slow down the compilation of the generated C code, and greatly inflates the object code size. If this situation occurs, consider using the ‘-S’ option to reduce data size, potentially increasing the keyword recognition time by a negligible amount. Since many C compilers cannot correctly generate code for large switch statements it is important to qualify the -S option with an appropriate numerical argument that controls the number of switch statements generated.
    • The maximum number of selected byte positions has an arbitrary limit of 255. This restriction should be removed, and if anyone considers this a problem write me and let me know so I can remove the constraint.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/configure.ac0000664000000000000000000000234414630031131011277 dnl autoconf configuration for gperf/doc dnl Copyright (C) 1998-2024 Free Software Foundation, Inc. dnl Written by Douglas C. Schmidt dnl and Bruno Haible . dnl dnl This file is part of GNU GPERF. dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_PREREQ([2.64]) AC_INIT AC_CONFIG_SRCDIR([gperf.texi]) AC_CONFIG_AUX_DIR([../build-aux]) PACKAGE=gperf AC_SUBST([PACKAGE]) AC_PROG_MAKE_SET dnl dnl checks for programs dnl AC_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl That's it. dnl AC_CONFIG_FILES([Makefile]) AC_OUTPUT gperf-3.2.1/doc/gpl-3.0.texi0000664000000000000000000010441313074402054010773 @c The GNU General Public License. @center Version 3, 29 June 2007 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program---to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. @heading TERMS AND CONDITIONS @enumerate 0 @item Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. @item Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. @item Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. @item Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. @item Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. @item Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. @item You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. @item If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. @end enumerate A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. @item Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @enumerate a @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. @item Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. @item Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. @item Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. @end enumerate A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. @item Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or @item Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. @end enumerate All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. @item Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. @item Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. @item Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. @item Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. @item No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. @item Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. @item Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. @item Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @item Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. @end enumerate @heading END OF TERMS AND CONDITIONS @heading How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see @url{http://www.gnu.org/licenses/}. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. gperf-3.2.1/doc/gperf_10.html0000664000000000000000000001162714776761154011340 Perfect Hash Function Generator - Concept Index Go to the first, previous, next, last section, table of contents.


    Concept Index

    Jump to: & - a - b - c - d - f - h - i - j - k - m - n - s

    &

  • ‘%%’
  • ‘%7bit’
  • ‘%compare-lengths’
  • ‘%compare-strncmp’
  • ‘%define class-name’
  • ‘%define constants-prefix’
  • ‘%define hash-function-name’
  • ‘%define initializer-suffix’
  • ‘%define length-table-name’
  • ‘%define lookup-function-name’
  • ‘%define slot-name’
  • ‘%define string-pool-name’
  • ‘%define word-array-name’
  • ‘%delimiters’
  • ‘%enum’
  • ‘%global-table’
  • ‘%ignore-case’
  • ‘%includes’
  • ‘%language’
  • ‘%null-strings’
  • ‘%omit-struct-type’
  • ‘%pic’
  • ‘%readonly-tables’
  • ‘%struct-type’
  • ‘%switch’
  • ‘%{’
  • ‘%}’
  • a

  • Array name, Array name
  • b

  • Bugs
  • c

  • Class name
  • Constants definition
  • Constants prefix
  • Copyright
  • d

  • Declaration section
  • Delimiters
  • Duplicates
  • f

  • Format
  • Functions section
  • h

  • hash
  • hash table
  • i

  • in_word_set
  • Initializers
  • j

  • Jump value
  • k

  • Keywords section
  • m

  • Minimal perfect hash functions
  • n

  • NUL
  • s

  • Slot name
  • Static search structure
  • switch, switch

  • Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf_9.html0000664000000000000000000000555314776761154011271 Perfect Hash Function Generator - 8 Bibliography Go to the first, previous, next, last section, table of contents.


    8 Bibliography

    [1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect Hashing Functions Information Sciences 39(1986), 187-195.

    [2] Cichelli, Richard J. Author's Response to “On Cichelli's Minimal Perfect Hash Functions Method” Communications of the ACM, 23, 12(December 1980), 729.

    [3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple Communications of the ACM, 23, 1(January 1980), 17-19.

    [4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal Perfect Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27.

    [5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M. Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58.

    [6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal Perfect Hashing Functions Communications of the ACM, 24, 12(December 1981), 829-833.

    [7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect Hash Functions Method Communications of the ACM, 23, 12(December 1980), 728-729.

    [8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532

    [9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator Second USENIX C++ Conference Proceedings, April 1990.

    [10] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator C++ Report, SIGS 10 10 (November/December 1998).

    [11] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions for Reserved Word Lists SIGPLAN Notices, 20, 12(September 1985), 47-53.

    [12] Sprugnoli, R. Perfect Hashing Functions: A Single Probe Retrieving Method for Static Sets Communications of the ACM, 20 11(November 1977), 841-850.

    [13] Stallman, Richard M. Using and Porting GNU CC Free Software Foundation, 1988.

    [14] Stroustrup, Bjarne The C++ Programming Language. Addison-Wesley, 1986.

    [15] Tiemann, Michael D. User's Guide to GNU C++ Free Software Foundation, 1989.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf_8.html0000664000000000000000000000344314776761154011264 Perfect Hash Function Generator - 7 Things Still Left to Do Go to the first, previous, next, last section, table of contents.


    7 Things Still Left to Do

    It should be “relatively” easy to replace the current perfect hash function algorithm with a more exhaustive approach; the perfect hash module is essential independent from other program modules. Additional worthwhile improvements include:

    • Another useful extension involves modifying the program to generate “minimal” perfect hash functions (under certain circumstances, the current version can be rather extravagant in the generated table size). This is mostly of theoretical interest, since a sparse table often produces faster lookups, and use of the ‘-S’ switch option can minimize the data size, at the expense of slightly longer lookups (note that the gcc compiler generally produces good code for switch statements, reducing the need for more complex schemes).
    • In addition to improving the algorithm, it would also be useful to generate an Ada package as the code output, in addition to the current C and C++ routines.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/texi2html0000775000000000000000000016015413347563571010711 #!/usr/local/bin/perl 'di '; 'ig 00 '; #+############################################################################## # # # File: texi2html # # # # Description: Program to transform most Texinfo documents to HTML # # # #-############################################################################## # @(#)texi2html 1.52b 01/05/98 Written (mainly) by Lionel Cons, Lionel.Cons@cern.ch # 1.52a: Use acute accent instead of apostrophe. Add support for ISO-8859-1 # characters with cedilla, circumflex etc. # 1.52b: Add option -expandtex. Expand @ifhtml by default, not @ifinfo. # Use Unicode quotation marks instead of grave and acute accents. # Emit charset=UTF-8 declaration. # The man page for this program is included at the end of this file and can be # viewed using the command 'nroff -man texi2html'. # Please read the copyright at the end of the man page. #+++############################################################################ # # # Constants # # # #---############################################################################ $DEBUG_TOC = 1; $DEBUG_INDEX = 2; $DEBUG_BIB = 4; $DEBUG_GLOSS = 8; $DEBUG_DEF = 16; $DEBUG_HTML = 32; $DEBUG_USER = 64; $BIBRE = '\[[\w\/-]+\]'; # RE for a bibliography reference $FILERE = '[\/\w.+-]+'; # RE for a file name $VARRE = '[^\s\{\}]+'; # RE for a variable name $NODERE = '[^@{}:\'`",]+'; # RE for a node name $NODESRE = '[^@{}:\'`"]+'; # RE for a list of node names $XREFRE = '[^@{}]+'; # RE for a xref (should use NODERE) $ERROR = "***"; # prefix for errors and warnings $THISPROG = "texi2html 1.52b"; # program name and version $HOMEPAGE = "http://wwwinfo.cern.ch/dis/texi2html/"; # program home page $TODAY = &pretty_date; # like "20 September 1993" $SPLITTAG = "\n"; # tag to know where to split $PROTECTTAG = "_ThisIsProtected_"; # tag to recognize protected sections $html2_doctype = ''; # # language dependent constants # #$LDC_SEE = 'see'; #$LDC_SECTION = 'section'; #$LDC_IN = 'in'; #$LDC_TOC = 'Table of Contents'; #$LDC_GOTO = 'Go to the'; #$LDC_FOOT = 'Footnotes'; # TODO: @def* shortcuts # # pre-defined indices # %predefined_index = ( 'cp', 'c', 'fn', 'f', 'vr', 'v', 'ky', 'k', 'pg', 'p', 'tp', 't', ); # # valid indices # %valid_index = ( 'c', 1, 'f', 1, 'v', 1, 'k', 1, 'p', 1, 't', 1, ); # # texinfo section names to level # %sec2level = ( 'top', 0, 'chapter', 1, 'unnumbered', 1, 'majorheading', 1, 'chapheading', 1, 'appendix', 1, 'section', 2, 'unnumberedsec', 2, 'heading', 2, 'appendixsec', 2, 'appendixsection', 2, 'subsection', 3, 'unnumberedsubsec', 3, 'subheading', 3, 'appendixsubsec', 3, 'subsubsection', 4, 'unnumberedsubsubsec', 4, 'subsubheading', 4, 'appendixsubsubsec', 4, ); # # accent map, TeX command to ISO name # %accent_map = ( '"', 'uml', '~', 'tilde', '^', 'circ', '`', 'grave', '\'', 'acute', ); # # texinfo "simple things" (@foo) to HTML ones # %simple_map = ( # cf. makeinfo.c "*", "
    ", # HTML+ " ", " ", "\n", "\n", "|", "", # spacing commands ":", "", "!", "!", "?", "?", ".", ".", "-", "", ); # # texinfo "things" (@foo{}) to HTML ones # %things_map = ( 'TeX', 'TeX', 'br', '

    ', # paragraph break 'bullet', '*', 'copyright', '(C)', 'dots', '...', 'equiv', '==', 'error', 'error-->', 'expansion', '==>', 'minus', '-', 'point', '-!-', 'print', '-|', 'result', '=>', 'today', $TODAY, 'aa', 'å', 'AA', 'Å', 'ae', 'æ', 'AE', 'Æ', 'o', 'ø', 'O', 'Ø', 'ss', 'ß', 'exclamdown', '¡', 'questiondown', '¿', 'pounds', '£' ); # # texinfo styles (@foo{bar}) to HTML ones # %style_map = ( 'asis', '', 'b', 'B', 'cite', 'CITE', 'code', 'CODE', 'ctrl', '&do_ctrl', # special case 'dfn', 'EM', # DFN tag is illegal in the standard 'dmn', '', # useless 'email', '&do_email', # insert a clickable email address 'emph', 'EM', 'file', '"TT', # will put quotes, cf. &apply_style 'i', 'I', 'kbd', 'KBD', 'key', 'KBD', 'math', 'EM', 'r', '', # unsupported 'samp', '"SAMP', # will put quotes, cf. &apply_style 'sc', '&do_sc', # special case 'strong', 'STRONG', 't', 'TT', 'titlefont', '', # useless 'uref', '&do_uref', # insert a clickable URL 'url', '&do_url', # insert a clickable URL 'var', 'VAR', 'w', '', # unsupported '"', '&do_diaeresis', '\'', '&do_acuteaccent', # doesn't work?? '\`', '&do_graveaccent', # doesn't work?? '~', '&do_tildeaccent', ',', '&do_cedilla', '^', '&do_circumflex', ); # # texinfo format (@foo/@end foo) to HTML ones # %format_map = ( 'display', 'PRE', 'example', 'PRE', 'format', 'PRE', 'lisp', 'PRE', 'quotation', 'BLOCKQUOTE', 'smallexample', 'PRE', 'smalllisp', 'PRE', # lists 'itemize', 'UL', 'enumerate', 'OL', # poorly supported 'flushleft', 'PRE', 'flushright', 'PRE', ); # # texinfo definition shortcuts to real ones # %def_map = ( # basic commands 'deffn', 0, 'defvr', 0, 'deftypefn', 0, 'deftypevr', 0, 'defcv', 0, 'defop', 0, 'deftp', 0, # basic x commands 'deffnx', 0, 'defvrx', 0, 'deftypefnx', 0, 'deftypevrx', 0, 'defcvx', 0, 'defopx', 0, 'deftpx', 0, # shortcuts 'defun', 'deffn Function', 'defmac', 'deffn Macro', 'defspec', 'deffn {Special Form}', 'defvar', 'defvr Variable', 'defopt', 'defvr {User Option}', 'deftypefun', 'deftypefn Function', 'deftypevar', 'deftypevr Variable', 'defivar', 'defcv {Instance Variable}', 'defmethod', 'defop Method', # x shortcuts 'defunx', 'deffnx Function', 'defmacx', 'deffnx Macro', 'defspecx', 'deffnx {Special Form}', 'defvarx', 'defvrx Variable', 'defoptx', 'defvrx {User Option}', 'deftypefunx', 'deftypefnx Function', 'deftypevarx', 'deftypevrx Variable', 'defivarx', 'defcvx {Instance Variable}', 'defmethodx', 'defopx Method', ); # # things to skip # %to_skip = ( # comments 'c', 1, 'comment', 1, # useless 'contents', 1, 'shortcontents', 1, 'summarycontents', 1, 'footnotestyle', 1, 'end ifclear', 1, 'end ifset', 1, 'titlepage', 1, 'end titlepage', 1, # unsupported commands (formatting) 'afourpaper', 1, 'cropmarks', 1, 'finalout', 1, 'headings', 1, 'need', 1, 'page', 1, 'setchapternewpage', 1, 'everyheading', 1, 'everyfooting', 1, 'evenheading', 1, 'evenfooting', 1, 'oddheading', 1, 'oddfooting', 1, 'smallbook', 1, 'vskip', 1, 'filbreak', 1, 'paragraphindent', 1, # unsupported formats 'cartouche', 1, 'end cartouche', 1, 'group', 1, 'end group', 1, ); #+++############################################################################ # # # Argument parsing, initialisation # # # #---############################################################################ %value = (); # hold texinfo variables, see also -D $use_bibliography = 1; $use_acc = 0; $debug = 0; $doctype = ''; $check = 0; $expandinfo = 0; $expandtex = 0; $use_glossary = 0; $invisible_mark = ''; $use_iso = 0; @include_dirs = (); $show_menu = 0; $number_sections = 0; $split_node = 0; $split_chapter = 0; $monolithic = 0; $verbose = 0; $usage = < 0; ✓ exit; } if (($split_node || $split_chapter) && $monolithic) { warn "Can't use -monolithic with -split, -monolithic ignored.\n"; $monolithic = 0; } if ($expandinfo) { $to_skip{'ifinfo'}++; $to_skip{'end ifinfo'}++; $to_skip{'ifnottex'}++; $to_skip{'end ifnottex'}++; $to_skip{'ifnothtml'}++; $to_skip{'end ifnothtml'}++; } elsif ($expandtex) { $to_skip{'ifnotinfo'}++; $to_skip{'end ifnotinfo'}++; $to_skip{'iftex'}++; $to_skip{'end iftex'}++; $to_skip{'ifnothtml'}++; $to_skip{'end ifnothtml'}++; } else { $to_skip{'ifnotinfo'}++; $to_skip{'end ifnotinfo'}++; $to_skip{'ifnottex'}++; $to_skip{'end ifnottex'}++; $to_skip{'ifhtml'}++; $to_skip{'end ifhtml'}++; } $invisible_mark = '' if $invisible_mark eq 'xbm'; die $usage unless @ARGV == 1; $docu = shift(@ARGV); if ($docu =~ /.*\//) { chop($docu_dir = $&); $docu_name = $'; } else { $docu_dir = '.'; $docu_name = $docu; } unshift(@include_dirs, $docu_dir); $docu_name =~ s/\.te?x(i|info)?$//; # basename of the document $docu_doc = "$docu_name.html"; # document's contents if ($monolithic) { $docu_toc = $docu_foot = $docu_doc; } else { $docu_toc = "${docu_name}_toc.html"; # document's table of contents $docu_foot = "${docu_name}_foot.html"; # document's footnotes } # # variables # $value{'html'} = 1; # predefine html (the output format) $value{'texi2html'} = '1.52b'; # predefine texi2html (the translator) # _foo: internal to track @foo foreach ('_author', '_title', '_subtitle', '_settitle', '_setfilename') { $value{$_} = ''; # prevent -w warnings } %node2sec = (); # node to section name %node2href = (); # node to HREF %bib2href = (); # bibliography reference to HREF %gloss2href = (); # glossary term to HREF @sections = (); # list of sections %tag2pro = (); # protected sections # # initial indexes # $bib_num = 0; $foot_num = 0; $gloss_num = 0; $idx_num = 0; $sec_num = 0; $doc_num = 0; $html_num = 0; # # can I use ISO8879 characters? (HTML+) # if ($use_iso) { $things_map{'bullet'} = "•"; $things_map{'copyright'} = "©"; $things_map{'dots'} = "…"; $things_map{'equiv'} = "≡"; $things_map{'expansion'} = "→"; $things_map{'point'} = "∗"; $things_map{'result'} = "⇒"; } # # read texi2html extensions (if any) # $extensions = 'texi2html.ext'; # extensions in working directory if (-f $extensions) { print "# reading extensions from $extensions\n" if $verbose; require($extensions); } ($progdir = $0) =~ s/[^\/]+$//; if ($progdir && ($progdir ne './')) { $extensions = "${progdir}texi2html.ext"; # extensions in texi2html directory if (-f $extensions) { print "# reading extensions from $extensions\n" if $verbose; require($extensions); } } print "# reading from $docu\n" if $verbose; #+++############################################################################ # # # Pass 1: read source, handle command, variable, simple substitution # # # #---############################################################################ @lines = (); # whole document @toc_lines = (); # table of contents $toplevel = 0; # top level seen in hierarchy $curlevel = 0; # current level in TOC $node = ''; # current node name $in_table = 0; # am I inside a table $table_type = ''; # type of table ('', 'f', 'v', 'multi') @tables = (); # nested table support $in_bibliography = 0; # am I inside a bibliography $in_glossary = 0; # am I inside a glossary $in_top = 0; # am I inside the top node $in_pre = 0; # am I inside a preformatted section $in_list = 0; # am I inside a list $in_html = 0; # am I inside an HTML section $first_line = 1; # is it the first line $dont_html = 0; # don't protect HTML on this line $split_num = 0; # split index $deferred_ref = ''; # deferred reference for indexes @html_stack = (); # HTML elements stack $html_element = ''; # current HTML element &html_reset; # build code for simple substitutions # the maps used (%simple_map and %things_map) MUST be aware of this # watch out for regexps, / and escaped characters! $subst_code = ''; foreach (keys(%simple_map)) { ($re = $_) =~ s/(\W)/\\$1/g; # protect regexp chars $subst_code .= "s/\\\@$re/$simple_map{$_}/g;\n"; } foreach (keys(%things_map)) { $subst_code .= "s/\\\@$_\\{\\}/$things_map{$_}/g;\n"; } if ($use_acc) { # accentuated characters foreach (keys(%accent_map)) { if ($_ eq "`") { $subst_code .= "s/$;3"; } elsif ($_ eq "'") { $subst_code .= "s/$;4"; } else { $subst_code .= "s/\\\@\\$_"; } $subst_code .= "([aeiou])/&\${1}$accent_map{$_};/gi;\n"; } } eval("sub simple_substitutions { $subst_code }"); &init_input; while ($_ = &next_line) { # # remove \input on the first lines only # if ($first_line) { next if /^\\input/; $first_line = 0; } # # parse texinfo tags # $tag = ''; $end_tag = ''; if (/^\@end\s+(\w+)\b/) { $end_tag = $1; } elsif (/^\@(\w+)\b/) { $tag = $1; } # # handle @ifhtml / @end ifhtml # if ($in_html) { if ($end_tag eq 'ifhtml') { $in_html = 0; } else { $tag2pro{$in_html} .= $_; } next; } elsif ($tag eq 'ifhtml') { $in_html = $PROTECTTAG . ++$html_num; push(@lines, $in_html); next; } # # try to skip the line # if ($end_tag) { next if $to_skip{"end $end_tag"}; } elsif ($tag) { next if $to_skip{$tag}; last if $tag eq 'bye'; } if ($in_top) { # parsing the top node if ($tag eq 'node' || $tag eq 'include' || $sec2level{$tag}) { # no more in top $in_top = 0; } else { # skip it next; } } # # try to remove inlined comments # syntax from tex-mode.el comment-start-skip # s/((^|[^\@])(\@\@)*)\@c(omment)? .*/$1/; # non-@ substitutions cf. texinfmt.el unless ($in_pre) { s/``/“/g; s/''/”/g; s/([\w ])---([\w ])/$1--$2/g; } # # analyze the tag # if ($tag) { # skip lines &skip_until($tag), next if $tag eq 'ignore'; if ($expandinfo) { &skip_until($tag), next if $tag eq 'ifnotinfo'; &skip_until($tag), next if $tag eq 'iftex'; &skip_until($tag), next if $tag eq 'ifhtml'; } elsif ($expandtex) { &skip_until($tag), next if $tag eq 'ifinfo'; &skip_until($tag), next if $tag eq 'ifnottex'; &skip_until($tag), next if $tag eq 'ifhtml'; } else { &skip_until($tag), next if $tag eq 'ifinfo'; &skip_until($tag), next if $tag eq 'iftex'; &skip_until($tag), next if $tag eq 'ifnothtml'; } &skip_until($tag), next if $tag eq 'tex'; # handle special tables if ($tag =~ /^(|f|v|multi)table$/) { $table_type = $1; $tag = 'table'; } # special cases if ($tag eq 'top' || ($tag eq 'node' && /^\@node\s+top\s*,/i)) { $in_top = 1; @lines = (); # ignore all lines before top (title page garbage) next; } elsif ($tag eq 'node') { $in_top = 0; warn "$ERROR Bad node line: $_" unless $_ =~ /^\@node\s$NODESRE$/o; $_ = &protect_html($_); # if node contains '&' for instance s/^\@node\s+//; ($node) = split(/,/); &normalise_node($node); if ($split_node) { &next_doc; push(@lines, $SPLITTAG) if $split_num++; push(@sections, $node); } next; } elsif ($tag eq 'include') { if (/^\@include\s+($FILERE)\s*$/o) { $file = $1; unless (-e $file) { foreach $dir (@include_dirs) { $file = "$dir/$1"; last if -e $file; } } if (-e $file) { &open($file); print "# including $file\n" if $verbose; } else { warn "$ERROR Can't find $file, skipping"; } } else { warn "$ERROR Bad include line: $_"; } next; } elsif ($tag eq 'ifclear') { if (/^\@ifclear\s+($VARRE)\s*$/o) { next unless defined($value{$1}); &skip_until($tag); } else { warn "$ERROR Bad ifclear line: $_"; } next; } elsif ($tag eq 'ifset') { if (/^\@ifset\s+($VARRE)\s*$/o) { next if defined($value{$1}); &skip_until($tag); } else { warn "$ERROR Bad ifset line: $_"; } next; } elsif ($tag eq 'menu') { unless ($show_menu) { &skip_until($tag); next; } &html_push_if($tag); push(@lines, &html_debug("\n", __LINE__)); } elsif ($format_map{$tag}) { $in_pre = 1 if $format_map{$tag} eq 'PRE'; &html_push_if($format_map{$tag}); push(@lines, &html_debug("\n", __LINE__)); $in_list++ if $format_map{$tag} eq 'UL' || $format_map{$tag} eq 'OL' ; push(@lines, &debug("<$format_map{$tag}>\n", __LINE__)); next; } elsif ($tag eq 'table') { if (/^\@(|f|v|multi)table\s+\@(\w+)/) { $in_table = $2; unshift(@tables, join($;, $table_type, $in_table)); if ($table_type eq "multi") { push(@lines, &debug("\n", __LINE__)); &html_push_if('TABLE'); } else { push(@lines, &debug("
    \n", __LINE__)); &html_push_if('DL'); } push(@lines, &html_debug("\n", __LINE__)); } else { warn "$ERROR Bad table line: $_"; } next; } elsif ($tag eq 'synindex' || $tag eq 'syncodeindex') { if (/^\@$tag\s+(\w)\w\s+(\w)\w\s*$/) { eval("*${1}index = *${2}index"); } else { warn "$ERROR Bad syn*index line: $_"; } next; } elsif ($tag eq 'sp') { push(@lines, &debug("

    \n", __LINE__)); next; } elsif ($tag eq 'setref') { &protect_html; # if setref contains '&' for instance if (/^\@$tag\s*{($NODERE)}\s*$/) { $setref = $1; $setref =~ s/\s+/ /g; # normalize $setref =~ s/ $//; $node2sec{$setref} = $name; $node2href{$setref} = "$docu_doc#$docid"; } else { warn "$ERROR Bad setref line: $_"; } next; } elsif ($tag eq 'defindex' || $tag eq 'defcodeindex') { if (/^\@$tag\s+(\w\w)\s*$/) { $valid_index{$1} = 1; } else { warn "$ERROR Bad defindex line: $_"; } next; } elsif (defined($def_map{$tag})) { if ($def_map{$tag}) { s/^\@$tag\s+//; $tag = $def_map{$tag}; $_ = "\@$tag $_"; $tag =~ s/\s.*//; } } elsif (defined($user_sub{$tag})) { s/^\@$tag\s+//; $sub = $user_sub{$tag}; print "# user $tag = $sub, arg: $_" if $debug & $DEBUG_USER; if (defined(&$sub)) { chop($_); &$sub($_); } else { warn "$ERROR Bad user sub for $tag: $sub\n"; } next; } if (defined($def_map{$tag})) { s/^\@$tag\s+//; if ($tag =~ /x$/) { # extra definition line $tag = $`; $is_extra = 1; } else { $is_extra = 0; } while (/\{([^\{\}]*)\}/) { # this is a {} construct ($before, $contents, $after) = ($`, $1, $'); # protect spaces $contents =~ s/\s+/$;9/g; # restore $_ protecting {} $_ = "$before$;7$contents$;8$after"; } @args = split(/\s+/, &protect_html($_)); foreach (@args) { s/$;9/ /g; # unprotect spaces s/$;7/\{/g; # ... { s/$;8/\}/g; # ... } } $type = shift(@args); $type =~ s/^\{(.*)\}$/$1/; print "# def ($tag): {$type} ", join(', ', @args), "\n" if $debug & $DEBUG_DEF; $type .= ':'; # it's nicer like this $name = shift(@args); $name =~ s/^\{(.*)\}$/$1/; if ($is_extra) { $_ = &debug("

    ", __LINE__); } else { $_ = &debug("
    \n
    ", __LINE__); } if ($tag eq 'deffn' || $tag eq 'defvr' || $tag eq 'deftp') { $_ .= "$type $name"; $_ .= " @args" if @args; } elsif ($tag eq 'deftypefn' || $tag eq 'deftypevr' || $tag eq 'defcv' || $tag eq 'defop') { $ftype = $name; $name = shift(@args); $name =~ s/^\{(.*)\}$/$1/; $_ .= "$type $ftype $name"; $_ .= " @args" if @args; } else { warn "$ERROR Unknown definition type: $tag\n"; $_ .= "$type $name"; $_ .= " @args" if @args; } $_ .= &debug("\n
    ", __LINE__); $name = &unprotect_html($name); if ($tag eq 'deffn' || $tag eq 'deftypefn') { unshift(@input_spool, "\@findex $name\n"); } elsif ($tag eq 'defop') { unshift(@input_spool, "\@findex $name on $ftype\n"); } elsif ($tag eq 'defvr' || $tag eq 'deftypevr' || $tag eq 'defcv') { unshift(@input_spool, "\@vindex $name\n"); } else { unshift(@input_spool, "\@tindex $name\n"); } $dont_html = 1; } } elsif ($end_tag) { if ($format_map{$end_tag}) { $in_pre = 0 if $format_map{$end_tag} eq 'PRE'; $in_list-- if $format_map{$end_tag} eq 'UL' || $format_map{$end_tag} eq 'OL' ; &html_pop_if('LI', 'P'); &html_pop_if(); push(@lines, &debug("\n", __LINE__)); push(@lines, &html_debug("\n", __LINE__)); } elsif ($end_tag =~ /^(|f|v|multi)table$/) { unless (@tables) { warn "$ERROR \@end $end_tag without \@*table\n"; next; } ($table_type, $in_table) = split($;, shift(@tables)); unless ($1 eq $table_type) { warn "$ERROR \@end $end_tag without matching \@$end_tag\n"; next; } if ($table_type eq "multi") { push(@lines, "
    \n"); &html_pop_if('TR'); } else { push(@lines, "\n"); &html_pop_if('DD'); } &html_pop_if(); if (@tables) { ($table_type, $in_table) = split($;, $tables[0]); } else { $in_table = 0; } } elsif (defined($def_map{$end_tag})) { push(@lines, &debug("\n", __LINE__)); } elsif ($end_tag eq 'menu') { &html_pop_if(); push(@lines, $_); # must keep it for pass 2 } next; } # # misc things # # protect texi and HTML things &protect_texi; $_ = &protect_html($_) unless $dont_html; $dont_html = 0; # substitution (unsupported things) s/^\@center\s+//g; s/^\@exdent\s+//g; s/\@noindent\s+//g; s/\@refill\s+//g; # other substitutions &simple_substitutions; s/\@value\{($VARRE)\}/$value{$1}/eg; s/\@footnote\{/\@footnote$docu_doc\{/g; # mark footnotes, cf. pass 4 # # analyze the tag again # if ($tag) { if (defined($sec2level{$tag}) && $sec2level{$tag} > 0) { if (/^\@$tag\s+(.+)$/) { $name = $1; $name =~ s/\s+$//; $level = $sec2level{$tag}; $name = &update_sec_num($tag, $level) . " $name" if $number_sections && $tag !~ /^unnumbered/; if ($tag =~ /heading$/) { push(@lines, &html_debug("\n", __LINE__)); if ($html_element ne 'body') { # We are in a nice pickle here. We are trying to get a H? heading # even though we are not in the body level. So, we convert it to a # nice, bold, line by itself. $_ = &debug("\n\n

    $name

    \n\n", __LINE__); } else { $_ = &debug("$name\n", __LINE__); &html_push_if('body'); } print "# heading, section $name, level $level\n" if $debug & $DEBUG_TOC; } else { if ($split_chapter) { unless ($toplevel) { # first time we see a "section" unless ($level == 1) { warn "$ERROR The first section found is not of level 1: $_"; warn "$ERROR I'll split on sections of level $level...\n"; } $toplevel = $level; } if ($level == $toplevel) { &next_doc; push(@lines, $SPLITTAG) if $split_num++; push(@sections, $name); } } $sec_num++; $docid = "SEC$sec_num"; $tocid = "TOC$sec_num"; # check biblio and glossary $in_bibliography = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*bibliography$/i); $in_glossary = ($name =~ /^([A-Z]|\d+)?(\.\d+)*\s*glossary$/i); # check node if ($node) { if ($node2sec{$node}) { warn "$ERROR Duplicate node found: $node\n"; } else { $node2sec{$node} = $name; $node2href{$node} = "$docu_doc#$docid"; print "# node $node, section $name, level $level\n" if $debug & $DEBUG_TOC; } $node = ''; } else { print "# no node, section $name, level $level\n" if $debug & $DEBUG_TOC; } # update TOC while ($level > $curlevel) { $curlevel++; push(@toc_lines, "
      \n"); } while ($level < $curlevel) { $curlevel--; push(@toc_lines, "
    \n"); } $_ = "
  • " . &anchor($tocid, "$docu_doc#$docid", $name, 1); push(@toc_lines, &substitute_style($_)); # update DOC push(@lines, &html_debug("\n", __LINE__)); &html_reset; $_ = "".&anchor($docid, "$docu_toc#$tocid", $name)."\n"; $_ = &debug($_, __LINE__); push(@lines, &html_debug("\n", __LINE__)); } # update DOC foreach $line (split(/\n+/, $_)) { push(@lines, "$line\n"); } next; } else { warn "$ERROR Bad section line: $_"; } } else { # track variables $value{$1} = $2, next if /^\@set\s+($VARRE)\s+(.*)$/o; delete $value{$1}, next if /^\@clear\s+($VARRE)\s*$/o; # store things $value{'_setfilename'} = $1, next if /^\@setfilename\s+(.*)$/; $value{'_settitle'} = $1, next if /^\@settitle\s+(.*)$/; $value{'_author'} .= "$1\n", next if /^\@author\s+(.*)$/; $value{'_subtitle'} .= "$1\n", next if /^\@subtitle\s+(.*)$/; $value{'_title'} .= "$1\n", next if /^\@title\s+(.*)$/; # index if (/^\@(..?)index\s+/) { unless ($valid_index{$1}) { warn "$ERROR Undefined index command: $_"; next; } $id = 'IDX' . ++$idx_num; $index = $1 . 'index'; $what = &substitute_style($'); $what =~ s/\s+$//; print "# found $index for '$what' id $id\n" if $debug & $DEBUG_INDEX; eval(<\n", __LINE__)); push(@lines, &anchor($id, '', $invisible_mark, !$in_pre)); &html_push('P'); } elsif ($html_element eq 'DL' || $html_element eq 'UL' || $html_element eq 'OL' ) { $deferred_ref .= &anchor($id, '', $invisible_mark, !$in_pre) . " "; } next; } # list item if (/^\@itemx?\s+/) { $what = $'; $what =~ s/\s+$//; if ($in_bibliography && $use_bibliography) { if ($what =~ /^$BIBRE$/o) { $id = 'BIB' . ++$bib_num; $bib2href{$what} = "$docu_doc#$id"; print "# found bibliography for '$what' id $id\n" if $debug & $DEBUG_BIB; $what = &anchor($id, '', $what); } } elsif ($in_glossary && $use_glossary) { $id = 'GLOSS' . ++$gloss_num; $entry = $what; $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; $gloss2href{$entry} = "$docu_doc#$id"; print "# found glossary for '$entry' id $id\n" if $debug & $DEBUG_GLOSS; $what = &anchor($id, '', $what); } &html_pop_if('P'); if ($html_element eq 'DL' || $html_element eq 'DD') { if ($things_map{$in_table} && !$what) { # special case to allow @table @bullet for instance push(@lines, &debug("
    $things_map{$in_table}\n", __LINE__)); } else { push(@lines, &debug("
    \@$in_table\{$what\}\n", __LINE__)); } push(@lines, "
    "); &html_push('DD') unless $html_element eq 'DD'; if ($table_type) { # add also an index unshift(@input_spool, "\@${table_type}index $what\n"); } } elsif ($html_element eq 'TABLE') { push(@lines, &debug("$what\n", __LINE__)); &html_push('TR'); } elsif ($html_element eq 'TR') { push(@lines, &debug("\n", __LINE__)); push(@lines, &debug("$what\n", __LINE__)); } else { push(@lines, &debug("
  • $what\n", __LINE__)); &html_push('LI') unless $html_element eq 'LI'; } push(@lines, &html_debug("\n", __LINE__)); if ($deferred_ref) { push(@lines, &debug("$deferred_ref\n", __LINE__)); $deferred_ref = ''; } next; } elsif (/^\@tab\s+(.*)$/) { push(@lines, "$1\n"); next; } } } # paragraph separator if ($_ eq "\n") { next if $#lines >= 0 && $lines[$#lines] eq "\n"; if ($html_element eq 'P') { push(@lines, "\n"); $_ = &debug("

    \n", __LINE__); &html_pop; } } elsif ($html_element eq 'body' || $html_element eq 'BLOCKQUOTE') { push(@lines, "

    \n"); &html_push('P'); $_ = &debug($_, __LINE__); } # otherwise push(@lines, $_); } # finish TOC $level = 0; while ($level < $curlevel) { $curlevel--; push(@toc_lines, "\n"); } print "# end of pass 1\n" if $verbose; #+++############################################################################ # # # Pass 2/3: handle style, menu, index, cross-reference # # # #---############################################################################ @lines2 = (); # whole document (2nd pass) @lines3 = (); # whole document (3rd pass) $in_menu = 0; # am I inside a menu while (@lines) { $_ = shift(@lines); # # special case (protected sections) # if (/^$PROTECTTAG/o) { push(@lines2, $_); next; } # # menu # $in_menu = 1, push(@lines2, &debug("

      \n", __LINE__)), next if /^\@menu\b/; $in_menu = 0, push(@lines2, &debug("
    \n", __LINE__)), next if /^\@end\s+menu\b/; if ($in_menu) { if (/^\*\s+($NODERE)::/o) { $descr = $'; chop($descr); &menu_entry($1, $1, $descr); } elsif (/^\*\s+(.+):\s+([^\t,\.\n]+)[\t,\.\n]/) { $descr = $'; chop($descr); &menu_entry($1, $2, $descr); } elsif (/^\*/) { warn "$ERROR Bad menu line: $_"; } else { # description continued? push(@lines2, $_); } next; } # # printindex # if (/^\@printindex\s+(\w\w)\b/) { local($index, *ary, @keys, $key, $letter, $last_letter, @refs); if ($predefined_index{$1}) { $index = $predefined_index{$1} . 'index'; } else { $index = $1 . 'index'; } eval("*ary = *$index"); @keys = keys(%ary); foreach $key (@keys) { $_ = $key; 1 while s/<(\w+)>\`(.*)\´<\/\1>/$2/; # remove HTML tags with quotes 1 while s/<(\w+)>(.*)<\/\1>/$2/; # remove HTML tags $_ = &unprotect_html($_); &unprotect_texi; tr/A-Z/a-z/; # lowercase $key2alpha{$key} = $_; print "# index $key sorted as $_\n" if $key ne $_ && $debug & $DEBUG_INDEX; } push(@lines2, "Jump to:\n"); $last_letter = undef; foreach $key (sort byalpha @keys) { $letter = substr($key2alpha{$key}, 0, 1); $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;; if (!defined($last_letter) || $letter ne $last_letter) { push(@lines2, "-\n") if defined($last_letter); push(@lines2, "" . &protect_html($letter) . "\n"); $last_letter = $letter; } } push(@lines2, "

    \n"); $last_letter = undef; foreach $key (sort byalpha @keys) { $letter = substr($key2alpha{$key}, 0, 1); $letter = substr($key2alpha{$key}, 0, 2) if $letter eq $;; if (!defined($last_letter) || $letter ne $last_letter) { push(@lines2, "\n") if defined($last_letter); push(@lines2, "

    " . &protect_html($letter) . "

    \n"); push(@lines2, "\n"); $last_letter = $letter; } @refs = (); foreach (split(/$;/, $ary{$key})) { push(@refs, &anchor('', $_, $key, 0)); } push(@lines2, "
  • " . join(", ", @refs) . "\n"); } push(@lines2, "
  • \n") if defined($last_letter); next; } # # simple style substitutions # $_ = &substitute_style($_); # # xref # while (/\@(x|px|info|)ref\{($XREFRE)(\}?)/o) { # note: Texinfo may accept other characters ($type, $nodes, $full) = ($1, $2, $3); ($before, $after) = ($`, $'); if (! $full && $after) { warn "$ERROR Bad xref (no ending } on line): $_"; $_ = "$before$;0${type}ref\{$nodes$after"; next; # while xref } if ($type eq 'x') { $type = 'See '; } elsif ($type eq 'px') { $type = 'see '; } elsif ($type eq 'info') { $type = 'See Info'; } else { $type = ''; } unless ($full) { $next = shift(@lines); $next = &substitute_style($next); chop($nodes); # remove final newline if ($next =~ /\}/) { # split on 2 lines $nodes .= " $`"; $after = $'; } else { $nodes .= " $next"; $next = shift(@lines); $next = &substitute_style($next); chop($nodes); if ($next =~ /\}/) { # split on 3 lines $nodes .= " $`"; $after = $'; } else { warn "$ERROR Bad xref (no ending }): $_"; $_ = "$before$;0xref\{$nodes$after"; unshift(@lines, $next); next; # while xref } } } $nodes =~ s/\s+/ /g; # remove useless spaces @args = split(/\s*,\s*/, $nodes); $node = $args[0]; # the node is always the first arg &normalise_node($node); $sec = $node2sec{$node}; if (@args == 5) { # reference to another manual $sec = $args[2] || $node; $man = $args[4] || $args[3]; $_ = "${before}${type}section ‘$sec’ in \@cite{$man}$after"; } elsif ($type =~ /Info/) { # inforef warn "$ERROR Wrong number of arguments: $_" unless @args == 3; ($nn, $_, $in) = @args; $_ = "${before}${type} file ‘$in’, node ‘$nn’$after"; } elsif ($sec) { $href = $node2href{$node}; $_ = "${before}${type}section " . &anchor('', $href, $sec) . $after; } else { warn "$ERROR Undefined node ($node): $_"; $_ = "$before$;0xref{$nodes}$after"; } } # # try to guess bibliography references or glossary terms # unless (/^/) { $done .= $pre . &anchor('', $href, $what); } else { $done .= "$pre$what"; } $_ = $post; } $_ = $done . $_; } if ($use_glossary) { $done = ''; while (/\b\w+\b/) { ($pre, $what, $post) = ($`, $&, $'); $entry = $what; $entry =~ tr/A-Z/a-z/ unless $entry =~ /^[A-Z\s]+$/; $href = $gloss2href{$entry}; if (defined($href) && $post !~ /^[^<]*<\/A>/) { $done .= $pre . &anchor('', $href, $what); } else { $done .= "$pre$what"; } $_ = $post; } $_ = $done . $_; } } # otherwise push(@lines2, $_); } print "# end of pass 2\n" if $verbose; # # split style substitutions # while (@lines2) { $_ = shift(@lines2); # # special case (protected sections) # if (/^$PROTECTTAG/o) { push(@lines3, $_); next; } # # split style substitutions # $old = ''; while ($old ne $_) { $old = $_; if (/\@(\w+|"|\~|,|\^)\{/) { ($before, $style, $after) = ($`, $1, $'); if (defined($style_map{$style})) { $_ = $after; $text = ''; $after = ''; $failed = 1; while (@lines2) { if (/\}/) { $text .= $`; $after = $'; $failed = 0; last; } else { $text .= $_; $_ = shift(@lines2); } } if ($failed) { die "* Bad syntax (\@$style) after: $before\n"; } else { $text = &apply_style($style, $text); $_ = "$before$text$after"; } } } } # otherwise push(@lines3, $_); } print "# end of pass 3\n" if $verbose; #+++############################################################################ # # # Pass 4: foot notes, final cleanup # # # #---############################################################################ @foot_lines = (); # footnotes @doc_lines = (); # final document $end_of_para = 0; # true if last line is

    while (@lines3) { $_ = shift(@lines3); # # special case (protected sections) # if (/^$PROTECTTAG/o) { push(@doc_lines, $_); $end_of_para = 0; next; } # # footnotes # while (/\@footnote([^\{\s]+)\{/) { ($before, $d, $after) = ($`, $1, $'); $_ = $after; $text = ''; $after = ''; $failed = 1; while (@lines3) { if (/\}/) { $text .= $`; $after = $'; $failed = 0; last; } else { $text .= $_; $_ = shift(@lines3); } } if ($failed) { die "* Bad syntax (\@footnote) after: $before\n"; } else { $foot_num++; $docid = "DOCF$foot_num"; $footid = "FOOT$foot_num"; $foot = "($foot_num)"; push(@foot_lines, "

    " . &anchor($footid, "$d#$docid", $foot) . "

    \n"); $text = "

    $text" unless $text =~ /^\s*

    /; push(@foot_lines, "$text\n"); $_ = $before . &anchor($docid, "$docu_foot#$footid", $foot) . $after; } } # # remove unnecessary

    # if (/^\s*

    \s*$/) { next if $end_of_para++; } else { $end_of_para = 0; } # otherwise push(@doc_lines, $_); } print "# end of pass 4\n" if $verbose; #+++############################################################################ # # # Pass 5: print things # # # #---############################################################################ $header = < EOT $full_title = $value{'_title'} || $value{'_settitle'} || "Untitled Document"; $title = $value{'_settitle'} || $full_title; $_ = &substitute_style($full_title); &unprotect_texi; s/\n$//; # rmv last \n (if any) $full_title = "

    " . join("

    \n

    ", split(/\n/, $_)) . "

    \n"; # # print ToC # if (!$monolithic && @toc_lines) { if (open(FILE, "> $docu_toc")) { print "# creating $docu_toc...\n" if $verbose; &print_toplevel_header("$title - Table of Contents"); &print_ruler; &print(*toc_lines, FILE); &print_toplevel_footer; close(FILE); } else { warn "$ERROR Can't write to $docu_toc: $!\n"; } } # # print footnotes # if (!$monolithic && @foot_lines) { if (open(FILE, "> $docu_foot")) { print "# creating $docu_foot...\n" if $verbose; &print_toplevel_header("$title - Footnotes"); &print_ruler; &print(*foot_lines, FILE); &print_toplevel_footer; close(FILE); } else { warn "$ERROR Can't write to $docu_foot: $!\n"; } } # # print document # if ($split_chapter || $split_node) { # split $doc_num = 0; $last_num = scalar(@sections); $first_doc = &doc_name(1); $last_doc = &doc_name($last_num); while (@sections) { $section = shift(@sections); &next_doc; if (open(FILE, "> $docu_doc")) { print "# creating $docu_doc...\n" if $verbose; &print_header("$title - $section"); $prev_doc = ($doc_num == 1 ? undef : &doc_name($doc_num - 1)); $next_doc = ($doc_num == $last_num ? undef : &doc_name($doc_num + 1)); $navigation = "Go to the "; $navigation .= ($prev_doc ? &anchor('', $first_doc, "first") : "first"); $navigation .= ", "; $navigation .= ($prev_doc ? &anchor('', $prev_doc, "previous") : "previous"); $navigation .= ", "; $navigation .= ($next_doc ? &anchor('', $next_doc, "next") : "next"); $navigation .= ", "; $navigation .= ($next_doc ? &anchor('', $last_doc, "last") : "last"); $navigation .= " section, " . &anchor('', $docu_toc, "table of contents") . ".\n"; print FILE $navigation; &print_ruler; # find corresponding lines @tmp_lines = (); while (@doc_lines) { $_ = shift(@doc_lines); last if ($_ eq $SPLITTAG); push(@tmp_lines, $_); } &print(*tmp_lines, FILE); &print_ruler; print FILE $navigation; &print_footer; close(FILE); } else { warn "$ERROR Can't write to $docu_doc: $!\n"; } } } else { # not split if (open(FILE, "> $docu_doc")) { print "# creating $docu_doc...\n" if $verbose; if ($monolithic || !@toc_lines) { &print_toplevel_header($title); } else { &print_header($title); print FILE $full_title; } if ($monolithic && @toc_lines) { &print_ruler; print FILE "

    Table of Contents

    \n"; &print(*toc_lines, FILE); } &print_ruler; &print(*doc_lines, FILE); if ($monolithic && @foot_lines) { &print_ruler; print FILE "

    Footnotes

    \n"; &print(*foot_lines, FILE); } if ($monolithic || !@toc_lines) { &print_toplevel_footer; } else { &print_footer; } close(FILE); } else { warn "$ERROR Can't write to $docu_doc: $!\n"; } } print "# that's all folks\n" if $verbose; #+++############################################################################ # # # Low level functions # # # #---############################################################################ sub update_sec_num { local($name, $level) = @_; $level--; # here we start at 0 if ($name =~ /^appendix/) { # appendix style if (@appendix_sec_num) { &incr_sec_num($level, @appendix_sec_num); } else { @appendix_sec_num = ('A', 0, 0, 0); } return(join('.', @appendix_sec_num[0..$level])); } else { # normal style if (@normal_sec_num) { &incr_sec_num($level, @normal_sec_num); } else { @normal_sec_num = (1, 0, 0, 0); } return(join('.', @normal_sec_num[0..$level])); } } sub incr_sec_num { local($level, $l); $level = shift(@_); $_[$level]++; foreach $l ($level+1 .. 3) { $_[$l] = 0; } } sub check { local($_, %seen, %context, $before, $match, $after); while (<>) { if (/\@(\*|\.|\:|\@|\{|\})/) { $seen{$&}++; $context{$&} .= "> $_" if $verbose; $_ = "$`XX$'"; redo; } if (/\@(\w+)/) { ($before, $match, $after) = ($`, $&, $'); if ($before =~ /\b[\w-]+$/ && $after =~ /^[\w-.]*\b/) { # e-mail address $seen{'e-mail address'}++; $context{'e-mail address'} .= "> $_" if $verbose; } else { $seen{$match}++; $context{$match} .= "> $_" if $verbose; } $match =~ s/^\@/X/; $_ = "$before$match$after"; redo; } } foreach (sort(keys(%seen))) { if ($verbose) { print "$_\n"; print $context{$_}; } else { print "$_ ($seen{$_})\n"; } } } sub open { local($name) = @_; ++$fh_name; if (open($fh_name, $name)) { unshift(@fhs, $fh_name); } else { warn "$ERROR Can't read file $name: $!\n"; } } sub init_input { @fhs = (); # hold the file handles to read @input_spool = (); # spooled lines to read $fh_name = 'FH000'; &open($docu); } sub next_line { local($fh, $line); if (@input_spool) { $line = shift(@input_spool); return($line); } while (@fhs) { $fh = $fhs[0]; $line = <$fh>; return($line) if $line; close($fh); shift(@fhs); } return(undef); } # used in pass 1, use &next_line sub skip_until { local($tag) = @_; local($_); while ($_ = &next_line) { return if /^\@end\s+$tag\s*$/; } die "* Failed to find '$tag' after: " . $lines[$#lines]; } # # HTML stacking to have a better HTML output # sub html_reset { @html_stack = ('html'); $html_element = 'body'; } sub html_push { local($what) = @_; push(@html_stack, $html_element); $html_element = $what; } sub html_push_if { local($what) = @_; push(@html_stack, $html_element) if ($html_element && $html_element ne 'P'); $html_element = $what; } sub html_pop { $html_element = pop(@html_stack); } sub html_pop_if { local($elt); if (@_) { foreach $elt (@_) { if ($elt eq $html_element) { $html_element = pop(@html_stack) if @html_stack; last; } } } else { $html_element = pop(@html_stack) if @html_stack; } } sub html_debug { local($what, $line) = @_; return("$what") if $debug & $DEBUG_HTML; return($what); } # to debug the output... sub debug { local($what, $line) = @_; return("$what") if $debug & $DEBUG_HTML; return($what); } sub normalise_node { $_[0] =~ s/\s+/ /g; $_[0] =~ s/ $//; $_[0] =~ s/^ //; } sub menu_entry { local($entry, $node, $descr) = @_; local($href); &normalise_node($node); $href = $node2href{$node}; if ($href) { $descr =~ s/^\s+//; $descr = ": $descr" if $descr; push(@lines2, "
  • " . &anchor('', $href, $entry) . "$descr\n"); } else { warn "$ERROR Undefined node ($node): $_"; } } sub do_ctrl { "^$_[0]" } sub do_email { local($addr, $text) = split(/,\s*/, $_[0]); $text = $addr unless $text; &anchor('', "mailto:$addr", $text); } sub do_sc { "\U$_[0]\E" } sub do_uref { local($url, $text) = split(/,\s*/, $_[0]); $text = $url unless $text; &anchor('', $url, $text); } sub do_url { &anchor('', $_[0], $_[0]) } sub do_diaeresis { return "&$_[0]uml;"; } sub do_acuteaccent { return "&$_[0]acute;"; } sub do_graveaccent { return "&$_[0]grave;"; } sub do_tildeaccent { return "&$_[0]tilde;"; } sub do_cedilla { return "&$_[0]cedil;"; } sub do_circumflex { return "&$_[0]circ;"; } sub apply_style { local($texi_style, $text) = @_; local($style); $style = $style_map{$texi_style}; if (defined($style)) { # known style if ($style =~ /^\"/) { # add quotes $style = $'; $text = "\‘$text\’"; } if ($style =~ /^\&/) { # custom $style = $'; $text = &$style($text); } elsif ($style) { # good style $text = "<$style>$text"; } else { # no style } } else { # unknown style $text = undef; } return($text); } # remove Texinfo styles sub remove_style { local($_) = @_; s/\@\w+{([^\{\}]+)}/$1/g; return($_); } sub substitute_style { local($_) = @_; local($changed, $done, $style, $text); $changed = 1; while ($changed) { $changed = 0; $done = ''; while (/\@(\w+|"|\~|,|\^)\{([^\{\}]+)\}/) { $text = &apply_style($1, $2); if ($text) { $_ = "$`$text$'"; $changed = 1; } else { $done .= "$`\@$1"; $_ = "{$2}$'"; } } $_ = $done . $_; } return($_); } sub anchor { local($name, $href, $text, $newline) = @_; local($result); $result = "

    \n"; } sub print_header { local($_); # clean the title $_ = &remove_style($_[0]); &unprotect_texi; # print the header if ($doctype eq 'html2') { print FILE $html2_doctype; } elsif ($doctype) { print FILE $doctype; } print FILE < $header $_ EOT } sub print_toplevel_header { local($_); &print_header; # pass given arg... print FILE $full_title; if ($value{'_subtitle'}) { $value{'_subtitle'} =~ s/\n+$//; foreach (split(/\n/, $value{'_subtitle'})) { $_ = &substitute_style($_); &unprotect_texi; print FILE "

    $_

    \n"; } } if ($value{'_author'}) { $value{'_author'} =~ s/\n+$//; foreach (split(/\n/, $value{'_author'})) { $_ = &substitute_style($_); &unprotect_texi; s/[\w.-]+\@[\w.-]+/
    $&<\/A>/g; print FILE "
    $_
    \n"; } } print FILE "

    \n"; } sub print_footer { print FILE < EOT } sub print_toplevel_footer { &print_ruler; print FILE <texi2html translator version 1.52b.

    EOT &print_footer; } sub protect_texi { # protect @ { } ` ' s/\@\@/$;0/go; s/\@\{/$;1/go; s/\@\}/$;2/go; s/\@\`/$;3/go; s/\@\'/$;4/go; } sub protect_html { local($what) = @_; # protect & < > $what =~ s/\&/\&\#38;/g; $what =~ s/\/\&\#62;/g; # but recognize some HTML things $what =~ s/\&\#60;\/A\&\#62;/<\/A>/g; # $what =~ s/\&\#60;A ([^\&]+)\&\#62;//g; # $what =~ s/\&\#60;IMG ([^\&]+)\&\#62;//g; # return($what); } sub unprotect_texi { s/$;0/\@/go; s/$;1/\{/go; s/$;2/\}/go; s/$;3/\`/go; s/$;4/\'/go; } sub unprotect_html { local($what) = @_; $what =~ s/\&\#38;/\&/g; $what =~ s/\&\#60;/\/g; return($what); } sub byalpha { $key2alpha{$a} cmp $key2alpha{$b}; } ############################################################################## # These next few lines are legal in both Perl and nroff. .00 ; # finish .ig 'di \" finish diversion--previous line must be blank .nr nl 0-1 \" fake up transition to first page again .nr % 0 \" start at page 1 '; __END__ ############# From here on it's a standard manual page ############ .TH TEXI2HTML 1 "01/05/98" .AT 3 .SH NAME texi2html \- a Texinfo to HTML converter .SH SYNOPSIS .B texi2html [options] file .PP .B texi2html -check [-verbose] files .SH DESCRIPTION .I Texi2html converts the given Texinfo file to a set of HTML files. It tries to handle most of the Texinfo commands. It creates hypertext links for cross-references, footnotes... .PP It also tries to add links from a reference to its corresponding entry in the bibliography (if any). It may also handle a glossary (see the .B \-glossary option). .PP .I Texi2html creates several files depending on the contents of the Texinfo file and on the chosen options (see FILES). .PP The HTML files created by .I texi2html are closer to TeX than to Info, that's why .I texi2html converts @ifhtml sections and not @ifinfo or @iftex ones by default. You can change this with the \-expandinfo or \-expandtex options. .SH OPTIONS .TP 12 .B \-check Check the given file and give the list of all things that may be Texinfo commands. This may be used to check the output of .I texi2html to find the Texinfo commands that have been left in the HTML file. .TP .B \-expandinfo Expand @ifinfo sections, not @ifhtml ones. .TP .B \-expandtex Expand @iftex sections, not @ifhtml ones. .TP .B \-glossary Use the section named 'Glossary' to build a list of terms and put links in the HTML document from each term toward its definition. .TP .B \-invisible \fIname\fP Use \fIname\fP to create invisible destination anchors for index links (you can for instance use the invisible.xbm file shipped with this program). This is a workaround for a known bug of many WWW browsers, including netscape. .TP .B \-I \fIdir\fP Look also in \fIdir\fP to find included files. .TP .B \-menu Show the Texinfo menus; by default they are ignored. .TP .B \-monolithic Output only one file, including the table of contents and footnotes. .TP .B \-number Number the sections. .TP .B \-split_chapter Split the output into several HTML files (one per main section: chapter, appendix...). .TP .B \-split_node Split the output into several HTML files (one per node). .TP .B \-usage Print usage instructions, listing the current available command-line options. .TP .B \-verbose Give a verbose output. Can be used with the .B \-check option. .PP .SH FILES By default .I texi2html creates the following files (foo being the name of the Texinfo file): .TP 16 .B foo_toc.html The table of contents. .TP .B foo.html The document's contents. .TP .B foo_foot.html The footnotes (if any). .PP When used with the .B \-split option, it creates several files (one per chapter or node), named .B foo_n.html (n being the indice of the chapter or node), instead of the single .B foo.html file. .PP When used with the .B \-monolithic option, it creates only one file: .B foo.html .SH VARIABLES .I texi2html predefines the following variables: \fBhtml\fP, \fBtexi2html\fP. .SH ADDITIONAL COMMANDS .I texi2html implements the following non-Texinfo commands (maybe they are in Texinfo now...): .TP 16 .B @ifhtml This indicates the start of an HTML section, this section will passed through without any modification. .TP .B @end ifhtml This indicates the end of an HTML section. .SH VERSION This is \fItexi2html\fP version 1.52b, 01/05/98. .PP The latest version of \fItexi2html\fP can be found in WWW, cf. URL http://wwwinfo.cern.ch/dis/texi2html/ .SH AUTHOR The main author is Lionel Cons, CERN IT/DIS/OSE, Lionel.Cons@cern.ch. Many other people around the net contributed to this program. .SH COPYRIGHT This program is the intellectual property of the European Laboratory for Particle Physics (known as CERN). No guarantee whatsoever is provided by CERN. No liability whatsoever is accepted for any loss or damage of any kind resulting from any defect or inaccuracy in this information or code. .PP CERN, 1211 Geneva 23, Switzerland .SH "SEE ALSO" GNU Texinfo Documentation Format, HyperText Markup Language (HTML), World Wide Web (WWW). .SH BUGS This program does not understand all Texinfo commands (yet). .ex gperf-3.2.1/doc/help2man0000775000000000000000000002650214647324214010466 #!/usr/bin/env perl # Generate a short man page from --help and --version output. # Copyright © 1997-2000, 2024 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, see . # Written by Brendan O'Dea # Available from ftp://ftp.gnu.org/gnu/help2man/ use 5.004; use strict; use warnings; use Getopt::Long; use Text::Tabs qw(expand); use POSIX qw(strftime setlocale LC_TIME); my $this_program = 'help2man'; my $this_version = '1.23'; my $version_info = < EOT my $help_info = <. EOT my $section = 1; my ($opt_name, @opt_include, $opt_output, $opt_no_info); # Parse options. Getopt::Long::config('bundling'); GetOptions ( 'n|name=s' => \$opt_name, 's|section=s' => \$section, 'i|include=s' => sub { push @opt_include, [ pop, 1 ] }, 'I|opt-include=s' => sub { push @opt_include, [ pop, 0 ] }, 'o|output=s' => \$opt_output, 'N|no-info' => \$opt_no_info, help => sub { print $help_info; exit }, version => sub { print $version_info; exit }, ) or die $help_info; die $help_info unless @ARGV == 1; my %include = (); my %append = (); my @include = (); # retain order given in include file # Provide replacement `quote-regex' operator for pre-5.005. BEGIN { eval q(sub qr { '' =~ $_[0]; $_[0] }) if $] < 5.005 } # Process include file (if given). Format is: # # [section name] # verbatim text # # or # # /pattern/ # verbatim text # for (@opt_include) { my ($inc, $required) = @$_; next unless -f $inc or $required; die "$this_program: can't open `$inc' ($!)\n" unless open INC, $inc; my $key; my $hash = \%include; while () { # [section] if (/^\[([^]]+)\]/) { $key = uc $1; $key =~ s/^\s+//; $key =~ s/\s+$//; $hash = \%include; push @include, $key unless $include{$key}; next; } # /pattern/ if (m!^/(.*)/([ims]*)!) { my $pat = $2 ? "(?$2)$1" : $1; # Check pattern. eval { $key = qr($pat) }; if ($@) { $@ =~ s/ at .*? line \d.*//; die "$inc:$.:$@"; } $hash = \%append; next; } # Silently ignore anything before the first # section--allows for comments and revision info. next unless $key; $hash->{$key} ||= ''; $hash->{$key} .= $_; } close INC; die "$this_program: no valid information found in `$inc'\n" unless $key; } # Compress trailing blank lines. for my $hash (\(%include, %append)) { for (keys %$hash) { $hash->{$_} =~ s/\n+$/\n/ } } # Turn off localisation of executable's ouput. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; # Turn off localisation of date (for strftime). setlocale LC_TIME, 'C'; # Grab help and version info from executable. my ($help_text, $version_text) = map { join '', map { s/ +$//; expand $_ } `$ARGV[0] --$_ 2>/dev/null` or die "$this_program: can't get `--$_' info from $ARGV[0]\n" } qw(help version); my $date = strftime "%B %Y", localtime; (my $program = $ARGV[0]) =~ s!.*/!!; my $package = $program; my $version; if ($opt_output) { unlink $opt_output or die "$this_program: can't unlink $opt_output ($!)\n" if -e $opt_output; open STDOUT, ">$opt_output" or die "$this_program: can't create $opt_output ($!)\n"; } # The first line of the --version information is assumed to be in one # of the following formats: # # # # {GNU,Free} # ({GNU,Free} ) # - {GNU,Free} # # and seperated from any copyright/author details by a blank line. ($_, $version_text) = split /\n+/, $version_text, 2; if (/^(\S+) +\(((?:GNU|Free) +[^)]+)\) +(.*)/ or /^(\S+) +- *((?:GNU|Free) +\S+) +(.*)/) { $program = $1; $package = $2; $version = $3; } elsif (/^((?:GNU|Free) +)?(\S+) +(.*)/) { $program = $2; $package = $1 ? "$1$2" : $2; $version = $3; } else { $version = $_; } $program =~ s!.*/!!; # No info for `info' itself. $opt_no_info = 1 if $program eq 'info'; # --name overrides --include contents. $include{NAME} = "$program \\- $opt_name\n" if $opt_name; # Default (useless) NAME paragraph. $include{NAME} ||= "$program \\- manual page for $program $version\n"; # Man pages traditionally have the page title in caps. my $PROGRAM = uc $program; # Extract usage clause(s) [if any] for SYNOPSIS. if ($help_text =~ s/^Usage:( +(\S+))(.*)((?:\n(?: {6}\1| *or: +\S).*)*)//m) { my @syn = $2 . $3; if ($_ = $4) { s/^\n//; for (split /\n/) { s/^ *(or: +)?//; push @syn, $_ } } my $synopsis = ''; for (@syn) { $synopsis .= ".br\n" if $synopsis; s!^\S*/!!; s/^(\S+) *//; $synopsis .= ".B $1\n"; s/\s+$//; s/(([][]|\.\.+)+)/\\fR$1\\fI/g; s/^/\\fI/ unless s/^\\fR//; $_ .= '\fR'; s/(\\fI)( *)/$2$1/g; s/\\fI\\fR//g; s/^\\fR//; s/\\fI$//; s/^\./\\&./; $synopsis .= "$_\n"; } $include{SYNOPSIS} ||= $synopsis; } # Process text, initial section is DESCRIPTION. my $sect = 'DESCRIPTION'; $_ = "$help_text\n\n$version_text"; # Normalise paragraph breaks. s/^\n+//; s/\n*$/\n/; s/\n\n+/\n\n/g; # Temporarily exchange leading dots, apostrophes and backslashes for # tokens. s/^\./\x80/mg; s/^'/\x81/mg; s/\\/\x82/g; # Start a new paragraph (if required) for these. s/([^\n])\n(Report +bugs|Email +bug +reports +to|Written +by)/$1\n\n$2/g; sub convert_option; while (length) { # Convert some standard paragraph names. if (s/^(Options|Examples): *\n//) { $sect = uc $1; next; } # Copyright section if (/^Copyright +[(\xa9]/) { $sect = 'COPYRIGHT'; $include{$sect} ||= ''; $include{$sect} .= ".PP\n" if $include{$sect}; my $copy; ($copy, $_) = split /\n\n/, $_, 2; for ($copy) { # Add back newline s/\n*$/\n/; # Convert iso9959-1 copyright symbol or (c) to nroff # character. s/^Copyright +(?:\xa9|\([Cc]\))/Copyright \\(co/mg; # Insert line breaks before additional copyright messages # and the disclaimer. s/(.)\n(Copyright |This +is +free +software)/$1\n.br\n$2/g; # Join hyphenated lines. s/([A-Za-z])-\n */$1/g; } $include{$sect} .= $copy; $_ ||= ''; next; } # Catch bug report text. if (/^(Report +bugs|Email +bug +reports +to) /) { $sect = 'REPORTING BUGS'; } # Author section. elsif (/^Written +by/) { $sect = 'AUTHOR'; } # Examples, indicated by an indented leading $, % or > are # rendered in a constant width font. if (/^( +)([\$\%>] )\S/) { my $indent = $1; my $prefix = $2; my $break = '.IP'; $include{$sect} ||= ''; while (s/^$indent\Q$prefix\E(\S.*)\n*//) { $include{$sect} .= "$break\n\\f(CW$prefix$1\\fR\n"; $break = '.br'; } next; } my $matched = ''; $include{$sect} ||= ''; # Sub-sections have a trailing colon and the second line indented. if (s/^(\S.*:) *\n / /) { $matched .= $& if %append; $include{$sect} .= qq(.SS "$1"\n); } my $indent = 0; my $content = ''; # Option with description. if (s/^( {1,10}([+-]\S.*?))(?:( +)|\n( {20,}))(\S.*)\n//) { $matched .= $& if %append; $indent = length ($4 || "$1$3"); $content = ".TP\n\x83$2\n\x83$5\n"; unless ($4) { # Indent may be different on second line. $indent = length $& if /^ {20,}/; } } # Option without description. elsif (s/^ {1,10}([+-]\S.*)\n//) { $matched .= $& if %append; $content = ".HP\n\x83$1\n"; $indent = 80; # not continued } # Indented paragraph with tag. elsif (s/^( +(\S.*?) +)(\S.*)\n//) { $matched .= $& if %append; $indent = length $1; $content = ".TP\n\x83$2\n\x83$3\n"; } # Indented paragraph. elsif (s/^( +)(\S.*)\n//) { $matched .= $& if %append; $indent = length $1; $content = ".IP\n\x83$2\n"; } # Left justified paragraph. else { s/(.*)\n//; $matched .= $& if %append; $content = ".PP\n" if $include{$sect}; $content .= "$1\n"; } # Append continuations. while (s/^ {$indent}(\S.*)\n//) { $matched .= $& if %append; $content .= "\x83$1\n" } # Move to next paragraph. s/^\n+//; for ($content) { # Leading dot and apostrophe protection. s/\x83\./\x80/g; s/\x83'/\x81/g; s/\x83//g; # Convert options. s/(^| )(-[][\w=-]+)/$1 . convert_option $2/mge; } # Check if matched paragraph contains /pat/. if (%append) { for my $pat (keys %append) { if ($matched =~ $pat) { $content .= ".PP\n" unless $append{$pat} =~ /^\./; $content .= $append{$pat}; } } } $include{$sect} .= $content; } # Refer to the real documentation. unless ($opt_no_info) { $sect = 'SEE ALSO'; $include{$sect} ||= ''; $include{$sect} .= ".PP\n" if $include{$sect}; $include{$sect} .= < Perfect Hash Function Generator - GNU GENERAL PUBLIC LICENSE Go to the first, previous, next, last section, table of contents.


    Copyright (C) 1989-2024 Free Software Foundation, Inc.

    Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

    Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided also that the section entitled “GNU General Public License” is included exactly as in the original, and provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

    Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that the section entitled “GNU General Public License” may be included in a translation approved by the author instead of in the original English.

    GNU GENERAL PUBLIC LICENSE

    Version 3, 29 June 2007

    Copyright (C) 2007 Free Software Foundation, Inc. http://fsf.org/
    
    Everyone is permitted to copy and distribute verbatim copies of this
    license document, but changing it is not allowed.
    

    1.0 Preamble

    The GNU General Public License is a free, copyleft license for software and other kinds of works.

    The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

    When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

    To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

    For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

    Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

    For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

    Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

    Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

    The precise terms and conditions for copying, distribution and modification follow.

    1.1 TERMS AND CONDITIONS

    1. Definitions. “This License” refers to version 3 of the GNU General Public License. “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. A “covered work” means either the unmodified Program or a work based on the Program. To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
    2. Source Code. The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work.
    3. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
    4. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
    5. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
    6. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
      1. The work must carry prominent notices stating that you modified it, and giving a relevant date.
      2. The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
      3. You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
      4. If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
      A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
    7. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
      1. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
      2. Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
      3. Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
      4. Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
      5. Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
      A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
    8. Additional Terms. “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
      1. Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
      2. Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
      3. Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
      4. Limiting the use for publicity purposes of names of licensors or authors of the material; or
      5. Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
      6. Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
      All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
    9. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
    10. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
    11. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
    12. Patents. A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
    13. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
    14. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
    15. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
    16. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
    17. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
    18. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

    1.2 END OF TERMS AND CONDITIONS

    1.3 How to Apply These Terms to Your New Programs

    If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

    To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    one line to give the program's name and a brief idea of what it does.
    Copyright (C) year name of author
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or (at
    your option) any later version.
    
    This program is distributed in the hope that it will be useful, but
    WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see http://www.gnu.org/licenses/.
    

    Also add information on how to contact you by electronic and paper mail.

    If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    program Copyright (C) year name of author
    This program comes with ABSOLUTELY NO WARRANTY; for details type ‘show w’.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type ‘show c’ for details.
    

    The hypothetical commands ‘show w’ and ‘show c’ should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

    You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see http://www.gnu.org/licenses/.

    The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read http://www.gnu.org/philosophy/why-not-lgpl.html.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/doc/gperf_5.html0000664000000000000000000007435214776761154011270 Perfect Hash Function Generator - 4 High-Level Description of GNU gperf Go to the first, previous, next, last section, table of contents.


    4 High-Level Description of GNU gperf

    The perfect hash function generator gperf reads a set of “keywords” from an input file (or from the standard input by default). It attempts to derive a perfect hashing function that recognizes a member of the static keyword set with at most a single probe into the lookup table. If gperf succeeds in generating such a function it produces a pair of C source code routines that perform hashing and table lookup recognition. All generated C code is directed to the standard output. Command-line options described below allow you to modify the input and output format to gperf.

    By default, gperf attempts to produce time-efficient code, with less emphasis on efficient space utilization. However, several options exist that permit trading-off execution time for storage space and vice versa. In particular, expanding the generated table size produces a sparse search structure, generally yielding faster searches. Conversely, you can direct gperf to utilize a C switch statement scheme that minimizes data space storage size. Furthermore, using a C switch may actually speed up the keyword retrieval time somewhat. Actual results depend on your C compiler, of course.

    In general, gperf assigns values to the bytes it is using for hashing until some set of values gives each keyword a unique value. A helpful heuristic is that the larger the hash value range, the easier it is for gperf to find and generate a perfect hash function. Experimentation is the key to getting the most from gperf.

    4.1 Input Format to gperf

    You can control the input file format by varying certain command-line arguments, in particular the ‘-t’ option. The input's appearance is similar to GNU utilities flex and bison (or UNIX utilities lex and yacc). Here's an outline of the general format:

    declarations
    %%
    keywords
    %%
    functions
    

    Unlike flex or bison, the declarations section and the functions section are optional. The following sections describe the input format for each section.

    It is possible to omit the declaration section entirely, if the ‘-t’ option is not given. In this case the input file begins directly with the first keyword line, e.g.:

    january
    february
    march
    april
    ...
    

    4.1.1 Declarations

    The keyword input file optionally contains a section for including arbitrary C declarations and definitions, gperf declarations that act like command-line options, as well as for providing a user-supplied struct.

    4.1.1.1 User-supplied struct

    If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) is enabled, you must provide a C struct as the last component in the declaration section from the input file. The first field in this struct must be of type char * or const char * if the ‘-P’ option is not given, or of type int if the option ‘-P’ (or, equivalently, the ‘%pic’ declaration) is enabled. This first field must be called ‘name’, although it is possible to modify its name with the ‘-K’ option (or, equivalently, the ‘%define slot-name’ declaration) described below.

    Here is a simple example, using months of the year and their attributes as input:

    struct month { char *name; int number; int days; int leap_days; };
    %%
    january,   1, 31, 31
    february,  2, 28, 29
    march,     3, 31, 31
    april,     4, 30, 30
    may,       5, 31, 31
    june,      6, 30, 30
    july,      7, 31, 31
    august,    8, 31, 31
    september, 9, 30, 30
    october,  10, 31, 31
    november, 11, 30, 30
    december, 12, 31, 31
    

    Separating the struct declaration from the list of keywords and other fields are a pair of consecutive percent signs, ‘%%’, appearing left justified in the first column, as in the UNIX utility lex.

    If the struct has already been declared in an include file, it can be mentioned in an abbreviated form, like this:

    struct month;
    %%
    january,   1, 31, 31
    ...
    

    4.1.1.2 Gperf Declarations

    The declaration section can contain gperf declarations. They influence the way gperf works, like command line options do. In fact, every such declaration is equivalent to a command line option. There are three forms of declarations:

    1. Declarations without argument, like ‘%compare-lengths’.
    2. Declarations with an argument, like ‘%switch=count.
    3. Declarations of names of entities in the output file, like ‘%define lookup-function-name name.

    When a declaration is given both in the input file and as a command line option, the command-line option's value prevails.

    The following gperf declarations are available.

    ‘%delimiters=delimiter-list
    Allows you to provide a string containing delimiters used to separate keywords from their attributes. The default is ",". This option is essential if you want to use keywords that have embedded commas or newlines.
    ‘%struct-type’
    Allows you to include a struct type declaration for generated code; see above for an example.
    ‘%ignore-case’
    Consider upper and lower case ASCII characters as equivalent. The string comparison will use a case insignificant character comparison. Note that locale dependent case mappings are ignored.
    ‘%language=language-name
    Instructs gperf to generate code in the language specified by the option's argument. Languages handled are currently:
    ‘KR-C’
    Old-style K&R C. This language is understood by old-style C compilers and ANSI C compilers, but ANSI C compilers may flag warnings (or even errors) because of lacking ‘const’.
    ‘C’
    Common C. This language is understood by ANSI C compilers, and also by old-style C compilers, provided that you #define const to empty for compilers which don't know about this keyword.
    ‘ANSI-C’
    ANSI C. This language is understood by ANSI C (C89, ISO C90) compilers, ISO C99 compilers, and C++ compilers.
    ‘C++’
    C++. This language is understood by C++ compilers.
    The default is ANSI-C.
    ‘%define slot-name name
    This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. By default, the program assumes the structure component identifier for the keyword is ‘name’. This option allows an arbitrary choice of identifier for this component, although it still must occur as the first field in your supplied struct.
    ‘%define initializer-suffix initializers
    This declaration is only useful when option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) has been given. It permits to specify initializers for the structure members following slot-name in empty hash table entries. The list of initializers should start with a comma. By default, the emitted code will zero-initialize structure members following slot-name.
    ‘%define hash-function-name name
    Allows you to specify the name for the generated hash function. Default name is ‘hash’. This option permits the use of two hash tables in the same file.
    ‘%define lookup-function-name name
    Allows you to specify the name for the generated lookup function. Default name is ‘in_word_set’. This option permits multiple generated hash functions to be used in the same application.
    ‘%define class-name name
    This option is only useful when option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration) has been given. It allows you to specify the name of generated C++ class. Default name is Perfect_Hash.
    ‘%7bit’
    This option specifies that all strings that will be passed as arguments to the generated hash function and the generated lookup function will solely consist of 7-bit ASCII characters (bytes in the range 0..127). (Note that the ANSI C functions isalnum and isgraph do not guarantee that a byte is in this range. Only an explicit test like ‘c >= 'A' && c <= 'Z'’ guarantees this.)
    ‘%compare-lengths’
    Compare keyword lengths before trying a string comparison. This option is mandatory for binary comparisons (see section 4.3 Use of NUL bytes). It also might cut down on the number of string comparisons made during the lookup, since keywords with different lengths are never compared via strcmp. However, using ‘%compare-lengths’ might greatly increase the size of the generated C code if the lookup table range is large (which implies that the switch option ‘-S’ or ‘%switch’ is not enabled), since the length table contains as many elements as there are entries in the lookup table.
    ‘%compare-strncmp’
    Generates C code that uses the strncmp function to perform string comparisons. The default action is to use strcmp.
    ‘%readonly-tables’
    Makes the contents of all generated lookup tables constant, i.e., “readonly”. Many compilers can generate more efficient code for this by putting the tables in readonly memory.
    ‘%enum’
    Define constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark <jjc@ai.mit.edu>.
    ‘%includes’
    Include the necessary system include file, <string.h>, at the beginning of the code. By default, this is not done; the user must include this header file himself to allow compilation of the code.
    ‘%global-table’
    Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior).
    ‘%pic’
    Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. If the ‘%struct-type’ declaration (or, equivalently, the option ‘-t’) is also given, the first field of the user-defined struct must be of type ‘int’, not ‘char *’, because it will contain offsets into the string pool instead of actual strings. To convert such an offset to a string, you can use the expression ‘stringpool + o, where o is the offset. The string pool name can be changed through the ‘%define string-pool-name’ declaration.
    ‘%define string-pool-name name
    Allows you to specify the name of the generated string pool created by the declaration ‘%pic’ (or, equivalently, the option ‘-P’). The default name is ‘stringpool’. This declaration permits the use of two hash tables in the same file, with ‘%pic’ and even when the ‘%global-table’ declaration (or, equivalently, the option ‘-G’) is given.
    ‘%null-strings’
    Use NULL strings instead of empty strings for empty keyword table entries. This reduces the startup time of programs using a shared library containing the generated code (but not as much as the declaration ‘%pic’), at the expense of one more test-and-branch instruction at run time.
    ‘%define constants-prefix prefix
    Allows you to specify a prefix for the constants TOTAL_KEYWORDS, MIN_WORD_LENGTH, MAX_WORD_LENGTH, and so on. This option permits the use of two hash tables in the same file, even when the option ‘-E’ (or, equivalently, the ‘%enum’ declaration) is not given or the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
    ‘%define word-array-name name
    Allows you to specify the name for the generated array containing the hash table. Default name is ‘wordlist’. This option permits the use of two hash tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
    ‘%define length-table-name name
    Allows you to specify the name for the generated array containing the length table. Default name is ‘lengthtable’. This option permits the use of two length tables in the same file, even when the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration) is given.
    ‘%switch=count
    Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some input files. The argument to this option determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each switch, etc. This is useful since many C compilers cannot correctly generate code for large switch statements. This option was inspired in part by Keith Bostic's original C program.
    ‘%omit-struct-type’
    Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere.

    4.1.1.3 C Code Inclusion

    Using a syntax similar to GNU utilities flex and bison, it is possible to directly include C source text and comments verbatim into the generated output file. This is accomplished by enclosing the region inside left-justified surrounding ‘%{’, ‘%}’ pairs. Here is an input fragment based on the previous example that illustrates this feature:

    %{
    #include <assert.h>
    /* This section of code is inserted directly into the output. */
    int return_month_days (struct month *months, int is_leap_year);
    %}
    struct month { char *name; int number; int days; int leap_days; };
    %%
    january,   1, 31, 31
    february,  2, 28, 29
    march,     3, 31, 31
    ...
    

    4.1.2 Format for Keyword Entries

    The second input file format section contains lines of keywords and any associated attributes you might supply. A line beginning with ‘#’ in the first column is considered a comment. Everything following the ‘#’ is ignored, up to and including the following newline. A line beginning with ‘%’ in the first column is an option declaration and must not occur within the keywords section.

    The first field of each non-comment line is always the keyword itself. It can be given in two ways: as a simple name, i.e., without surrounding string quotation marks, or as a string enclosed in double-quotes, in C syntax, possibly with backslash escapes like \" or \234 or \xa8. In either case, it must start right at the beginning of the line, without leading whitespace. In this context, a “field” is considered to extend up to, but not include, the first blank, comma, or newline. Here is a simple example taken from a partial list of C reserved words:

    # These are a few C reserved words, see the c.gperf file 
    # for a complete list of ANSI C reserved words.
    unsigned
    sizeof
    switch
    signed
    if
    default
    for
    while
    return
    

    Note that unlike flex or bison the first ‘%%’ marker may be elided if the declaration section is empty.

    Additional fields may optionally follow the leading keyword. Fields should be separated by commas, and terminate at the end of line. What these fields mean is entirely up to you; they are used to initialize the elements of the user-defined struct provided by you in the declaration section. If the ‘-t’ option (or, equivalently, the ‘%struct-type’ declaration) is not enabled these fields are simply ignored. All previous examples except the last one contain keyword attributes.

    4.1.3 Including Additional C Functions

    The optional third section also corresponds closely with conventions found in flex and bison. All text in this section, starting at the final ‘%%’ and extending to the end of the input file, is included verbatim into the generated output file. Naturally, it is your responsibility to ensure that the code contained in this section is valid C.

    4.1.4 Where to place directives for GNU indent.

    If you want to invoke GNU indent on a gperf input file, you will see that GNU indent doesn't understand the ‘%%’, ‘%{’ and ‘%}’ directives that control gperf's interpretation of the input file. Therefore you have to insert some directives for GNU indent. More precisely, assuming the most general input file structure

    declarations part 1
    %{
    verbatim code
    %}
    declarations part 2
    %%
    keywords
    %%
    functions
    

    you would insert ‘*INDENT-OFF*’ and ‘*INDENT-ON*’ comments as follows:

    /* *INDENT-OFF* */
    declarations part 1
    %{
    /* *INDENT-ON* */
    verbatim code
    /* *INDENT-OFF* */
    %}
    declarations part 2
    %%
    keywords
    %%
    /* *INDENT-ON* */
    functions
    

    4.2 Output Format for Generated C Code with gperf

    Several options control how the generated C code appears on the standard output. Two C functions are generated. They are called hash and in_word_set, although you may modify their names with a command-line option. Both functions require two arguments, a string, char * str, and a length parameter, int len. Their default function prototypes are as follows:

    Function: unsigned int hash (const char * str, size_t len)
    By default, the generated hash function returns an integer value created by adding len to several user-specified str byte positions indexed into an associated values table stored in a local static array. The associated values table is constructed internally by gperf and later output as a static local C array called ‘hash_table’. The relevant selected positions (i.e. indices into str) are specified via the ‘-k’ option when running gperf, as detailed in the Options section below (see section 5 Invoking gperf).

    Function: in_word_set (const char * str, size_t len)
    If str is in the keyword set, returns a pointer to that keyword. More exactly, if the option ‘-t’ (or, equivalently, the ‘%struct-type’ declaration) was given, it returns a pointer to the matching keyword's structure. Otherwise it returns NULL.

    If the option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is not used, str must be a NUL terminated string of exactly length len. If ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, str must simply be an array of len bytes and does not need to be NUL terminated.

    The code generated for these two functions is affected by the following options:

    ‘-t’
    ‘--struct-type’
    Make use of the user-defined struct.
    ‘-S total-switch-statements
    ‘--switch=total-switch-statements
    Generate 1 or more C switch statement rather than use a large, (and potentially sparse) static array. Although the exact time and space savings of this approach vary according to your C compiler's degree of optimization, this method often results in smaller and faster code.

    If the ‘-t’ and ‘-S’ options (or, equivalently, the ‘%struct-type’ and ‘%switch’ declarations) are omitted, the default action is to generate a char * array containing the keywords, together with additional empty strings used for padding the array. By experimenting with the various input and output options, and timing the resulting C code, you can determine the best option choices for different keyword set characteristics.

    4.3 Use of NUL bytes

    By default, the code generated by gperf operates on zero terminated strings, the usual representation of strings in C. This means that the keywords in the input file must not contain NUL bytes, and the str argument passed to hash or in_word_set must be NUL terminated and have exactly length len.

    If option ‘-c’ (or, equivalently, the ‘%compare-strncmp’ declaration) is used, then the str argument does not need to be NUL terminated. The code generated by gperf will only access the first len, not len+1, bytes starting at str. However, the keywords in the input file still must not contain NUL bytes.

    If option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration) is used, then the hash table performs binary comparison. The keywords in the input file may contain NUL bytes, written in string syntax as \000 or \x00, and the code generated by gperf will treat NUL like any other byte. Also, in this case the ‘-c’ option (or, equivalently, the ‘%compare-strncmp’ declaration) is ignored.

    4.4 Controlling Identifiers

    The identifiers of the functions, tables, and constants defined by the code generated by gperf can be controlled through gperf declarations or the equivalent command-line options. This is useful for three purposes:

    • Esthetics of the generated code. For this purpose, just use the available declarations or options at will.
    • Controlling the exported identifiers of a library. Assume you include code generated by gperf in a library, and to avoid collisions with other libraries, you want to ensure that all exported identifiers of this library start with a certain prefix. By default, the only exported identifier is the lookup function. You can therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration). When you use the option ‘-L C++’ (or, equivalently, the ‘%language=C++’ declaration), the only exported entity is a class. You control its name through the option ‘-Z’ (or, equivalently, the ‘%define class-name’ declaration).
    • Allowing multiple gperf generated codes in a single compilation unit. Assume you invoke gperf multiple times, with different input files, and want the generated code to be included from the same source file. In this case, you have to customize not only the exported identifiers, but also the names of functions with ‘static’ scope, types, and constants. By default, you will have to deal with the lookup function, the hash function, and the constants. You should therefore use the option ‘-N’ (or, equivalently, the ‘%define lookup-function-name’ declaration), the option ‘-H’ (or, equivalently, the ‘%define hash-function-name’ declaration), and the option ‘--constants-prefix’ (or, equivalently, the ‘%define constants-prefix’ declaration). If you use the option ‘-G’ (or, equivalently, the ‘%global-table’ declaration), you will also have to deal with the word array, the length table if present, and the string pool if present. This means: You should use the option ‘-W’ (or, equivalently, the ‘%define word-array-name’ declaration). If you use the option ‘-l’ (or, equivalently, the ‘%compare-lengths’ declaration), you should use the option ‘--length-table-name’ (or, equivalently, the ‘%define length-table-name’ declaration). If you use the option ‘-P’ (or, equivalently, the ‘%pic’ declaration), you should use the option ‘-Q’ (or, equivalently, the ‘%define string-pool-name’ declaration).

    4.5 The Copyright of the Output

    gperf is under GPL, but that does not cause the output produced by gperf to be under GPL. The reason is that the output contains only small pieces of text that come directly from gperf's source code -- only about 7 lines long, too small for being significant --, and therefore the output is not a “work based on gperf” (in the sense of the GPL version 3).

    On the other hand, the output produced by gperf contains essentially all of the input file. Therefore the output is a “derivative work” of the input (in the sense of U.S. copyright law); and its copyright status depends on the copyright of the input. For most software licenses, the result is that the output is under the same license, with the same copyright holder, as the input that was passed to gperf.


    Go to the first, previous, next, last section, table of contents. gperf-3.2.1/build-aux/0000775000000000000000000000000014776761171010244 5gperf-3.2.1/build-aux/mkinstalldirs0000775000000000000000000000712214774103067012764 #! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2024-12-03.03; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to . GNU Automake home page: . General help using GNU software: ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 (GNU Automake) $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the 'mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because '.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "umask 22" umask 22 echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac echo "umask 22" umask 22 for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp=$pathcomp/ done if test ! -z "$dirmode"; then echo "chmod $dirmode $file" chmod "$dirmode" "$file" || errstatus=$? fi done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gperf-3.2.1/build-aux/ar-lib0000775000000000000000000001450114774103067011251 #! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2025-02-03.05; # UTC # Copyright (C) 2010-2025 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then # MSYS2 environment. file_conv=cygwin else # Original MinGW environment. file_conv=mingw fi ;; MSYS*) # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell. file_conv=cygwin ;; CYGWIN*) # Cygwin environment. file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -w "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "$me (GNU Automake) $scriptversion" exit $? ;; esac if test $# -lt 3; then func_error "you must specify a program, an action and an archive" fi AR=$1 shift while : do if test $# -lt 2; then func_error "you must specify a program, an action and an archive" fi case $1 in -lib | -LIB \ | -ltcg | -LTCG \ | -machine* | -MACHINE* \ | -subsystem* | -SUBSYSTEM* \ | -verbose | -VERBOSE \ | -wx* | -WX* ) AR="$AR $1" shift ;; -nologo | -NOLOGO) # We always invoke AR with -nologo, so don't need to add it again. shift ;; *) action=$1 shift break ;; esac done orig_archive=$1 shift func_file_conv "$orig_archive" archive=$file # strip leading dash in $action action=${action#-} delete= extract= list= quick= replace= index= create= while test -n "$action" do case $action in d*) delete=yes ;; x*) extract=yes ;; t*) list=yes ;; q*) quick=yes ;; r*) replace=yes ;; s*) index=yes ;; S*) ;; # the index is always updated implicitly c*) create=yes ;; u*) ;; # TODO: don't ignore the update modifier v*) ;; # TODO: don't ignore the verbose modifier *) func_error "unknown action specified" ;; esac action=${action#?} done case $delete$extract$list$quick$replace,$index in yes,* | ,yes) ;; yesyes*) func_error "more than one action specified" ;; *) func_error "no action specified" ;; esac if test -n "$delete"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi for member do case $1 in @*) func_at_file "${1#@}" -REMOVE "$archive" ;; *) func_file_conv "$1" $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? ;; esac done elif test -n "$extract"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi if test $# -gt 0; then for member do case $1 in @*) func_at_file "${1#@}" -EXTRACT "$archive" ;; *) func_file_conv "$1" $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? ;; esac done else $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \ | while read member do $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? done fi elif test -n "$quick$replace"; then if test ! -f "$orig_archive"; then if test -z "$create"; then echo "$me: creating $orig_archive" fi orig_archive= else orig_archive=$archive fi for member do case $1 in @*) func_file_conv "${1#@}" set x "$@" "@$file" ;; *) func_file_conv "$1" set x "$@" "$file" ;; esac shift shift done if test -n "$orig_archive"; then $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? else $AR -NOLOGO -OUT:"$archive" "$@" || exit $? fi elif test -n "$list"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi $AR -NOLOGO -LIST "$archive" || exit $? fi gperf-3.2.1/build-aux/compile0000775000000000000000000001760114774103067011537 #! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2025-02-03.05; # UTC # Copyright (C) 1999-2025 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file unneeded_conversions # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) UNNEEDED_CONVERSIONS, no # conversion will take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) if test -n "$MSYSTEM" && (cygpath --version) >/dev/null 2>&1; then # MSYS2 environment. file_conv=cygwin else # Original MinGW environment. file_conv=mingw fi ;; MSYS*) # Old MSYS environment, or MSYS2 with 32-bit MSYS2 shell. file_conv=cygwin ;; CYGWIN*) # Cygwin environment. file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) # This is the optimization mentioned above: # If UNNEEDED_CONVERSIONS contains $file_conv, don't convert. ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -w "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gperf-3.2.1/build-aux/install-sh0000775000000000000000000003612314774103067012165 #!/bin/sh # install - install a program, script, or datafile scriptversion=2024-12-03.03; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp nil t) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: gperf-3.2.1/INSTALL0000664000000000000000000002331114445264334007313 Basic Installation ================== These are generic installation instructions. The ‘configure’ shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a ‘Makefile’ in each directory of the package. It may also create one or more ‘.h’ files containing system-dependent definitions. Finally, it creates a shell script ‘config.status’ that you can run in the future to recreate the current configuration, a file ‘config.cache’ that saves the results of its tests to speed up reconfiguring, and a file ‘config.log’ containing compiler output (useful mainly for debugging ‘configure’). If you need to do unusual things to compile the package, please try to figure out how ‘configure’ could check whether to do them, and mail diffs or instructions to the address given in the ‘README’ so they can be considered for the next release. If at some point ‘config.cache’ contains results you don't want to keep, you may remove or edit it. The file ‘configure.ac’ is used to create ‘configure’ by a program called ‘autoconf’. You only need ‘configure.ac’ if you want to change it or regenerate ‘configure’ using a newer version of ‘autoconf’. The simplest way to compile this package is: 1. ‘cd’ to the directory containing the package's source code and type ‘./configure’ to configure the package for your system. If you're using ‘csh’ on an old version of System V, you might need to type ‘sh ./configure’ instead to prevent ‘csh’ from trying to execute ‘configure’ itself. Running ‘configure’ takes a while. While running, it prints some messages telling which features it is checking for. 2. Type ‘make’ to compile the package. 3. Optionally, type ‘make check’ to run any self-tests that come with the package. 4. Type ‘make install’ to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing ‘make clean’. To also remove the files that ‘configure’ created (so you can compile the package for a different kind of computer), type ‘make distclean’. There is also a ‘make maintainer-clean’ target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the ‘configure’ script does not know about. You can give ‘configure’ initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the ‘env’ program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of ‘make’ that supports the ‘VPATH’ variable, such as GNU ‘make’. ‘cd’ to the directory where you want the object files and executables to go and run the ‘configure’ script. ‘configure’ automatically checks for the source code in the directory that ‘configure’ is in and in ‘..’. If you have to use a ‘make’ that does not supports the ‘VPATH’ variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use ‘make distclean’ before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple '-arch' options to the compiler but only a single '-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases. You may have to build one architecture at a time and combine the results using the 'lipo' tool if you have problems. Installation Names ================== By default, ‘make install’ will install the package's files in ‘/usr/local/bin’, ‘/usr/local/man’, etc. You can specify an installation prefix other than ‘/usr/local’ by giving ‘configure’ the option ‘--prefix=PATH’. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give ‘configure’ the option ‘--exec-prefix=PATH’, the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like ‘--bindir=PATH’ to specify different values for particular kinds of files. Run ‘configure --help’ for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving ‘configure’ the option ‘--program-prefix=PREFIX’ or ‘--program-suffix=SUFFIX’. Optional Features ================= Some packages pay attention to ‘--enable-FEATURE’ options to ‘configure’, where FEATURE indicates an optional part of the package. They may also pay attention to ‘--with-PACKAGE’ options, where PACKAGE is something like ‘gnu-as’ or ‘x’ (for the X Window System). The ‘README’ should mention any ‘--enable-’ and ‘--with-’ options that the package recognizes. For packages that use the X Window System, ‘configure’ can usually find the X include and library files automatically, but if it doesn't, you can use the ‘configure’ options ‘--x-includes=DIR’ and ‘--x-libraries=DIR’ to specify their locations. Particular Systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its ‘’ header file. The option ‘-nodtk’ can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On AIX 3, the C include files by default don't define some necessary prototype declarations. If GNU CC is not installed, it is recommended to use the following options: ./configure CC="xlc -D_ALL_SOURCE" On BeOS, user installed software goes in /boot/home/config, not /usr/local. It is recommended to use the following options: ./configure --prefix=/boot/home/config Specifying the System Type ========================== There may be some features ‘configure’ can not figure out automatically, but needs to determine by the type of host the package will run on. Usually ‘configure’ can figure that out, but if it prints a message saying it can not guess the host type, give it the ‘--host=TYPE’ option. TYPE can either be a short name for the system type, such as ‘sun4’, or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file ‘config.sub’ for the possible values of each field. If ‘config.sub’ isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the ‘--target=TYPE’ option to select the type of system they will produce code for and the ‘--build=TYPE’ option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for ‘configure’ scripts to share, you can create a site shell script called ‘config.site’ that gives default values for variables like ‘CC’, ‘cache_file’, and ‘prefix’. ‘configure’ looks for ‘PREFIX/share/config.site’ if it exists, then ‘PREFIX/etc/config.site’ if it exists. Or, you can set the ‘CONFIG_SITE’ environment variable to the location of the site script. A warning: not all ‘configure’ scripts look for a site script. Operation Controls ================== ‘configure’ recognizes the following options to control how it operates. ‘--cache-file=FILE’ Use and save the results of the tests in FILE instead of ‘./config.cache’. Set FILE to ‘/dev/null’ to disable caching, for debugging ‘configure’. ‘--help’ Print a summary of the options to ‘configure’, and exit. ‘--quiet’ ‘--silent’ ‘-q’ Do not print messages saying which checks are being made. To suppress all normal output, redirect it to ‘/dev/null’ (any error messages will still be shown). ‘--srcdir=DIR’ Look for the package's source code in directory DIR. Usually ‘configure’ can determine that directory automatically. ‘--version’ Print the version of Autoconf used to generate the ‘configure’ script, and exit. ‘configure’ also accepts some other, not widely useful, options. gperf-3.2.1/ChangeLog0000664000000000000000000055543514776760756010075 2025-04-13 Bruno Haible Release gperf-3.2.1. * src/version.cc (version_string): Bump. * tests/*.exp: Update. * NEWS: Mention the changes. 2025-04-09 Bruno Haible Fix "make check" failure with an ISO C 23 conforming C compiler. Prompted by . * tests/smtp.gperf (my_case_strcmp, main): Convert from K&R C syntax to ISO C 90 syntax. 2025-04-09 Bruno Haible Avoid "-Wundef" warnings in C++ mode on the generated code. Reported by Heiko Becker in and by Thomas Klausner . * src/output.cc (Output::output_hash_function): Emit a 'defined __STDC_VERSION__' before the test of __STDC_VERSION__. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp: Update. 2025-04-05 Bruno Haible Release gperf-3.2. * src/options.cc (Options::parse_options): Bump copyright year. * NEWS: Mention a few more changes. 2025-04-05 Bruno Haible Remove all occurrences of reinterpret_cast<>. * src/keyword-list.h (Keyword_List): Add template parameter list . (KeywordExt_List): Define as a typedef, not as a subclass. (copy_list, delete_list, mergesort_list): Templatize accordingly. * src/keyword-list.icc (Keyword_List): Add template parameter list . (KeywordExt_List): Remove method definitions. * src/keyword-list.cc (Keyword_List): Add template parameter list . (copy_list, mergesort_list): Remove definitions on subclass. Add explicit template instantiation. * src/keyword.h (Keyword_Factory): Add template parameter list . * src/keyword.cc (Keyword_Factory): Likewise. Add explicit template instantiation. * src/input.h (Input): Add template parameter list . * src/input.cc (Input): Likewise. Add explicit template instantiation. * src/main.cc (KeywordExt_Factory): Define as a typedef, not as a subclass. (main): Update. 2025-04-05 Bruno Haible Make output on Windows identical to output on Unix. * src/options.cc (Options::print_options): Drop a ".exe" suffix from the program name before printing it. 2024-11-16 Bruno Haible Avoid "-Wzero-as-null-pointer-constant" warnings on the generated code. Reported in . * src/output.cc (Output::output_lookup_function_body): To denote a null pointer, emit a cast expression instead of plain "0". * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. 2024-10-28 Bruno Haible doc: Improve text rendering in PDF output. Suggested by Collin Funk in . * doc/texinfo.tex: Update from the texinfo-7.1 release. * doc/gperf.texi: Override the colour for interactive links. Bump date. 2024-09-01 Bruno Haible Replace FSF snail-mail addresses with URLs. * tests/java.gperf: Update GPL license notice. * tests/java.exp: Likewise. 2024-07-22 Bruno Haible build: Simplify last change. * Makefile.in (doc/gperf.1): Simplify rule. 2024-07-21 Bruno Haible build: Fix failure of "./configure; make dist". * Makefile.in (srcdir, VPATH): New variables. (VERSION): Refer to src/version.cc in $(srcdir). (dist): Depend on doc/gperf.1. (doc/gperf.1): New rule. * doc/Makefile.in (DISTRIBUTED_BUILT_FILES): Remove wildcard patterns. (DISTRIBUTED_BUILT_FILES_EXTRA_PATTERNS): New variable. (distdir): Handle the files from DISTRIBUTED_BUILT_FILES_EXTRA_PATTERNS. 2024-07-21 Bruno Haible build: Don't leave an empty gperf.1 on disk if help2man fails. * doc/Makefile.in (gperf.1): Use a temporary file. (clean): Remove this temporary file. 2024-07-21 Bruno Haible build: Fix VPATH builds. * doc/Makefile.in (TEXINFO): Look up texi2html in the current directory. (gperf.1): Look up help2man in the source directory. Generate gperf.1 in the source directory. 2024-07-21 Bruno Haible build: Fix use of perl on Guix, FreeBSD, NetBSD. * doc/help2man: Search for perl in $PATH. 2024-07-21 Bruno Haible build: Fix "make maintainer-clean". * doc/Makefile.in (maintainer-clean): Remove also gperf.1. 2024-06-12 Collin Funk doc: Make the detailed menu title appear as intended. * doc/gperf.texi (Top): Add a line break after @detailmenu. 2024-06-05 Bruno Haible Fix build (regression 2024-04-04). Reported by Pádraig Brady in . * doc/configure.ac: Invoke AC_CONFIG_AUX_DIR, needed for locating install-sh. * lib/configure.ac: Likewise. * src/configure.ac: Likewise. * tests/configure.ac: Likewise. 2024-04-04 Bruno Haible Remove outdated Autoconf macro. * aclocal.m4 (CL_PROG_INSTALL): Remove macro. * doc/configure.ac: Invoke AC_PROG_INSTALL instead of CL_PROG_INSTALL. * lib/configure.ac: Likewise. * src/configure.ac: Likewise. 2023-12-30 Bruno Haible Mark autoconf 2.72 as supported. * autogen.sh: Update comment. 2023-09-07 Bruno Haible Fix "make extracheck" failure (regression 2016-11-27). * tests/validate (KR-C): Remove the test against ' const ', since the input files jstest*.gperf now contain 'const' keywords. 2023-09-07 Bruno Haible Avoid "clang -Wimplicit-fallthrough" warnings also in C mode. * src/output.cc (Output::output_hash_function): Enhance the fallthrough marker, to include clang >= 10 in C mode. * tests/*.exp: Update. 2023-09-05 Bruno Haible Avoid "gcc -Wmissing-field-initializers" warnings on the generated code. * src/options.h (Options::has_initializer_suffix): New declaration. * src/options.cc (Options::has_initializer_suffix): New function. * src/output.cc (Output::output_keyword_table): If option -t is specified and option -F is not specified, emit '#pragma GCC diagnostic' lines, to silence -Wmissing-field-initializers warnings from gcc or clang. * tests/charsets.exp: Update. * tests/gpc.exp: Likewise. * tests/incomplete.exp: Likewise. * tests/languages.exp: Likewise. * tests/objc.exp: Likewise. * tests/test-4.exp: Likewise. 2023-07-08 Bruno Haible Avoid "gcc -Wunused-parameter" warnings on the generated hash function. Reported by Vinícius dos Santos Oliveira in . * src/output.cc (Output::output_hash_function): If str is not used, emit a cast from str to void. If len is not used, emit a cast from len to void. * tests/permut2.exp: Update. * tests/permut3.exp: Likewise. * tests/permutc2.exp: Likewise. 2023-07-01 Bruno Haible doc: Tweaks. Reported by Laurent Lyaudet in . * doc/gperf.texi: Update copyright year. Fix some typos. (Bugs): Don't use the term "recent enhancements", since that's over 20 years ago. Don't mention RAM requirements, since the execution time is the bigger inconvenience nowadays. 2023-06-29 Bruno Haible Update the installation instructions for Windows. * INSTALL.windows: Add a note about MSYS2. 2023-06-22 Bruno Haible Ensure that makeinfo ≥ 6.8 checks the @menu structure. See . * doc/Makefile.in (MAKEINFO): Add option "-c CHECK_NORMAL_MENU_STRUCTURE=1". 2022-09-08 Bruno Haible Fix a warning regarding strncmp. Reported by Sam James in . * lib/getopt.c (strncmp): Declare with a prototype. 2022-07-17 Bruno Haible Split autogen.sh into autopull.sh and autogen.sh. * autopull.sh: New file, based on autogen.sh. * autogen.sh: Remove code that was moved to autopull.sh. * Makefile.in (SOURCE_FILES): Add autogen.sh. 2022-07-05 Bruno Haible Add support for reproducible builds. Suggested by Richard Purdie in . * autogen.sh: Import also lib/filename.h. * Makefile.in (IMPORTED_FILES): Add lib/filename.h. * src/options.cc: Include filename.h. (Options::print_options): Print only the base name of the program name. * tests/*.exp: Update. 2022-05-22 Bruno Haible Add GNU Project notice. * JOIN-GNU: New file. Inspired by a suggestion from José E. Marchesi on the gnu-prog-discuss mailing list. * README: Refer to it. * Makefile.in (SOURCE_FILES): Add it. 2022-02-07 Bruno Haible tests: Fix undefined behaviour. * tests/test2.c (main): Cast bytes to unsigned before shifting left. 2022-01-05 Bruno Haible Release gperf-3.2. * src/version.cc (version_string): Bump to 3.2. * src/options.cc (Options::parse_options): Bump copyright year. * tests/*.exp: Update. * doc/gperf.texi: Bump date. 2021-06-06 Michael Drake (tiny change) Honor --readonly-tables when outputting table for --ignore-case. * src/output.cc (output_upperlower_table): Add 'const' when suitable. 2021-01-30 Bruno Haible Mark Autoconf 2.71 as supported. * autogen.sh: Update comment. 2020-12-08 Bruno Haible Mark Autoconf 2.70 as supported. * autogen.sh: Update comment. 2020-10-04 Bruno Haible Fix warnings from Autoconf 2.69c. * configure.ac: Invoke AC_INIT, AC_OUTPUT without arguments. * doc/configure.ac: Likewise. * lib/configure.ac: Likewise. * src/configure.ac: Invoke AC_INIT, AC_OUTPUT without arguments. Use AC_CACHE_CHECK, AC_LANG_PUSH/AC_LANG_POP, AC_COMPILE_IFELSE * tests/configure.ac: Invoke AC_INIT, AC_OUTPUT without arguments. Use ac_cv_c_compiler_gnu instead of ac_cv_prog_gcc, and ac_cv_cxx_compiler_gnu instead of ac_cv_prog_gxx. Don't use 'test' with option '-a'. 2020-08-30 Bruno Haible Make the code C++17 compliant. * lib/getline.cc (getstr): Don't use the 'register' keyword. 2020-08-29 Bruno Haible Fix link error on native Windows with MSVC/clang. * tests/test2.c (SET_BINARY): On native Windows, use _setmode, not setmode. 2020-08-29 Bruno Haible Update after gnulib changed. * configure.ac (AC_PREREQ): Require Autoconf >= 2.64. * doc/configure.ac (AC_PREREQ): Likewise. * lib/configure.ac (AC_PREREQ): Likewise. * src/configure.ac (AC_PREREQ): Likewise. * tests/configure.ac (AC_PREREQ): Likewise. * autogen.sh: Update comment. 2020-02-10 Bruno Haible Rely entirely on the GNU Build System. * Makefile.vms: Remove file. * INSTALL.vms: Remove file. * Makefile.in (SOURCE_FILES): Remove them. * Makefile.devel (src/config.h_vms): Remove target. (totally-clean): Update. * src/Makefile.in (GENERATED_FILES): Remove config.h_vms. 2018-10-24 Bruno Haible Update after gnulib changed. * configure.ac (AC_PREREQ): Require Autoconf >= 2.63. * doc/configure.ac (AC_PREREQ): Likewise. * lib/configure.ac (AC_PREREQ): Likewise. * src/configure.ac (AC_PREREQ): Likewise. * tests/configure.ac (AC_PREREQ): Likewise. * autogen.sh: Update comment. 2018-09-16 Bruno Haible Fix "Unescaped left brace in regex" warnings from Perl 5.26. Reported and patch by Jehan at . * doc/texi2html: Escape braces in regular expressions. 2018-09-14 Bruno Haible doc: Assume texinfo 4.0 or newer. * doc/gperf.texi: Omit Next, Prev, Up fields from @node lines. 2018-09-08 Bruno Haible Avoid "implicit fallthrough" warnings also from clang. Reported by Nico Weber in . Clang emits these warnings in C++11 mode only, see , and only in clang 3.9 or newer, see . To avoid them, either [[fallthrough]] or the (nearly equivalent) older [[clang::fallthrough]] can be used, see . * src/output.cc (Output::output_hash_function): Enhance the fallthrough marker. * tests/*.exp: Update. 2018-09-08 Bruno Haible Fix failure of "make check -j2". Reported and fix provided by Bernhard M. Wiedemann in . * tests/Makefile.in (check-test): Depend on 'check-ada'. 2018-09-08 Bruno Haible Don't print uninitialized hash values in debug mode. Reported by Frank Wojcik in . * src/output.cc (output_keyword_entry): Add an 'is_duplicate' argument. (Output::output_keyword_table): Update callers. 2018-09-08 Bruno Haible Improve the speed of the positions search. Reported by Frank Wojcik in . * src/search.cc (Search::find_positions): Double the speed of step 4. 2018-09-08 Bruno Haible Really prefer more efficient hash functions over less efficient ones. Reported by Frank Wojcik in . * src/search.cc (Search::find_positions): In step 4, make sure a less efficient hash function does not replace a more efficient one. Also, include i3 = -1 among the search. 2018-09-08 Bruno Haible Correct width of columns when outputting the asso_values array. Patch by Frank Wojcik . * src/output.cc (Output::output_hash_function): Increase the field_width by 1 if _max_hash_value+1 is a power of 10. 2018-07-25 Bruno Haible Avoid "implicit fallthrough" warnings in the generated code. Reported by Phil Willoughby at . * src/output.cc (Output::output_hash_function): Emit a more elaborate fallthrough marker. * tests/*.exp: Update. 2018-04-24 Bruno Haible Support input files with CR/LF line terminators. Reported at . * src/input.cc (Input::read_input): Convert CR/LF sequences to LF. 2018-01-27 Bruno Haible Rename some files. * INSTALL.windows: Renamed from README.windows. * INSTALL.vms: Renamed from README.vms. * Makefile.in (SOURCE_FILES): Update. 2018-01-23 Bruno Haible Don't use an undocumented Autoconf macro. * src/configure.ac: Use AC_CONFIG_HEADERS instead of AC_CONFIG_HEADER. 2017-07-15 Bruno Haible Get rid of autom4te.cache directories (left over from autoconf). * Makefile.devel (configure, */configure, src/config.h.in): Remove autom4te.cache directory after running autoconf or autoheader. 2017-04-16 Bruno Haible Initialize the Keyword::_lineno field through the constructor. * src/keyword.h (struct Keyword, struct KeywordExt): Add lineno argument to constructor. (Keyword_Factory::create_keyword): Add lineno argument. * src/keyword.icc (struct Keyword, struct KeywordExt): Add lineno argument to constructor. * src/main.cc (KeywordExt_Factory::create_keyword): Pass lineno argument to KeywordExt constructor. * src/input.cc (Input::read_input): Pass lineno to create_keyword. 2017-03-31 Bruno Haible Fix doc build error with perl 5.22. * doc/texi2html (update_sec_num): Omit defined(...) for array. 2017-01-10 Bruno Haible Update some URL. * README: Update. 2017-01-02 Marcel Schaible * gperf-3.1 released. 2016-12-29 Bruno Haible Make autogen.sh more user-friendly. * autogen.sh: Emit a message at the end, if everything succeeded. 2016-12-03 Bruno Haible Make Makefile.devel more useful for the users of the released tarball. * Makefile.devel (totally-clean): New target. * autogen.sh: Invoke it and 'all'. 2016-11-27 Bruno Haible Fix build with mingw. * README.windows: Augment PATH for mingw, so that it finds libstdc++. 2016-11-27 Bruno Haible Assume the available C compiler supports ANSI C. Remove K&R C cruft. * lib/getopt.h: Assume 'const' is defined. Use ANSI C prototypes. * lib/getopt.c: Assume 'const' is defined. Use ANSI C prototypes. Include . Declare strcmp and strlen. * lib/getopt1.c: Assume 'const' and NULL are defined. Use ANSI C prototypes. * lib/getopt.h.patch: Remove file. * lib/getopt.c.patch: Remove file. * lib/Makefile.in (SOURCE_FILES): Remove them. * tests/jstest*.gperf: Assume 'const' is defined. * tests/test.c: Use ANSI C prototypes. (in_word_set): Fix prototype. * tests/test2.c: Use ANSI C prototypes. (in_word_set): Fix prototype. Reported by Erik Johansson at . 2016-11-26 Bruno Haible Drop the inline specifiers from the generated lookup function. It's not adequate because - this lookup function is quite large in fact, not worth inlining, - with gcc -O0, it leads to link errors, see - the hash function is 'static', the lookup function is non-static, but references from non-static inline functions to static functions and variables are forbidden, see ISO C 99 section 6.7.4.(3). * src/output.cc (Output::output_lookup_function): Don't emit an inline specifier. * tests/*.exp: Update. Reported by Sebastian Freundt and Sergii Strelkovskyi at . 2016-11-26 Bruno Haible Change mailing list address to . * src/output.cc (Output::output): Change bug report address to . * src/options.cc (Options::long_usage): Likewise. * README: Likewise. * doc/gperf.texi (Contributors): Likewise. * tests/*.{c,exp,out}: Update. Reported by Eric Blake at . 2016-11-26 Bruno Haible Change the 'len' parameter type to 'size_t'. * src/output.cc (output_upperlower_strncmp, output_upperlower_memcmp, Output::output_hash_function, Output::output_lookup_function, Output::output): Emit declarations with 'size_t len' instead of 'unsigned int len'. * tests/*.exp: Update. * doc/gperf.texi (Output Format): Change declarations of 'hash' and 'in_word_set'. * NEWS: Mention the change. Reported by Pedro Giffuni at . 2016-11-26 Bruno Haible Use proper 'ar' program when cross-compiling or when AR is specified. * lib/configure.ac (AR): Determine through AC_CHECK_TOOL. * lib/Makefile.in (AR): Use value determined by 'configure'. Reported by György Andrasek at . 2016-11-26 Bruno Haible Avoid 'warning: cast from pointer to integer of different size' in output code on 64-bit native Windows platforms. * src/output.cc (output_keyword_entry): Cast pointer to 'size_t', not to 'long', before casting it further to 'int'. * tests/*.exp: Update. Reported at . 2016-11-26 Bruno Haible Don't use 'register' storage-class specifier in C++ output code. * src/output.cc (register_scs): New variable. (Output::Output): Initialize it. (output_upperlower_strcmp, output_upperlower_strncmp, output_upperlower_memcmp, Output::output_hash_function, Output::output_lookup_function_body, Output::output_lookup_function): Use it. Reported at . 2016-11-26 Bruno Haible Avoid 'warning: use of old-style cast' in output code. * src/output.h (Output::output_asso_values_index): New method declaration. * src/output.cc (Output::output_asso_values_index): New method, extracted from Output::output_asso_values_ref. (Output::output_asso_values_ref): Use it. In C++ mode, emit C++ style cast syntax. Reported at . 2016-11-26 Bruno Haible Avoid 'warning: implicit conversion changes signedness' in output code. * src/output.cc (Output::output_lookup_function_body): Emit declaration of 'key' as 'unsigned int', not 'int'. Optimize comparison accordingly. * tests/*.exp: Update. Reported at . 2016-11-26 Bruno Haible Avoid 'warning: implicit conversion changes signedness' in output code. * src/output.cc (Output::output_hash_function): Emit declaration of 'hval' as 'unsigned int', not 'int'. * tests/*.exp: Update. Reported at . 2016-11-25 Bruno Haible Fix g++ -Wall warnings. * src/search.cc (Search::prepare, Search::find_positions, Search::optimize): Add braces in 'if (...) for (...)', to pacify g++ 4.6.3 warnings "suggest explicit braces to avoid ambiguous 'else'" (although there is no 'else'!). 2016-11-25 Bruno Haible Fix typo in autogen.sh, introduced on 2012-07-01. * autogen.sh: Fix typo. 2016-11-25 Bruno Haible Fix "make check" error on Mac OS X. * tests/Makefile.in (POSTPROCESS_FOR_MINGW): Run 'sed' in the C locale. This fixes an error "sed: RE error: illegal byte sequence" on Mac OS X when producing languages.out. Reported at . 2016-11-23 Bruno Haible Update installation instructions for Windows. * README.windows: Assume a 64-bit Windows. Explain both 32-bit and 64-bit builds. Revamp instructions for the MS Visual C/C++ tool chain and for Cygwin. 2016-11-23 Bruno Haible Drop the nickname "woe32". * README.windows: Renamed from README.woe32. * Makefile.in (SOURCE_FILES): Update. 2016-11-19 Bruno Haible doc: Prepare for possible use of GNU texi2any. * doc/Makefile.in (TEXI2ANY): New variable. (gperf_0.html): New rule. 2016-11-19 Bruno Haible doc: Don't generate Postscript-formatted doc by default. * doc/Makefile.in (all): Don't depend on 'ps'. 2014-10-15 Eric Blake doc: fix invalid use of @itemx * doc/gperf.texi (Output Details): Use correct macro. 2012-07-01 Bruno Haible Fix "make clean" with MSVC. With MSVC 9, a program is created together with a .manifest file. * src/Makefile.in (clean): Remove also the .manifest file. * tests/Makefile.in (clean): Remove also the .manifest files. 2012-07-01 Bruno Haible Update expected test results. * tests/test-6.exp: Expect to see --constants-prefix option. 2012-07-01 Bruno Haible Fix compilation error with MSVC. * src/output.cc: Include config.h. (DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros, copied from src/search.cc. (output_constant): Use them. 2012-07-01 Bruno Haible Remove old infrastructure for building with MSVC. * autogen.sh: Don't remove src/config.h.msvc. * Makefile.devel (src/config.h.msvc): Remove rule. (all): Don't depend on it. * src/Makefile.in (GENERATED_FILES): Remove config.h.msvc. * src/.gitignore: Remove config.h.msvc. * Makefile.msvc: Remove file. * Makefile.in (SOURCE_FILES): Remove Makefile.msvc. 2012-07-01 Bruno Haible Support for building with MSVC much like for Unix. * autogen.sh: Fetch also 'compile' and 'ar-lib'. * Makefile.in (IMPORTED_FILES): Add build-aux/compile, build-aux/ar-lib. * build-aux/.gitignore: Ignore also 'compile' and 'ar-lib'. * lib/Makefile.in: Use $(OBJEXT) where suitable. * README.woe32: Change instructions for compiling with MSVC. 2012-07-01 Bruno Haible Move build infrastructure files to build-aux/. * autogen.sh: Copy install-sh and mkinstalldirst into build-aux/. * configure.ac: Invoke AC_CONFIG_AUX_DIR. * Makefile.in (IMPORTED_FILES): Update. (distdir): Create subdirectories as needed. * doc/Makefile.in (MKINSTALLDIRS): Update. * src/Makefile.in (MKINSTALLDIRS): Update. * .gitgnore: Remove install-sh, mkinstalldirs. * build-aux/.gitignore: New file. 2012-07-01 Bruno Haible Distribute install-sh. * autogen.sh: Fetch also install-sh. * Makefile.in (IMPORTED_FILES): Add install-sh. * configure.ac: Remove hack with AC_CONFIG_AUX_DIR_DEFAULT. * .gitignore: Add install-sh. 2012-07-01 Bruno Haible Remove files distributed via gnulib from version control. * autogen.sh: Fetch mkinstalldirs from the gnulib repository. * mkinstalldirs: Remove file. * .gitignore: Add mkinstalldirs. 2012-07-01 Bruno Haible Remove autotools generated files from version control. * autogen.sh: New file. * configure: Remove file. * lib/configure: Remove file. * src/configure: Remove file. * tests/configure: Remove file. * doc/configure: Remove file. * src/config.h.in: Remove file. * src/config.h.msvc: Remove file. * src/config.h_vms: Remove file. * .gitignore: Ignore configure. * lib/.gitignore: New file. * src/.gitignore: New file. * tests/.gitignore: New file. * doc/.gitignore: Ignore configure. 2012-07-01 Bruno Haible Turn doc/gperf.1 into a distributed built file. * doc/gperf.1: Remove file. * Makefile.devel (doc/gperf.1): Remove rule. (all): Don't depend on it. * doc/Makefile.in (man, gperf.1, gperf.1-update): New rules. (all): Depend on man. (distdir): Depend on gperf.1-update. (GENERATED_FILES): Remove gperf.1. (DISTRIBUTED_BUILT_FILES): Add gperf.1. * doc/.gitignore: Add gperf.1. * configure (AC_INIT): Rely on doc/gperf.texi, not doc/gperf.1. * doc/configure (AC_INIT): Rely on gperf.texi, not gperf.1. 2012-07-01 Bruno Haible Remove distributed built files from version control. * doc/.gitignore: New file. * doc/gperf.info: Remove file. * doc/gperf.dvi: Remove file. * doc/gperf.ps: Remove file. * doc/gperf.pdf: Remove file. * doc/gperf.html: Remove file. * doc/gperf_toc.html, doc/gperf_[0-9].html, doc/gperf_[0-9][0-9].html: Remove files. 2012-07-01 Bruno Haible Allow editor backup files in git checkouts. * .gitignore: New file. 2012-07-01 Bruno Haible Create tarballs through an Automake-like "make dist" command. * Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES, DISTRIBUTED_BUILT_FILES, DISTFILES): New macros. (distdir): New rule. (PACKAGE, VERSION, TAR, GZIP): New macros. (dist): New rule. * doc/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES, DISTRIBUTED_BUILT_FILES, DISTFILES): New macros. (distdir): New rule. * lib/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES, DISTRIBUTED_BUILT_FILES, DISTFILES): New macros. (distdir): New rule. * src/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES, DISTRIBUTED_BUILT_FILES, DISTFILES): New macros. (distdir): New rule. * tests/Makefile.in (SOURCE_FILES, IMPORTED_FILES, GENERATED_FILES, DISTRIBUTED_BUILT_FILES, DISTFILES): New macros. (distdir): New rule. 2012-04-28 Bruno Haible * configure: Regenerated with autoconf-2.69. * doc/configure: Likewise. * lib/configure: Likewise. * src/configure: Likewise. * tests/configure: Likewise. 2011-01-16 Bruno Haible * src/options.cc (Options::parse_options): Bump copyright year. New option --constants-prefix. * src/options.h (Options): Add member functions get_constants_prefix, set_constants_prefix. Add member _constants_prefix. * src/options.icc (Options::get_constants_prefix): New functions. * src/options.cc (DEFAULT_CONSTANTS_PREFIX): New constant. (Options::long_usage): Document --constants-prefix option. (Options::Options): Initialize _constants_prefix member. (Options::set_constants_prefix): New function. (long_options): Add --constants-prefix option. (Options::parse_options): Handle --constants-prefix option. * src/input.cc (Input::read_input): Handle %define constants-prefix declaration. * src/output.cc (output_constant): New function. (Output::output_constants): Invoke it. (Output::output_lookup_function_body): Prefix each reference to a constant with the constants prefix. * doc/gperf.texi: Bump copyright year. (Gperf Declarations): Document %define constants-prefix. (Controlling Identifiers): New section. (Output Details): Document --constants-prefix option. * NEWS: Mention the changes. Reported by Julian Zubek . 2011-01-16 Bruno Haible * configure: Regenerated with autoconf-2.68. * doc/configure: Likewise. * lib/configure: Likewise. * src/configure: Likewise. * tests/configure: Likewise. 2010-07-31 Bruno Haible * configure: Regenerated with autoconf-2.67. * doc/configure: Likewise. * lib/configure: Likewise. * src/configure: Likewise. * tests/configure: Likewise. 2010-07-04 Bruno Haible * configure: Regenerated with autoconf-2.66. * doc/configure: Likewise. * lib/configure: Likewise. * src/configure: Likewise. * tests/configure: Likewise. * src/config.h.in: Likewise. * src/config.h.msvc: Likewise. * src/config.h_vms: Likewise. 2010-03-30 Bruno Haible Modernize README.woe32. * README.woe32: Mention the mingw and Cygwin environments. 2009-12-22 Eric Blake (tiny change) Avoid gcc warnings on Cygwin. * lib/getopt.c (_getopt_internal): Add braces. Fix indentation. * tests/smtp.gperf: Cast arguments of functions. * tests/test2.c: Include . 2009-12-22 Bruno Haible Avoid g++ warnings. * src/options.cc (Options::print_options): Add parentheses. * src/output.cc (Output::output_lookup_array): Cast fprintf argument. 2009-12-22 Bruno Haible Support CPPFLAGS as mandated by GNU standards. * lib/Makefile.in (CPPFLAGS): Use autoconf determined value. * src/Makefile.in (CPPFLAGS): Likewise. * tests/Makefile.in (CPPFLAGS): Likewise. (check-c, check-ada, check-modula3, check-pascal, check-lang-utf8, test.$(OBJEXT), check-lang-ucs2, test2.$(OBJEXT), check-smtp): Use CPPFLAGS when compiling a .c file. (VALIDATE): Pass also CPPFLAGS. * tests/validate: Use CPPFLAGS when compiling a C or C++ file. 2009-12-20 Bruno Haible * doc/gperf.info: Regenerated. * doc/gperf*.html: Likewise. * doc/gperf.dvi: Likewise. * doc/gperf.ps: Likewise. * doc/gperf.pdf: Likewise. * tests/*.exp: Update. Change the default language to ANSI-C. * src/options.cc (Options::long_usage): Mention new default language. (Options::Options): Change default of _option_word. (Options::set_language): Change fallback. * doc/gperf.texi (Gperf Declarations, Output Language): Mention new default language. * NEWS: Mention the change. Reported by Albert Cahalan . * src/version.cc (version_string): Bump to 3.1. * doc/gperf.texi: Bump version. 2009-12-20 Bruno Haible Allow processing the tests with parallel make. * tests/Makefile.in (check-link-c, check-link-c++): Remove rules. (test.$(OBJEXT), test2.$(OBJEXT)): New rules. (check-c): Add commands for building cout. Depend on test.$(OBJEXT). (check-ada, check-modula3, check-pascal, check-lang-utf8): Depend on test.$(OBJEXT). (check-lang-ucs2): Depend on test2.$(OBJEXT). Reported by Bryan Østergaard . 2009-02-01 Brendan Kehoe * gperf-3.0.4 released. * src/version.cc: Bump to 3.0.4. * tests/*.exp: Bump to 3.0.4 in header. * doc/gperf.1: Regenerate with gperf 3.0.4. * doc/gperf.texi: Adjust version. * doc/texinfo.tex: Update to copy from texinfo-4.13. 2009-02-01 Bruno Haible * tests/Makefile.in (LDFLAGS, OBJEXT, EXEEXT): New variables. (check-link-c, check-ada, check-modula3, check-pascal, check-lang-utf8, check-lang-ucs2): Use OBJEXT and LDFLAGS. (check-smtp): Use LDFLAGS. (clean): Use EXEEXT as suffix of programs to be removed. * aclocal.m4 (CL_PROG_INSTALL): Fix detection of broken AIX installbsd program. * tests/Makefile.in (clean): Remove *.dSYM directories left over by gcc on MacOS X 10.5. * src/options.cc (Options::parse_options): Bump copyright year. 2009-01-19 Bruno Haible Don't include the length in the hash function if all keywords have the same length. * src/search.h (Search): Add _hash_includes_len field. * src/search.cc (Search::prepare): Initialize it. (Search::count_duplicates_tuple, Search::count_duplicates_multiset, Search::prepare_asso_values, Search::find_asso_values, Search::compute_hash): Use it instead of !option[NOLENGTH]. * src/output.h (Output): New field _hash_includes_len. Add it as constructor argument. * src/output.cc (Output::Output): Add hash_includes_len argument. (Output::output_hash_function): Use _hash_includes_len instead of !option[NOLENGTH]. * src/main.cc (main): Pass _hash_includes_len from Search to Output. * tests/permut2.exp: Updated expected test result. * tests/permut3.exp: Likewise. * tests/permutc2.exp: Likewise. Reported by Behdad Esfahbod . 2009-01-14 Bruno Haible * configure.ac: More consistent m4 quoting. * src/configure.ac: Likewise. * lib/configure.ac: Likewise. * tests/configure.ac: Likewise. * doc/configure.ac: Likewise. 2009-01-01 Bruno Haible * doc/gperf.texi (Gperf Declarations): Mention the C99 standard. 2008-08-23 Bruno Haible * doc/gperf.texi (Output Copyright): Reword more carefully. Suggested by Paul Jarc . 2008-08-23 Bruno Haible * doc/gperf.texi (Output Copyright): Adjust for GPLv3. 2008-08-23 Bruno Haible All source files are now under GPLv3+. * COPYING: Replace with GPLv3. * **/configure.ac, **/Makefile.*, **/*.h, **/*.c, **/*.cc, **/*.icc: Change copyright notice to GPLv3+. * src/options.cc (Options::parse_options): Update --version output accordingly. * doc/gperf.texi: Reference the GPLv3. * doc/gpl-3.0.texi: New file, copied from the gnulib git repository. * doc/gpl.texinfo: Remove file. * doc/Makefile.in: Update. 2008-05-06 Bruno Haible * doc/gperf.texi: Set @firstparagraphindent. (Bibliography): Don't indent the entries. 2008-05-06 Bruno Haible * doc/gperf.texi (Output Copyright): New section. Reported by Mike Ingrassia and Karice McIntyre . 2008-04-06 Bruno Haible * tests/Makefile.in: Use "LC_ALL=C tr" instead of "tr". 2007-09-08 Bruno Haible Change generated code to avoid a warning by GCC 4.2 that the meaning of __inline will be changed (!). * src/output.cc (Output::output_lookup_function): Emit the inline marker also for gcc-4.2 in c99 mode. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. Reported by Jim Meyering . 2007-09-08 Bruno Haible Allow creating the HTML documentation with texi2html or makeinfo. * doc/texi2html: New file, from GNU gettext. * doc/Makefile.in (TEXI2HTML): Invoke it. (gperf.html, gperf_toc.html): Don't pass option -expandinfo. * doc/gperf.texi (makeinfo): New variable. (dircategory, direntry): Enclose in @ifinfo. (Table of Contents): Move to the beginning except in TeX mode. 2007-04-30 Brendan Kehoe * gperf-3.0.3 released. * src/version.cc: Bump to 3.0.3. * tests/*.exp: Bump to 3.0.3 in header. * doc/gperf.1: Regenerate with gperf 3.0.3. 2007-04-06 Bruno Haible Improve support for mingw. * tests/Makefile.in (check-c, check-ada, check-modula3, check-pascal, check-lang-utf8, check-lang-ucs2): Remove '\r' from output before diff. (POSTPROCESS_FOR_MINGW): New variable. (check-test): Use it to postprocess output before diff. 2007-04-04 Bruno Haible Support for newer GNU standards. * doc/configure.ac (mandir): Remove assignment. * doc/Makefile.in (datarootdir): New variable. (docdir, dvidir, psdir, pdfdir, htmldir): Use value determined by autoconf. * configure.ac: Require autoconf >= 2.60. * doc/configure.ac: Likewise. * lib/configure.ac: Likewise. * src/configure.ac: Likewise. * tests/configure.ac: Likewise. * configure: Regenerated with autoconf-2.61. * doc/configure: Likewise. * lib/configure: Likewise. * src/configure: Likewise. * tests/configure: Likewise. * src/config.h.in: Likewise. * src/config.h.msvc: Likewise. * src/config.h_vms: Likewise. 2007-04-04 Bruno Haible * doc/Makefile.in (MAKEINFO): Disable also the LC_MESSAGES and LC_ALL environment variables. 2007-04-04 Bruno Haible * configure.ac: Renamed from configure.in. * doc/configure.ac: Renamed from doc/configure.in. * lib/configure.ac: Renamed from lib/configure.in. * src/configure.ac: Renamed from src/configure.in. * tests/configure.ac: Renamed from tests/configure.in. * Makefile.devel: Update. * INSTALL: Update. 2007-03-31 Bruno Haible * tests/test.c (in_word_set): New declaration. * tests/test2.c (in_word_set): Likewise. 2007-03-31 Bruno Haible * src/options.cc (Options::parse_options): Bump copyright year. 2007-03-31 Bruno Haible * doc/gperf.texi: Fix typo. 2007-03-31 Bruno Haible Change generated code after the meaning of __inline is changed in GCC 4.3. * src/output.cc (Output::output_lookup_function): Emit an inline marker that also works with gcc-4.3 in c99 or gnu99 mode. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. Reported by Bruce Korb . 2006-06-29 Brendan Kehoe * gperf-3.0.2 released. * doc/Makefile.in (all): No longer depend on dvi. 2006-01-22 Brendan Kehoe * doc/gperf.texi: Update copyright to be 1989-2006. (UPDATED): Change to 22 January 2006. * doc/gperf.1 (TH): Fix date. * configure.in: Update copyright years. * configure: Regenerate. * src/Makefile.in: Update copyright years. * doc/gperf.{dvi,ps,pdf}: Regenerated by manually invoking tex instead of trying to use texi2dvi, whose run of etex ends up actually always running pdfetex, thus always recreating gperf.pdf. 2006-01-13 Brendan Kehoe * NEWS: Add note about #line directive fix. * doc/gperf.1: Regenerate with Makefile.devel. * doc/gperf.texi (UPDATED): Correct to be today. * doc: Regenerated by doing make in a configured tree. Requires makeinfo, texi2dvi, texi2pdf, and texi2html. * configure.in: Add AC_OBJEXT and AC_EXEEXT. * lib/Makefile.in (OBJEXT): Define for subst. (OBJECTS): Use $(OBJEXT) instead of '.o'. * src/Makefile.in: Make dependencies use $(OBJEXT). (OBJEXT, EXEEXT): Define for subst. (TARGETPROG): Add $(EXEEXT). (OBJECTS): Use $(OBJEXT) instead of '.o'. (clean): Remove *.$(OBJEXT) instead of *.o. 2006-01-13 Bruno Haible Fix #line directives for filenames containing backslashes. * src/output.cc (output_line_directive): New function. (output_keyword_entry, Output::output): Use it. Reported by Alexander . * src/options.cc (Options::parse_options): Update years in --version output. 2005-08-29 Brendan Kehoe * src/keyword.cc: Tweak comment to avoid nesting. 2005-08-27 Bruno Haible Fix missing ranlib detection when cross-compiling. * aclocal.m4 (CL_PROG_RANLIB): Remove macro. * lib/configure.in: Use AC_PROG_RANLIB instead of CL_PROG_RANLIB. 2005-07-30 Bruno Haible * src/version.cc: Bump version number to 3.0.2. * doc/gperf.texi: Likewise. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. 2005-07-30 Bruno Haible * src/positions.h: Add forward declarations of friend classes. Needed for compilation with g++ 4.0. 2004-08-22 Bruno Haible * tests/Makefile.in (check-lang-syntax): Add test for the --length-table-name option. * tests/test-6.exp: Update. 2004-08-21 Bruce Lilly * src/input.cc (Input::read_input): Accept length-table-name declaration. * src/options.h (Options::get_lengthtable_name, Options::set_lengthtable_name): New declarations. (Options): Add field _lengthtable_name. * src/options.icc (Options::get_lengthtable_name): New inline method. * src/options.cc (DEFAULT_LENGTHTABLE_NAME): New constant. (Options::long_usage): Document --length-table-name option. (Options::Options): Initialize _lengthtable_name field. (Options::~Options): Update. (Options::set_lengthtable_name): New method. (long_options): Add option --length-table-name. (Options::parse_options): Implement --length-table-name option. * src/output.cc (Output::output_keylength_table, output_switch_case, Output::output_lookup_function_body): Use option.get_lengthtable_name. * doc/gperf.texi (Gperf Declarations): Document %define length-table-name. (Output Details): Document --length-table-name option. 2003-06-12 Bruno Haible * gperf-3.0.1 released. * src/version.cc: Bump version number to 3.0.1. * doc/gperf.texi: Likewise. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/incomplete.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. 2003-05-31 Bruno Haible * doc/gperf.texi (User-supplied Struct): Mention the possibility of an abbreviated struct declaration. * src/input.cc (Input::read_input): Support struct declarations of the form "struct foo;". * tests/incomplete.gperf: New file. * tests/incomplete.exp: New file. * tests/Makefile.in (check-test): Check incomplete.gperf too. Reported by Rob Leslie . 2003-05-20 Bruno Haible * doc/Makefile.in (gperf.ps): Don't use $< in a target rule. 2003-05-27 Bruno Haible * Makefile.vms (CC): Correct value. (getopt.obj, getopt1.obj, getline.obj, hash.obj): Don't set HAVE_CONFIG_H. 2003-05-17 Bruno Haible * Makefile.msvc (DEBUGFLAGS): New variable. (gperf.exe): Use it, and MFLAGS too. 2003-05-08 Bruno Haible * gperf-3.0 released. 2003-05-07 Bruno Haible * src/version.cc: Bump version number to 3.0. * doc/gperf.texi: Likewise. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. * src/configure.in: Fix AC_INIT argument. * Makefile.devel (configure, lib/configure, src/configure, tests/configure, doc/configure): Use the newest autoconf. (src/config.h.in): Use the newest autoheader. 2003-05-03 Bruno Haible * doc/gperf.texi: Use two spaces as sentence separator, as recommended by the texinfo manual. 2003-04-12 Bruno Haible * doc/configure.in (mandir): Change default value. * doc/Makefile.in (docdir): Use datadir instead of prefix. * Makefile.msvc (datadir): New variable. (mandir, docdir): Use it instead of prefix. (install, installdirs): Update. * Makefile.vms (datadir): New variable. (mandir, docdir): Use it instead of prefix. (install, installdirs): Update. 2003-04-12 Bruno Haible * README.vms: New file. * Makefile.vms: New file. * Makefile.devel (src/config.h_vms): New rule. (all): Depend on it. 2003-03-19 Bruno Haible * src/input.cc (Input::read_input): Ignore comments at the beginning of the declarations section. * doc/gperf.texi (Controls for GNU indent): New section. Reported by Bruce Lilly . 2003-03-19 Bruno Haible * src/output.cc (Output::output_hash_function): Avoid lint warning if not all arguments of the hash function are used. Avoid lint warning for fallthrough in switch. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp: All /*FALLTHROUGH*/ to expected output. Reported by Bruce Lilly . 2003-03-01 Bruno Haible * src/options.h (Options::set_initializer_suffix): New declaration. * src/options.cc (Options::set_initializer_suffix): New method. * src/input.cc (Input::read_input): Recognize %define initializer-suffix. * doc/gperf.texi (Gperf Declarations): Document %define initializer-suffix. * NEWS: Update. 2003-02-26 Bruno Haible * Makefile.msvc: New file. * README.woe32: New file. * Makefile.devel (all): Depend on src/config.h.msvc. (src/config.h.msvc): New rule. 2003-01-07 Bruno Haible * src/input.h (Input::_charset_dependent): New field. * src/input.cc (Input::read_input): Also set _charset_dependent. * src/main.cc (main): Pass _charset_dependent from Input to Output. * src/output.h (Output::Output): Add charset_dependent argument. (Output::_charset_dependent): New field. * src/output.cc (Output::Output): Add charset_dependent argument. (Output::output): Provoke a compilation error if the execution character set doesn't match the expectations. * tests/c-parse.exp, tests/charsets.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/java.exp, tests/languages.exp, tests/modula2.exp, tests/objc.exp, tests/permut2.exp, tests/permut3.exp, tests/permutc2.exp, tests/test-4.exp: Update. * src/options.cc (Options::long_usage): Change bug report address to . * tests/test-6.exp: Update. * src/output.cc (USE_DOWNCASE_TABLE): New macro. (output_upperlower_table): New function. (output_upperlower_strcmp, output_upperlower_strncmp, output_upperlower_memcmp): Emit gperf_downcase array accesses. (Output::output): Call output_upperlower_table. * tests/permutc2.exp: Update. * src/keyword-list.icc (KeywordExt_List::rest): Use a portable cast. (Only in GCC a cast of an lvalue is an lvalue.) 2003-01-01 Bruno Haible * src/options.cc (Options::parse_options): Update copyright year. * doc/gperf.texi (@author): Add me. * src/options.h (NULLSTRINGS): New enum value. (Options::get_stringpool_name, Options::set_stringpool_name): New method declarations. (Options::_stringpool_name): New field. * src/options.icc (Options::get_stringpool_name): New method. * src/options.cc (DEFAULT_STRINGPOOL_NAME): New variable. (Options::long_usage): Document -Q and --null-strings. (Options::Options): Initialize _stringpool_name. (Options::~Options): Output _stringpool_name, NULLSTRINGS values too. (Options::set_stringpool_name): New method. (long_options): Add options --string-pool-name, --null-strings. (Options::parse_options): Implement options -P, -Q and --null-strings. * src/input.cc (Input::read_input): Recognize declarations %pic, %define string-pool-name, %null-strings. * src/output.h (Output::output_string_pool, Output::output_lookup_pools): New method declarations. (Output::_wordlist_eltype): New field. * src/output.cc (Output::output_keylength_table): Trivial simplification. (Output::output_string_pool): New method. (output_keyword_entry): Add stringpool_index argument. For SHAREDLIB, use struct offsets. (output_keyword_blank_entries): For SHAREDLIB, use -1 instead of "". (Output::output_keyword_table): Use _wordlist_eltype instead of _struct_tag. Compute stringpool_index for output_keyword_entry. (Output::output_lookup_pools): New method. (Output::output_lookup_function_body): Use _wordlist_eltype instead of _struct_tag. For SHAREDLIB, use "+ stringpool" to convert offsets to strings. Use "o >= 0" to test for nonempty table entry. (Output::output_lookup_function): Call output_lookup_pools. (Output::output): Initialize _wordlist_eltype. Call output_lookup_pools. * tests/jstest4.gperf: New file. * tests/test-6.exp: Update. * tests/Makefile.in (check-lang-syntax): Drop test of -p. Add tests of -P and -Q. * doc/gperf.texi (User-supplied Struct): Mention that first field has to be of type 'int' if -P is given. (Gperf Declarations): Document %pic, %define string-pool-name, %null-strings. (Output Details): Update description of option -P. Document options -Q and --null-strings. * tests/Makefile.in (check-link-c, check-ada, check-pascal, check-test): Omit option -p. * tests/c-parse.exp: Regenerated. * tests/chill.exp: Regenerated. * tests/cplusplus.exp: Regenerated. * tests/gpc.exp: Regenerated. * tests/java.exp: Regenerated. * tests/objc.exp: Regenerated. * tests/test-4.exp: Regenerated. * src/output.cc (Output::output_lookup_function_body): Omit the multicompare code section and its variables when it is not used. * tests/chill.exp: Regenerated. * src/output.c (Output_Compare::output_firstchar_comparison): New method. (Output_Compare_Strcmp::output_comparison, Output_Compare_Strncmp::output_comparison, Output_Compare_Memcmp::output_comparison): Use it. * tests/permutc2.exp: Update. * tests/smtp.gperf: New file, based on a contribution by Bruce Lilly. * tests/Makefile.in (check-smtp): New rule. (check): Depend on it. (clean): Update. 2002-12-12 Bruno Haible * src/search.h (Search::init_selchars_tuple, Search::count_duplicates_tuple): Add alpha_unify argument. (Search::count_duplicates_tuple): New method declaration. * src/search.cc (Search::init_selchars_tuple, Search::count_duplicates_tuple): Add alpha_unify argument. (Search::find_positions): Update. (Search::count_duplicates_tuple): New method. (Search::count_duplicates_multiset): Free temp alpha_unify vector. (Search::find_alpha_inc): Call count_duplicates_tuple. * src/configure.in: Add test for stack-allocated variable-size arrays. * src/config.h.in: Regenerated. * src/search.cc: Include config.h. (DYNAMIC_ARRAY, FREE_DYNAMIC_ARRAY): New macros. (Search::find_alpha_inc, Search::count_possible_collisions, Search::find_asso_values): Use them. * src/Makefile.in (search.o): Depend on config.h. * src/search.h (Search::keyword_list_length, Search::max_key_length, Search::get_max_keysig_size, Search::prepare): Remove declarations. (Search::prepare): Renamed from Search::preprepare. (Search::_max_selchars_length): New field. * src/search.cc (Search::prepare): Renamed from Search::preprepare. (Search::prepare_asso_values): Merged with old Search::prepare. Initialize _max_selchars_length. (Search::keyword_list_length): Remove function. Use _list_len instead. (Search::max_key_length): Remove function. Use _max_key_len instead. (Search::get_max_keysig_size): Remove function. Use _max_selchars_length instead. (Search::count_possible_collisions, Search::find_asso_values): Update. (Search::find_good_asso_values): Call just prepare_asso_values. (Search::~Search): Update. * src/output.h (Output::output_asso_values_ref): New declaration. * src/output.cc (char_to_index): Remove variable. (Output::output_asso_values_ref): New function. (Output::output_hash_function): Use it. (Output::output): Update. * src/positions.h (Positions::is_useall, Positions::set_useall, Positions::iterator, Positions::reviterator): New method declarations. (Positions::_useall): New field. (PositionIterator): Make constructor private. Add a constructor and a copy constructor. (PositionIterator::remaining): New declaration. (PositionReverseIterator): Make constructor private. Add a constructor and a copy constructor. (PositionReverseIterator::remaining): New declaration. (PositionReverseIterator::_minindex): New field. * src/positions.icc (Positions::Positions): Initialize _useall. (Positions::operator=): Likewise. (Positions::is_useall, Positions::set_useall): New methods. (Positions::sort): Do nothing if _useall is set. (Positions::iterator, Positions::reviterator): New methods. (PositionIterator::PositionIterator): New constructor. (PositionIterator::remaining): New method. (PositionReverseIterator::PositionReverseIterator): New constructor. (PositionReverseIterator::next): Use _minindex as bound. (PositionReverseIterator::remaining): New method. * src/positions.cc (Positions::add, Positions::remove): Reset the useall flag. (Positions::print): Handle the useall case. * src/options.h (ALLCHARS): Remove. * src/options.cc (Options::~Options): Update. (Options::parse_options): Use Positions::set_useall(). * src/keyword.h (KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low): Remove use_all_chars argument. * src/keyword.cc (KeywordExt::init_selchars_low): Remove use_all_chars argument. Tell the position iterator to stop at _allchars_length. Remove special case code for -k'*'. (KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset): Remove use_all_chars argument. * src/search.h (Search::init_selchars_tuple): Remove use_all_chars argument. (Search::init_selchars_multiset): Likewise. * src/search.cc (Search::init_selchars_tuple): Remove use_all_chars argument. (Search::count_duplicates_tuple, Search::find_positions): Update. (Search::compute_alpha_unify): Remove special case code for -k'*'. (Search::init_selchars_multiset): Remove use_all_chars argument. (Search::count_duplicates_multiset): Update. (Search::find_alpha_inc): Remove special case code for -k'*'. (Search::prepare): Update. (Search::get_max_keysig_size): Update. * src/output.cc (Output::output_hash_function): Remove special case code for -k'*'. * tests/chill.exp: Regenerated. 2002-12-11 Bruno Haible Change the positions to be 0-based, instead of 1-based. * src/positions.h (Positions::LASTCHAR): Set to -1. (Positions::MAX_SIZE): New constant. (Positions::pointer): Change return type. (Positions::_positions): Change element type. (PositionIterator::EOS, PositionReverseIterator::EOS): Set to -2. * src/positions.icc (Positions::pointer): Change return type. (Positions::sort): Update. * src/positions.cc (Positions::contains, Positions::add, Positions::remove): Update. (Positions::print): Update. Fix off-by-one bug. * src/options.cc (Options::~Options): Update. (Options::parse_options): Set BAD_VALUE to -3. Update. * src/keyword.cc (KeywordExt::init_selchars_low): Update. * src/search.cc (Search::find_positions, Search::compute_alpha_unify, Search::find_alpha_inc): Update. * src/output.cc (Output::output_hash_function): Update. Don't emit a 'case' statement right after 'default:'. * tests/c-parse.exp: Regenerated. * tests/charsets.exp: Regenerated. * tests/cplusplus.exp: Regenerated. * tests/java.exp: Regenerated. * tests/languages.exp: Regenerated. * tests/modula2.exp: Regenerated. * tests/objc.exp: Regenerated. 2002-12-10 Bruno Haible * src/options.h: Reorder enum values. (Options::short_usage, Options::long_usage): Make static. * src/options.cc (Options::short_usage); No longer print a monster usage line. (Options::print_options): Improve output of options like --key-positions=1,2,$. (Options::~Options): Update. * src/options.h (UPPERLOWER): New enum value. * src/options.cc (Options::long_usage): Document option --ignore-case. (Options::~Options): Update. (long_options): Add option --ignore-case. (Options::parse_options): Handle option --ignore-case. * src/input.cc (Input::read_input): Recognize option %ignore-case. * src/keyword.h (KeywordExt::init_selchars_tuple, KeywordExt::init_selchars_multiset, KeywordExt::init_selchars_low): Add alpha_unify argument. * src/keyword.cc (KeywordExt::init_selchars_low): Add alpha_unify argument. (KeywordExt::init_selchars_tuple): Add alpha_unify argument. (KeywordExt::init_selchars_multiset): Add alpha_unify argument. * src/search.h (Search::compute_alpha_size, Search::compute_alpha_unify): New declarations. (Search::init_selchars_multiset): Add alpha_unify argument. (Search::_alpha_unify): New field. * src/search.cc (Search::compute_alpha_size, Search::compute_alpha_unify): New functions. (Search::init_selchars_tuple): Update. (Search::find_positions): Temporarily set _alpha_unify. Perform a case insensitive comparison if needed. (Search::init_selchars_multiset): Add alpha_unify argument. (Search::count_duplicates_multiset): Call compute_alpha_unify. (Search::find_alpha_inc): Temporarily set _alpha_unify. At the end, set _alpha_size and _alpha_unify. (Search::prepare): Update. Don't compute _alpga_size here. (Search::optimize): Propagate unified asso_values. (Search::~Search) Delete _alpha_unify. * src/output.cc (output_upperlower_strcmp, output_upperlower_strncmp, output_upperlower_memcmp): New functions. (Output_Compare_Strcmp::output_comparison, Output_Compare_Strncmp::output_comparison, Output_Compare_Memcmp::output_comparison): Use the case-insensitive comparison function if --ignore-case was given. (Output::output): Emit the auxiliary case-insensitive comparison function if needed. * tests/permutc2.gperf, tests/permutc2.exp: New files. * tests/Makefile.in (check-test): Also check permutc2.gperf. * tests/test-6.exp: Update. * doc/gperf.texi (Gperf Declarations): Document %ignore-case. (Input Details): Document option --ignore-case. * NEWS: Update. * src/search.cc (Search::optimize): Fill unused asso_values[] entries with a large value. * src/output.h (Output::Output): Remove occurrences argument. (Output::_occurrences): Remove field. * src/output.cc (Output::Output): Remove occurrences argument. (Output::output_hash_function): Ignore _occurrences. * src/main.cc (main): Don't pass the _occurrences to Output. * src/search.cc (Search::preprepare): Exit if keywords contain out-of-range characters. * src/search.cc (for): Define so as to avoid errors with old compilers. * src/options.h (SHAREDLIB): New enum value. * src/options.cc (Options::short_usage): Mention option -P. (Options::long_usage): Document option -P. (long_options): Add option --pic. (Options::parse_options): Handle option -P/--pic. * src/output.cc (output_keyword_blank_entries): When SHAREDLIB is specified, emit NULL pointers instead of "". (Output::output_lookup_function_body): When SHAREDLIB is specified and SWITCH and DUP and not specified, test the table entry against NULL before the string comparison. * tests/test-6.exp: Update. * doc/gperf.texi (Output Details): Document option -P. * NEWS: Update. Suggested by Ulrich Drepper. 2002-12-08 Bruno Haible * tests/permut2.gperf, tests/permut2.exp: New files. * tests/permut3.gperf, tests/permut3.exp: New files. * tests/charsets.gperf: New file, from Bruce Lilly. * tests/charsets.exp: New file. * tests/languages.gperf: New file, from Bruce Lilly. * tests/languages.exp: New file. * Makefile.in (check-test): Test them all. Completely new asso_values search algorithm. * src/search.h (Search::compute_occurrence, Search::clear_determined, Search::set_determined, Search::already_determined, Search::reorder): Remove functions. (Search::init_asso_values, Search::sort_by_occurrence, Search::compute_occurrence, Search::sort_by_occurrence, Search::has_collisions, Search::collision_prior_to): Remove functions. (Search::compute_partition, Search::count_possible_collisions, Search::unchanged_partition): New method declarations. (Search::_determined): Remove field. * src/search.cc (Search::prepare): Don't initialize _determined. (Search::compute_occurrence, greater_by_occurrence, Search::clear_determined, Search::set_determined, Search::already_determined, Search::reorder): Remove functions. (Search::init_asso_values, compute_disjoint_union, Search::sort_by_occurrence, Search::compute_occurrence, Search::sort_by_occurrence, Search::has_collisions, Search::collision_prior_to): Remove functions. (StackEntry): Remove class. (EquivalenceClass, Step): New classes. (equals, Search::compute_partition, delete_partition, Search::count_possible_collisions, Search::unchanged_partition): New functions. (Search::find_asso_values): Completely rewritten. (Search::find_good_asso_values): Don't call reorder(). (Search::~Search): Don't free _determined. * src/keyword.h (KeywordExt::_occurrence): Remove field. * src/options.h (ORDER, FAST, OPT_CHOICE): Remove enum values. (Options::_iterations): Remove field. * src/options.icc (Options::get_iterations): Remove method. * src/options.cc (Options::long_usage): Remove mention of -f and -o. (Options::Options): Don't initialize _iterations. (Options::~Options): Update. (Options::parse_options): Do nothing for options -f, -o, -O. * doc/gperf.texi: (Contributors): Update. (Algorithmic Details): Remove options -f and -o. Update description of option -s. * tests/c-parse.exp, tests/chill.exp, tests/cplusplus.exp, tests/gpc.exp, tests/java.exp, tests/modula2.exp, tests/objc.exp, tests/test-4.exp): Regenerated, smaller than before. * tests/test-6.exp: Update. * NEWS: Update. 2002-12-08 Bruno Haible * src/search.h (Search::_alpha_size): Change type to 'unsigned int'. (Search::_asso_value_max): Likewise. * src/search.cc (Search::prepare_asso_values): Update. (Search::init_asso_values): Update. (Search::~Search): Update. * src/output.h (Output::Output): Change alpha_size type to 'unsigned int'. (Output::_alpha_size): Change type to 'unsigned int'. * src/output.cc (Output::Output): Change alpha_size type to 'unsigned int'. (Output::output_hash_function): Update. 2002-12-07 Bruno Haible * src/options.h (OPT_CHOICE): New enum value. * src/options.cc (Options::~Options): Update. (long_options): New option --optimized-collision-resolution. (Options::parse_options): Accept option -O. * src/search.h (Search::sort_by_occurrence): Change argument to 'unsigned int'. (Search::compute_occurrence, Search::sort_by_occurrence): New method declarations. * src/search.cc (Search::sort_by_occurrence): Change argument to 'unsigned int'. (Search::compute_occurrence, Search::sort_by_occurrence): New methods. (Search::find_asso_values): Implement OPT_CHOICE. More debugging output. * src/search.cc (Search::prepare_asso_values) [DEBUG]: Also print the keyword list in order. (Search::find_asso_values) [DEBUG]: Upon failure, print the union_set. * src/options.h (Options::get_size_multiple): Change return type to float. (Options::_size_multiple): Change type to float. * src/options.icc (Options::get_size_multiple): Change return type to float. * src/options.cc (Options::long_usage): Update description of option -s. (Options::~Options): Update. (Options::parse_options): For option -s, accept a fraction. * src/search.cc (Search::prepare_asso_values): Use get_size_multiple as it is. * tests/test-6.exp: Update. * doc/gperf.texi (Algorithmic Details): Update description of option -s. 2002-12-04 Bruno Haible Improve debugging output. * src/hash-table.h (Hash_Table::dump): New method. * src/hash-table.cc (Hash_Table::dump): New method, extracted from destructor. (Hash_Table::~Hash_Table): No longer print the contents. * src/positions.h (PositionReverseIterator): New class. * src/positions.icc (PositionReverseIterator::PositionReverseIterator, PositionReverseIterator::next): New methods. * src/search.cc (Search::find_positions): If debugging, print the result. (Search::find_alpha_inc): If debugging, print the result. (Search::prepare): Explicitly dump the hash table's contents here. Portability fixes. * src/positions.h (Positions::LASTCHAR, Positions::MAX_KEY_POS, PositionIterator::EOS): Define as compile-time constants using enum. * src/bool-array.cc (Bool_Array::~Bool_Array): Remove const qualifier of pointer to be deleted. * src/input.cc (Input::~Input): Likewise. * src/keyword.cc (KeywordExt::delete_selchars): Likewise. * src/main.cc (main): Likewise. * src/hash-table.cc (Hash_Table::~Hash_Table): Limit scope of 'for' variables. * src/search.cc (Search::prepare_asso_values): Use a static_cast to convert from time_t to long. This is possible because ISO C 99 says time_t is a numeric type. 2002-11-20 Bruno Haible * src/search.cc (Search::find_asso_values): Avoid gcc warnings about uninitialized variables. Implement backtracking. * src/search.h (Search::has_collisions): Renamed from Search::less_collisions. Return a boolean. * src/search.cc (Search::has_collisions): Renamed from Search::less_collisions. Return a boolean. (StackEntry): Remove field _collisions_so_far. (Search::find_asso_values): Backtrack when encountering an unresolved collision. Assume collisions_so_far is always zero. (Search::optimize): Exit if there are accidental duplicates at the end. * src/output.cc (Output::num_hash_values): Simply return the list length. (Output::output_keylength_table): Remove handling of accidental duplicates. (Output::output_keyword_table, Output::output_lookup_array): Likewise. (output_switch_case, output_switches): Likewise. * doc/gperf.texi (Algorithmic Details): Adjust description of options -D, -f, -o, -r. (Bugs): Remove note about missing backtracking. (Projects): Likewise. 2002-11-19 Bruno Haible Prepare for backtracking. * src/search.h (Search::try_asso_value, Search::change_some_asso_value): Remove declarations. (Search::less_collisions, Search::collision_prior_to): New declarations. (Search::_fewest_collisions, Search::_union_set, Search::_num_done): Remove fields. * src/search.cc (Search::prepare_asso_values): Don't initialize _union_set. (Search::try_asso_value, Search::change_some_asso_value): Remove methods. (Search::less_collisions, Search::collision_prior_to): New methods. (StackEntry): New class. (Search::find_asso_values): Reorganized to use pseudo-recursion. (Search::~Search): Don't free _union_set. * src/search.h (Search::find_good_asso_values): New declaration. * src/search.cc: Add comments about the basic structure of the algorithm. (Search::find_positions): Move the option[POSITIONS] test to here. (Search::find_good_asso_values): New method, extracted from Search::optimize. (Search::optimize): Remove option[POSITIONS] test. Call find_good_asso_values. 2002-11-17 Bruno Haible * src/options.cc (Options::parse_options): Include copyright notice and authors in --version output. Avoid artificial duplicates. * src/keyword.h (KeywordExt::init_selchars_tuple): New declaration. (KeywordExt::init_selchars_multiset): Renamed from KeywordExt::init_selchars. (KeywordExt::init_selchars_low): New declaration. * src/keyword.cc (KeywordExt::init_selchars_low): Renamed from KeywordExt::init_selchars. Add alpha_inc argument. Remove sorting. (KeywordExt::init_selchars_tuple): New method. (KeywordExt::init_selchars_multiset): New method, replaces KeywordExt::init_selchars. * src/search.h (Search::init_selchars_tuple): Renamed from Search::init_selchars. (Search::count_duplicates_tuple): Renamed from Search::count_duplicates. (Search::init_selchars_multiset, Search::count_duplicates_multiset, Search::find_alpha_inc): New declarations. (Search::_alpha_inc): New field. (Search::_alpha_size, Search::_occurrences, Search::_asso_values, Search::_determined): Make non-const. * src/search.cc (Search::Search): Don't initialize _key_positions, _alpha_size, _occurrences, _asso_values, _determined here. (Search::init_selchars_tuple): Renamed from Search::init_selchars. (Search::count_duplicates_tuple): Renamed from Search::count_duplicates. (Search::find_positions): Update. (Search::init_selchars_multiset, Search::count_duplicates_multiset, Search::find_alpha_inc): New methods. (Search::prepare): Move preprepare, find_positions calls away. Initialize _alpha_size, _occurrences, _asso_values, _determined here. (Search::optimize): Call preprepare, find_positions here. Initialize _key_positions here. (Search::~Search): Deallocate _alpha_inc. * src/output.cc (Output::Output): Add alpha_inc argument. (Output::output_hash_function): Use _alpha_inc. * src/output.h (Output::Output): Add alpha_inc argument. (Output::_alpha_inc): New field. * src/main.cc (main): Pass _alpha_inc from Search to Output. * tests/chill.exp: Update. * doc/gperf.texi (Algorithmic Details): Remove description of artificial duplicates. * src/keyword.h (KeywordExt::_selchars): Change type to 'const unsigned int *'. * src/keyword.cc (sort_char_set): Change argument type to 'unsigned int *'. (KeywordExt::init_selchars): Update. * src/search.h (Search::sort_by_occurrence): Change argument type to 'unsigned int *'. (Search::try_asso_value): Change argument type to 'unsigned int'. (Search::_union_set): Change type to 'unsigned int *'. * src/search.cc (Search::prepare, Search::compute_occurrence, Search::set_determined, Search::already_determined, Search::prepare_asso_values, Search::compute_hash): Update. (compute_disjoint_union): Change argument types to 'unsigned int *'. (Search::sort_by_occurrence): Likewise. (Search::try_asso_value): Change argument type to 'unsigned int'. (Search::change_some_asso_value, Search::~Search): Update. * src/hash-table.cc (Hash_Table::~Hash_Table, Hash_Table::equal, Hash_Table::insert): Update. * src/positions.h: New file, extracted from options.h. * src/positions.icc: New file, extracted from options.icc. * src/positions.cc: New file, extracted from options.cc. * src/options.h: Include positions.h. Move classes Positions and PositionsIterator away. * src/options.icc: Move classes Positions and PositionsIterator away. * src/options.cc: Move class Positions away. * src/keyword.cc: Include positions.h instead of options.h. * src/output.h: Include positions.h instead of options.h. * src/search.h: Include positions.h instead of options.h. * src/Makefile.in (OBJECTS): Add positions.o. (POSITIONS_H): New variable. (OPTIONS_H, SEARCH_H, OUTPUT_H, keyword.o): Use it. (positions.o): New rule. * src/options.h (POSITIONS): New enum value. (Positions::Positions): New copy constructor. (Positions::operator=, Positions::contains, Position::add, Positions::remove, Positions::print): New method declaration. (Options::get_max_keysig_size): Remove method. * src/options.icc (Positions::Positions): New copy constructor. (Positions::operator=): New method. (Options::get_max_keysig_size): Remove method. * src/options.cc (Options::Options): Initialize _key_positions trivially. (Options::parse_options): Option -k sets POSITIONS. (Positions::contains, Positions::add, Positions::remove, Positions::print): New methods. * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field width explicitly, instead of using Options::get_max_keysig_size. * src/keyword.h (KeywordExt::init_selchars): Add arguments use_all_chars, positions. (KeywordExt::delete_selchars): New declaration. * src/keyword.cc (KeywordExt::init_selchars): Add arguments use_all_chars, positions. Remove error message if there are no key positions. (KeywordExt::delete_selchars): New method. * src/search.h: Include options.h. (Search::preprepare, Search::init_selchars, Search::delete_selchars, Search::count_duplicates, Search::find_positions): New declarations. (Search::_key_positions): New field. * src/search.cc (Search::Search): Initialize _key_positions. (Search::preprepare, Search::init_selchars, Search::delete_selchars, Search::count_duplicates, Search::find_positions): New functions. (Search::prepare): Call preprepare and find_positions. Tweak error message. (Search::get_max_keysig_size): Use _key_positions instead of option.get_key_positions(). (Search::optimize): Tweak error message. * src/output.h: Include options.h. (Output::Output): Add Positions argument. (Output::_key_positions): New field. * src/output.cc (Output::Output): Add Positions argument. (Output::output_hash_function): Omit the table if there are no positions at all. Use _key_positions instead of option.get_key_positions(). (Output::output): Output the computed positions as a comment. * src/main.cc (main): Pass the Positions from Searcher to Output. * src/Makefile.in (SEARCH_H, OUTPUT_H): Include OPTIONS_H. * tests/Makefile.in (check-test): Pass key positions explicitly. * tests/gpc.exp: Update. * tests/test-4.exp: Update. * doc/gperf.texi (Algorithmic Details): Mention that -k is not needed usually. 2002-11-16 Bruno Haible * src/options.h (Options::get_slot_name): Renamed from Options::get_key_name. (Options::set, Options::set_language, Options::set_total_switches, Options::set_function_name, Options::set_slot_name, Options::set_class_name, Options::set_hash_name, Options::set_wordlist_name, Options::set_delimiters): New method declarations. (Options::_language): New field. (Options::_slot_name): Renamed from Options::_key_name. * src/options.icc (Options::set): New method. (Options::get_slot_name): Renamed from Options::get_key_name. * src/options.cc (DEFAULT_FUNCTION_NAME): Renamed from DEFAULT_NAME. (DEFAULT_SLOT_NAME): Renamed from DEFAULT_NAME. (Options::Options): Initialize _language. Update. (Options::~Options): Update. (Options::set_language, Options::set_total_switches, Options::set_function_name, Options::set_slot_name, Options::set_class_name, Options::set_hash_name, Options::set_wordlist_name, Options::set_delimiters): New methods. (Options::parse_options): Call set_language. Update. * src/input.cc (is_declaration, is_declaration_with_arg, is_define_declaration): New functions. (Input::read_input): Accept %DECL declarations. * src/output.cc (Output::output_lookup_function_body): Update. * doc/gperf.texi (Declarations): Add new subnodes. (User-supplied Struct, Gperf Declarations, C Code Inclusion): New nodes. (Keywords, Output Format, Binary Strings, Options): Mention % declarations as being equivalent to the command line options. * src/options.cc (Options::long_usage): Rename options -H, -N, -l, -G. (long_options): Add --hash-function-name, --lookup-function-name, --compare-lengths. * doc/gperf.texi (Output Details): Rename options -H, -N, -l, -G. * tests/test-6.exp: Update. * src/options.cc (DEFAULT_DELIMITERS): Remove newline. * src/options.cc (Options::long_usage): Change default --delimiters. * doc/gperf.texi (Input Details): Likewise. * tests/test-6.exp: Update. * doc/gperf.texi: Move description of option -l from section Algorithmic Details to section Output Details. * src/options.cc (Options::long_usage): Likewise. * tests/test-6.exp: Update. 2002-11-12 Bruno Haible * src/options.h (Output::get_output_file_name): New method. (Output::_output_file_name): New field. * src/options.icc (Options::get_output_file_name): New method. * src/options.cc (Options::long_usage): Document option --output-file. (Options::Options): Initialize _output_file_name. (long_options): Add --output-file. (Options::parse_options): Handle it. * src/main.cc (main): Open the output file if given by name. * doc/gperf.texi (Output File): New section. * tests/test-6.exp: Update. 2002-11-10 Bruno Haible * src/input.cc (pretty_input_file_name): New function. (read_input): Use it in all error and warning messages. * src/keyword.h (Keyword::_lineno): New field. * src/input.h (Input::_struct_decl_lineno): New field. * src/input.cc (Input::read_input): Set _struct_decl_lineno. Fill each keyword's _lineno field. * src/main.cc (main): Pass _struct_decl_lineno from Input to Output. * src/output.h (Output::Output) Add struct_decl_lineno argument. (Output::_struct_decl_lineno): New field. * src/output.cc (Output::Output) Add struct_decl_lineno argument. (output_keyword_entry): Emit #line directive before table entry. (Output::output): Emit #line directive before _struct_decl. Fix memory leaks. * src/keyword.h (empty_string): New declaration. * src/keyword.cc (empty_string): New variable. * src/input.h (Input::_input): Make public. (Input::_input_end): New field. * src/input.cc (read_input): When removing leading whitespace from struct_decl, reallocate it. For rest, use empty_string instead of "". Set _input_end. (Input::~Input): Delete _struct_decl, _struct_tag, _return_type. * src/search.cc (Search::prepare): When removing an element from the keyword list, delete the list node. (Search::~Search): Delete _occurrences, _asso_values. * src/main.cc (main): Between Search::~Search and Input::~Input, destroy the keyword list. Rewrite the input routines. * src/input.h: Don't include read-line.h. (Input): Don't inherit from class Read_Line. (Input::read_keys, Input::strcspn, Input::set_output_types, Input::get_array_type, Input::save_include_src, Input::get_special_input): Remove declarations. (Input::read_input): New declaration. (Input::_struct_decl): Renamed from Input::_array_type. (Input::_verbatim_declarations): Renamed from Input::_include_src. (Input::_verbatim_code): Replaces Input::_additional_code. * src/input.cc: Completely rewritten. * src/output.h (Output::Output): Update the verbatim_* arguments. (Output::_struct_decl): Renamed from Output::_array_type. (Output::_verbatim_declarations): Renamed from Output::_include_src. (Output::_verbatim_code): Replaces Output::_additional_code. * src/output.cc (Output::Output): Update the verbatim_* arguments. (Output::output): Output the verbatim_* code pieces with #line. * src/main.cc (main): Call Input::read_input instead of Input::read_keys. Update Output::Output arguments. * src/read-line.h: Remove file. * src/read-line.cc, src/read-line.icc: Remove files. * src/Makefile.in (OBJECTS): Remove read-line.o. (READ_LINE_H): Remove variable. (INPUT_H): Update. (read-line.o): Remove rule. * doc/gperf.texi (Declarations): Correct the example. (Keywords): Mention that lines starting with % are forbidden here. * tests/c-parse.exp: Update. * tests/cplusplus.exp: Update. * tests/gpc.exp: Update. * tests/java.exp: Update. * tests/objc.exp: Update. * tests/test-4.exp: Update. * src/options.h (Options::get_input_file_name): New declaration. (Options::_input_file_name): New field. * src/options.icc (Options::get_input_file_name): New method. * src/options.cc (Options::Options): Initialize _input_file_name. (Options::parse_options): Don't open input file, only store it in _input_file_name. * src/main.cc (main): Open input file here. Print an error message upon write error on the output file. Upgrade to autoconf-2.52. * configure.in: Use AC_CONFIG_SUBDIRS instead of AC_OUTPUT_SUBDIRS. * Makefile.devel (configure, lib/configure, src/configure, tests/configure, doc/configure): Use autoconf-2.52. 2002-11-09 Bruno Haible * doc/gperf.texi: Talk about "bytes" instead of "characters". Talk about "keywords", not "keys". Talk about "input file", not "keyfile". (@menu): Fix a menu entry. (Contributors): Don't mention cperf. (Motivation): Fix an off-by-one error in the definition of "minimal". Mention GNU Java. Recommend http URL instead of anonymous ftp. (Search Structures): Mention GNU Java. (Output Format): Drop reference to node 'Implementation'. (Output Details): Talk about "slot-name" instead of "key name". (Algorithmic Details): Talk about "selected byte positons", not "key positions". Upper limit is now 255. Explain a third reason why duplicates can occur. Describe negative effects of --occurrence-sort. (Implementation): Remove chapter. 2002-11-07 Bruno Haible * src/bool-array.cc (Bool_Array::~Bool_Array): Free _storage_array. * src/search.cc (Search::~Search): Free _union_set, _determined. * tests/Makefile.in (check-test): Don't redirect stderr. 2002-11-05 Bruno Haible * src/keyword-list.h (mergesort_list): New declarations. * src/keyword-list.cc (Keyword_Comparison): New type. (merge, mergesort_list): New functions, moved here from search.cc. * src/search.h (Search::merge, Search::merge_sort): Remove methods. (Search::_occurrence_sort, Search::_hash_sort): Remove fields. * src/search.cc (Search::merge, Search::merge_sort): Remove methods. (greater_by_occurrence, less_by_hash_value): New functions. (Search::reorder, Search::sort): Use mergesort_list. 2002-11-04 Bruno Haible * src/options.h (Options::_asso_iterations): New field. (Options::get_asso_iterations): New method declaration. * src/options.icc (Options::get_asso_iterations): New method. * src/options.cc (Options::short_usage): Mention j and m. (Options::long_usage): Document option -m. (Options::Options): Initialize _asso_iterations. (Options::~Options): Print _asso_iterations too. (long_options): Add --multiple-iterations. (Options::parse_options): Handle option -m. * src/keyword-list.h (copy_list, delete_list): New declarations. * src/keyword-list.cc (copy_list, delete_list): New functions. * src/search.h (Search::_initial_asso_value, Search::_jump): New fields. * src/search.cc (Search::prepare_asso_values): Initialize _initial_asso_value and _jump here. (Search::init_asso_values): Use _initial_asso_value. (Search::try_asso_value): Use _jump. (Search::optimize): If option -m was given, iterate over different values for _initial_asso_value and _jump. * doc/gperf.texi (Algorithmic Details): Document option -m. * tests/test-6.exp: Update. 2002-11-03 Bruno Haible Bug fix: When option -j 0 was used without option -r, the output was not random. * src/search.h (Search::prepare_asso_values): New method declaration. * src/search.cc (Search::prepare_asso_values): New method, extracted from Search::init_asso_values. Call srand also when "-j 0" was given. (Search::optimize): Call prepare_asso_values(). * src/hash-table.h (Hash_Table::_ignore_length, Hash_Table::equal): Declare as const. * src/hash-table.cc (Hash_Table::equal): Declare as const. * src/input.h (Input::_factory): Declare as const. * src/keyword-list.h (Keyword_List::first, KeywordExt_List::first): Declare as const. * src/keyword-list.icc (Keyword_List::first, KeywordExt_List::first): Declare as const. * src/output.h (Output::num_hash_values, Output::output_constants, Output::output_hash_function, Output::output_keylength_table, Output::output_keyword_table, Output::output_lookup_array, Output::output_lookup_tables, Output::output_lookup_function_body, Output::output_lookup_function, Output::_array_type, Output::_additional_code, Output::_include_src, Output::_total_keys, Output::_total_duplicates, Output::_max_key_len, Output::_min_key_len): Declare as const. * src/output.cc (Output::num_hash_values, Output::output_constants, Output::output_hash_function, Output::output_keylength_table, Output::output_keyword_table, Output::output_lookup_array, Output::output_lookup_tables, Output::output_lookup_function_body, Output::output_lookup_function): Declare as const. * src/search.h (Search::merge, Search::merge_sort, Search::compute_occurrence, Search::already_determined, Search::keyword_list_length, Search::max_key_length, Search::get_max_keysig_size, Search::compute_hash, Search::sort_by_occurrence): Declare as const. * src/search.cc (Search::merge, Search::merge_sort, Search::compute_occurrence, Search::already_determined, Search::keyword_list_length, Search::max_key_length, Search::get_max_keysig_size, Search::compute_hash, Search::sort_by_occurrence): Declare as const. * src/output.cc (Output::output): Set char_to_index to a cast in all cases. Avoids gcc warnings on the generated code. * src/output.cc (Output_Enum): Prepend an underscore to field names. (Output_Expr1): Likewise. (Output::output_hash_function): Simplify the special case for "-k 1,$". * src/search.h (Search::init_asso_values, Search::find_asso_values): New declarations. (Search::try_asso_value): Renamed from Search::affects_prev. (Search::change_some_asso_value): Renamed from Search::change. (Search::set_asso_max, Search::get_asso_max): Remove methods. (Search::_union_set): New field. * src/search.cc (Search::init_asso_values): New method, extracted from Search::optimize. (Search::try_asso_value): Renamed from Search::affects_prev. Take the iteration count as argument. (Search::change_some_asso_value): Renamed from Search::change. Don't make union_set static. Don't increment _fewest_collisions here. (Search::find_asso_values): New method, extracted from Search::optimize. (Search::optimize); Update. * src/search.h (Search::compute_hash): Renamed from Search::hash. (Search::compute_disjoint_union): Remove declaration. (Search::sort_by_occurrence): Renamed from Search::sort_set. * src/search.cc (Search::compute_hash): Renamed from Search::hash. (compute_disjoint_union): Renamed from Search::compute_disjoint_union. (Search::sort_by_occurrence): Renamed from Search::sort_set. (Search::change): Simplify loop. * src/search.h (Search::clear_determined): New declaration. * src/search.cc (Search::clear_determined): New method. (Search::already_determined): Optimize. (Search::reorder): Even when the next keyword after the current one is completely determined, move all determined keywords after the current one. Compute the occurrences after removal of duplicates, not before. * src/keyword.h (KeywordExt::init_selchars): Remove occurrences argument. * src/keyword.cc (KeywordExt::init_selchars): Likewise. * src/search.cc (Search::prepare): Reorder the code. Compute the occurrences after removal of duplicates. (Search::merge_sort): Optimize the loop. (Search::compute_occurrence): Renamed from Search::get_occurrence. * src/search.h (Search::compute_occurrence): Renamed from Search::get_occurrence. * tests/chill.exp: Regenerated. Bug fix: The hash table could fail to detect duplicates, between keywords of different length, when option -n (option[NOLENGTH]) was given. * src/hash-table.h (Hash_Table::Hash_Table): Pass table size, not vector and vector size as arguments. (Hash_Table::_log_size): New field. (Hash_Table::equal): New declaration. * src/hash-table.cc (size_factor): New variable. (Hash_Table::Hash_Table): Pass table size, not vector and vector size as arguments. Allocate the vector here. (Hash_Table::~Hash_Table): Deallocate the vector here. (Hash_Table::equal): New function. (Hash_Table::insert): Use it. Don't use item->_allchars_length for the increment if _ignore_length is true. * src/search.cc (TABLE_MULTIPLE): Remove variable. (Search::prepare): Update. 2002-11-02 Bruno Haible Provide documentation also in PDF format. * doc/Makefile.in (pdfdir, TEXI2PDF): New variables. (all): Depend on pdf. (pdf, gperf.pdf): New rules. (maintainer-clean): Remove the PDF file. * src/keyword-list.icc: New file, extracted from keyword-list.h. * src/keyword-list.h: Include keyword-list.icc. Move inline methods to there. * src/keyword-list.cc: Include keyword-list.icc. * src/Makefile.in (KEYWORD_LIST_H): Add keyword-list.icc. * lib/hashpjw.h (hashpjw): Change argument type to 'unsigned char *'. * lib/hash.cc (hashpjw): Likewise. * src/keyword.icc: New file. * src/keyword.h: Include keyword.icc. (KeywordExt::_selchars): Change type to 'unsigned char *'. * src/keyword.cc: Include keyword.icc. (Keyword::Keyword, KeywordExt::KeywordExt): Move to keyword.icc. (sort_char_set): Change argument type to 'unsigned char *'. (KeywordExt::init_selchars): Update. * src/search.h (Search::compute_disjoint_union): Change argument types to 'unsigned char *'. (Search::sort_set): Likewise. (Search::affects_prev): Change argument type to 'unsigned char'. * src/search.cc (Search::prepare): Initialize _duplicate_link here. (Search::get_occurrence, Search::set_determined, Search::already_determined, Search::hash): Update. (Search::compute_disjoint_union): Change argument types to 'unsigned char *'. (Search::sort_set): Likewise. (Search::affects_prev): Change argument type to 'unsigned char'. (Search::change): Update. * src/Makefile.in (KEYWORD_H): Add keyword.icc. * src/options.cc (Options::parse_options): Fix error message. * src/read-line.h (Read_Line::Read_Line): Make FILE* argument mandatory. Move body to read-line.icc. * src/read-line.icc (Read_Line::Read_Line): New constructor. * src/input.h (Input::Input): Add FILE* argument. * src/input.cc (Input::Input): Likewise. * src/main.cc (main): Pass stdin to Input constructor. * src/options.h (DEFAULTCHARS): Remove. (Positions::MAX_KEY_POS): Set to 255. (Positions::_positions): Increase array size. (PositionIterator::EOS): Set to -1. (PositionIterator::_index): Change type to 'unsigned int'. * src/options.icc (Positions::Positions): Don't store PositionIterator::EOS. (PositionIterator::next): Produce PositionIterator::EOS here. * src/options.cc (Options::long_usage): Use MAX_KEY_POS, not MAX_KEY_POS-1. (PositionStringParser): Rename field _size to _in_range. Rename field _curr_value to _range_curr_value. Rename field _upper_bound to _range_upper_bound. (PositionStringParser::nextPosition): Comments. (Options::Options): Update. (Options::~Options): Update. (long_options): Use NULL, not 0. (Options::parse_options): Set BAD_VALUE to -2; -1 is now EOS. Bug fix: Check against array overflow when more than MAX_KEY_POS positions are given. Don't store PositionIterator::EOS. Check against extra arguments before opening the input file. * src/output.cc (Output::output_hash_function): Change test which was for option[DEFAULTCHARS]. * tests/test-6.exp: Update. * src/options.h (Options::get_delimiters): Renamed from Options::get_delimiter. * src/options.icc (Options::get_delimiters): Renamed from Options::get_delimiter. * src/input.cc (Input::read_keys): Update. Bug fix. * src/options.cc (Options::print_options): Escape backquote inside double-quoted strings. Bug fix. * src/keyword.cc (KeywordExt::init_selchars): Avoid comparison with uninitialized member variable. Found with 'valgrind'. * src/version.cc: Include version.h. * src/Makefile.in (OBJECTS): Reorder. (KEYWORD_H, KEYWORD_LIST_H, INPUT_H, SEARCH_H, OUTPUT_H): New variables. (HASH_TABLE_H): Update. (options.o, read-line.o, keyword.o, keyword-list.o, input.o, search.o, output.o, main.o): Update dependencies. * src/vectors.h: Remove file. * src/vectors.cc: Remove file. * src/search.h: Don't include vectors.h. (Search): Don't inherit from Vectors. New fields _alpha_size, _occurrences, _asso_values. (Search::_determined, Search::get_occurrence, Search::set_determined, Search::already_determined, Search::hash, Search::sort_set): Make nonstatic. * src/search.cc (Search::Search): Initialize _alpha_size, _occurrences, _asso_values, _determined. (Search::optimize, Search::~Search): Update. * src/output.h: Don't include vectors.h. (Output): Remove field _v. New fields _alpha_size, _occurrences, _asso_values. (Output::Output): Replace Vectors* argument with alpha_size, occurrences, asso_values. * src/output.cc (Output::Output): Replace Vectors* argument with alpha_size, occurrences, asso_values. (Output::output_hash_function): Update. * src/main.cc (main): Don't set Vectors::ALPHA_SIZE. Pass _alpha_size, _occurrences, _asso_values from Search to Output. * src/keyword.h: Don't include vectors.h. * src/Makefile.in (OBJECTS): Remove vectors.o. (VECTORS_H): Remove variable. (vectors.o): Remove rule. * src/search.h: New file, combines src/key-list.h, src/gen-perf.h. * src/search,cc: New file, combines src/key-list.cc, src/gen-perf.cc. * src/key-list.h: Remove file. * src/key-list.cc: Remove file. * src/gen-perf.h: Remove file. * src/gen-perf.cc: Remove file. * src/main.cc (KeywordExt_Factory): Moved here from gen-perf.cc. (main): Inline some code from gen-perf.cc. * src/keyword.h (KeywordExt::init_selchars): Take the occurrences vector as argument. * src/keyword.cc (KeywordExt::init_selchars): Take the occurrences vector as argument. * src/input.cc (Input::set_output_types): Initialize _array_type, _return_type, _struct_tag. (Input::read_keys): Initialize _additional_code. * src/Makefile.in (OBJECTS): Add search.o. Remove key-list.o, gen-perf.o. (KEY_LIST_H, GEN_PERF_H): Remove variables. (gen-perf.o, key-list.o): Remove rules. (search.o): New rule. * *, */*: Update copyright notice to GPL version 2. * src/keyword-list.h (Keyword_List): New class. (KeywordExt_List): Inherit from it. * src/keyword-list.cc (Keyword_List::Keyword_List): New constructor. (KeywordExt_List::KeywordExt_List): Update. * src/input.h (Input::Input): Add Keyword_Factory argument. (Input::_factory): New field. (Input::_head): Change type to Keyword_List*. (Input::parse_line): New declaration. * src/input.cc (Input::Input): New constructor. (Input::parse_line): Renamed from parse_line. Use the _factory. (Input::read_keys): Update. * src/key-list.cc (KeywordExt_Factory): New class. (Key_List::read_keys): Pass a KeywordExt_Factory as Input constructor argument. Avoid g++ -Wold-style-cast warnings. * src/bool-array.icc: Use new-style casts. * src/gen-perf.cc: Likewise. * src/input.cc: Likewise. * src/key-list.cc: Likewise. * src/keyword.cc: Likewise. * src/options.cc: Likewise. * src/output.cc: Likewise. * src/hash-table.cc: Likewise. Remove (char *) cast in memset argument. * src/keyword-list.h (KeywordExt_List): Don't inherit from KeywordExt. (KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument. (KeywordExt_List::_car): New field. (KeywordExt_List::first): Use it. * src/keyword-list.cc (KeywordExt_List::KeywordExt_List): Take a KeywordExt* as argument. * src/input.cc (parse_line): Create the KeywordExt separately. Start using bool. * src/bool-array.h (Bool_Array::set_bit): Change return type to bool. * src/bool-array.icc (Bool_Array::set_bit): Likewise. * src/gen-perf.h (Gen_Perf::affects_prev): Likewise. * src/gen-perf.cc (Gen_Perf::affects_prev): Likewise. * src/hash-table.h (Hash_Table::_ignore_length): Change type to bool. (Hash_Table::Hash_Table): Change 3rd argument type to bool. * src/hash-table.cc (Hash_Table::Hash_Table): Likewise. * src/input.h (Input::_additional_code): Change type to bool. * src/input.cc (Input::read_keys): Update. * src/key-list.h (Key_List::_occurrence_sort, Key_List::_hash_sort, Key_List::_additional_code): Change type to bool. (Key_List::_determined): Change element type to bool. (Key_List::already_determined): Change return type to bool. * src/key-list.cc (Key_List::_determined): Change element type to bool. (Key_List::set_determined): Update. (Key_List::already_determined): Change return type to bool. (Key_List::reorder, Key_List::sort, Key_List::Key_List): Update. * src/options.h (Positions::sort): Change return type to bool. (Options::operator[]): Likewise. * src/options.icc (Positions::sort): Change return type to bool. (Options::operator[]): Likewise. * src/output.h (Output::Output): Change 5th argument type to bool. (Output::_additional_code): Change type to bool. * src/output.cc (Output::Output): Change 5th argument type to bool. 2002-10-16 Bruno Haible * src/*.h: Align all member names at column 24. 2002-10-15 Bruno Haible * src/input.h: New file. * src/input.cc: New file, extracted from key-list.cc. * src/key-list.h (Key_List): Don't inherit from Read_Line. (Key_List::get_special_input, Key_List::save_include_src, Key_List::get_array_type, Key_List::strcspn, Key_List::set_output_types): Remove methods. * src/key-list.cc (Key_List::get_special_input, Key_List::save_include_src, Key_List::get_array_type, Key_List::strcspn, Key_List::set_output_types, parse_line): Move to src/input.cc. (Key_List::read_keys): Use Input::read_keys. (Key_List::Key_List): Update. * src/gen-perf.cc: Update. * src/Makefile.in (OBJECTS): Add input.o. (input.o): New rule. 2002-10-14 Bruno Haible * src/options.cc: Don't include "vector.h". (Options::parse_options): Don't initialize Vectors::ALPHA_SIZE here. * src/vectors.cc (Vectors::ALPHA_SIZE): Don't initialize here. * src/gen-perf.cc (Gen_Perf::Gen_Perf): Initialize Vectors::ALPHA_SIZE. * src/options.h (Positions): New class. (PositionIterator): New class. (Options::parse_options): Renamed from Options::operator(). (Options::get_asso_max, Options::set_asso_max): Move to class Key_List. (Options::reset, Options::get): Remove, replaced by class PositionIterator. (Options::get_initial_asso_value): Renamed from Options::initial_value. (Options::key_sort): Remove, replaced by Positions::sort. (Options): Make all fields and methods non-static. * src/options.icc (Positions::Positions, Positions::operator[], Positions::get_size, Positions::pointer, Positions::set_size, Positions::sort, PositionIterator::PositionIterator, PositionIterator::next): New methods. (Options::get_initial_asso_value): Renamed from Options::initial_value. (Options::get_size_multiple): New method. (Options::get_key_positions): New method. (Options::get_max_keysig_size): Implement using _key_positions. * src/options.cc (Options::long_usage): Split big string into small pieces. (PositionStringParser): Prefix field names with _. (Options::Options): Update. (Options::~Options): Fix explanation of of _size_multiple. Don't print _key_positions if it is effectively ignored. (Options::parse_options): Renamed from Options::operator(). Update. * src/key-list.h (Key_List): New field _size. New methods get_asso_max, set_asso_max, get_max_keysig_size. * src/key-list.cc (Key_List::read_keys): Don't make side effects on options. (Key_List::dump): Use Key_List::get_max_keysig_size() instead of Options::get_max_keysig_size(). (Key_List::get_max_keysig_size): New function. * src/hash-table.cc (Hash_Table::~Hash_Table): Compute the field width on the fly if option[ALLCHARS]. * src/gen-perf.cc (Gen_Perf::Gen_Perf): Update, Use Options::get_size_multiple() instead of Options::get_asso_max(). Use Key_List::get_asso_max() instead of Options::get_asso_max(). Use Key_List::get_max_keysig_size() instead of Options::get_max_keysig_size(). (Gen_Perf::affects_prev): Likewise. (Gen_Perf::change): Likewise. * src/keyword.cc: Update. * src/main.cc: Update. * src/output.cc: Update. * tests/test-6.exp: Update. 2002-10-13 Bruno Haible * src/bool-array.*: Some polishing. * src/options.h (Options::operator=, Options::operator!=): Remove unused methods. * src/options.icc (Options::operator=, Options::operator!=): Remove. * src/*.h: Prefix all field names with _. * src/*.cc, src/*.icc: Update. * src/*: Simplify declarations of functions without arguments. 2002-10-04 Bruno Haible * src/output.h: New file, extracted from key-list.h. * src/output.cc: New file, extracted from key-list.cc. * src/key-list.h (Key_List): Make some fields protected. Move output routines to src/output.h. * src/key-list.cc: Move output routines to src/output.cc. * src/gen-perf.cc (Gen_Perf::doit_all): Use class Output. * src/Makefile.in (OBJECTS): Add output.o. (output.o): New rule. 2002-10-03 Bruno Haible * src/iterator.h: Remove file. * src/iterator.cc: Remove file. * src/options.cc: (PositionStringParser): New class, taken from old iterator.cc. * src/Makefile.in (OBJECTS): Remove iterator.o. (ITERATOR_H): Remove variable. (iterator.o): Remove rule. * src/keyword-list.h: New file. * src/keyword-list.cc: New file. * src/list-node.h: Remove file. * src/list-node.cc: Remove file. * src/keyword.h (KeywordExt::init_selchars): New declaration. * src/keyword.cc (sort_char_set, KeywordExt::init_selchars): New, from old list-node.cc. * src/gen-perf.cc: Replace List_Node by KeywordExt or KeywordExt_List, as appropriate. * src/hash-table.h: Likewise. * src/key-list.h: Likewise. * src/key-list.cc: Likewise. * src/Makefile.in (OBJECTS): Remove list-node.o, add keyword-list.o. (LIST_NODE_H): Remove macro. (list-node.o): Remove rule. (keyword-list.o): New rule. * src/keyword.h (KeywordExt): New class. * src/keyword.cc (KeywordExt): New constructor. * src/list-node.h (List_Node): Inherit from KeywordExt. * src/list-node.cc: Update. * src/gen-perf.cc: Update. * src/hash-table.cc: Update. * src/key-list.cc: Update. (output_keyword_entry): Change argument type to KeywordExt*. * src/keyword.h: New file. * src/keyword.cc: New file. * src/list-node.h (List_Node): Extend Keyword. * src/list-node.cc: Update. * src/gen-perf.cc: Update. * src/hash-table.cc: Update. * src/key-list.cc: Update. * src/Makefile.in (OBJECTS): Add keyword.o. (keyword.o): New rule. * src/key-list.cc (Key_List::read_keys): Allocate the memory for the hash table using 'new'. (Key_List::output_lookup_array): Allocate the memory for the duplicates array using 'new'. * src/options.h (LARGE_STACK_ARRAYS): Remove definition. * src/main.cc (main): Remove setrlimit call. * src/configure.in: Don't test for unistd.h, sys/time.h, sys/resource.h, getrlimit, setrlimit. * src/bool-array.h (Bool_Array): Make all members non-static. Add an argument to the constructor. Remove init(), rename reset() to clear(), rename find() to set_bit(). * src/bool-array.icc: Move init() code into the constructor. Rename reset() to clear(), rename find() to set_bit(). * src/gen-perf.h (Gen_Perf): Add collision_detector member. * src/gen-perf.cc: Update. * src/gen-perf.h (Gen_Perf::doit_all): Renamed from Gen_Perf::operator (). * src/gen-perf.cc (Gen_Perf::doit_all): Renamed from Gen_Perf::operator (). * src/main.cc: Update. * src/read-line.h (Read_Line::read_next_line): Renamed from Read_Line::get_line. * src/read-line.icc: Likewise. * src/read-line.cc: Update. * src/key-list.cc: Update. * lib/getline.h: New file. * lib/getline.cc: New file. * lib/Makefile.in (OBJECTS): Add getline.o. (getline.o): New rule. * src/read-line.h (Read_Line::readln_aux): Remove declaration. * src/read-line.cc (Read_Line::readln_aux): Remove function. * src/read-line.icc (Read_Line::get_line): Use ::get_line. * src/options.h (LARGE_STACK): Remove macro. * src/bool-array.h (STORAGE_TYPE): Remove type. Use 'unsigned int' instead of STORAGE_TYPE. * src/bool-array.cc: Likewise. * src/bool-array.icc: Likewise. * src/gen-perf.cc: Likewise. * src/new.cc: Remove file. * src/Makefile.in (OBJECTS): Remove new.o. (new.o): Remove rule. * src/configure.in: Remove test for HAVE_THROW_DECL. * acconfig.h: Remove file. * src/trace.h: Remove file. * src/trace.cc: Remove file. * src/Makefile.in (OBJECTS): Remove trace.o. (TRACE_H): Remove variable. (trace.o): Remove rule. Update all dependencies. * src/bool-array.h, src/bool-array.cc, src/bool-array.icc: Don't use T. * src/gen-perf.cc: Likewise. * src/hash-table.cc: Likewise. * src/iterator.cc: Likewise. * src/key-list.cc: Likewise. * src/list-node.cc: Likewise. * src/main.cc: Likewise. * src/new.cc: Likewise. * src/options.h, src/options.cc, src/options.icc: Likewise. * src/read-line.h, src/read-line.cc, src/read-line.icc: Likewise. * tests/Makefile.in: Use gperf option -I, to avoid gcc-3.x warnings. * tests/test.c: Don't use gets(), to avoid warnings. 2001-08-02 Bruno Haible * doc/gperf.texi: Change bug report address to . * README: Updated. 2000-12-18 Bruno Haible * src/configure.in: Add check for rand() in libm. Needed for BeOS. * src/Makefile.in (LIBS): Use @GPERF_LIBM@ instead of hardwiring -lm. 2000-11-20 Bruno Haible * doc/help2man: Update to version 1.23. 2000-09-26 Bruno Haible * gperf-2.7.2 released. * doc/gperf.texi: Add a second bug report address . * README: Updated. 2000-08-28 Bruno Haible * lib/getopt.h (struct option): Use "const" also when compiling in C++ mode. Avoids warnings from Sun CC and HP-UX aCC. * doc/Makefile.in (docdir): Change from $(datadir)/doc/@PACKAGE@ to $(prefix)/doc/@PACKAGE@, following the newest GNU standards. 2000-08-20 Bruno Haible * src/version.cc: Bump version number to 2.7.2. * doc/gperf.texi: Likewise. * doc/texinfo.tex: Update to post-texinfo-4.0 version. @code in the title page now chooses a larger font. The overall layout of the text is denser. * AUTHORS: New file. * tests/Makefile.in (all): Add check-lang-utf8 and check-lang-ucs2. (check-lang-utf8, check-lang-ucs2): New targets. (clean): Remove lu8out and lu2out. * tests/lang-utf8.gperf, tests/lang-utf8.exp: New files. * tests/lang-ucs2.gperf, tests/test2.c, tests/lang-ucs2.in, tests/lang-ucs2.exp: New files. Allow the use of embedded NULs in keys. * lib/hash.h (hashpjw): Add a length argument. * lib/hash.cc (hashpjw): Likewise. Don't stop when encountering a NUL character. * src/hash-table.h (Hash_Table constructor): Add ignore_len argument. (Hash_Table::ignore_length): New field. (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove ignore_length argument. * src/hash-table.cc (NIL): Remove macro. (Hash_Table constructor): Add ignore_len argument. Use it to initialize ignore_length. (Hash_Table destructor): Specify explicit length of char_set and key. (Hash_Table::insert): Renamed from Hash_Table::operator(). Remove ignore_length argument. Pass explicit length to hashpjw. Compare char_set using memcmp, not strcmp. * src/list-node.h (List_Node): Rename field length to key_length. New field char_set_length. (List_Node constructor): Accept key and rest, not the entire line. * src/list-node.cc (List_Node constructor): Accept key and rest, not the entire line. Don't NUL terminate key and char_set. Specify explicit length of key. Initialize char_set_length field. * src/key-list.cc: Include . (parse_line): New function. (Key_List::read_keys): Call parse_line instead of new List_Node. Pass option[NOLENGTH] to Hash_Table constructor, not Hash_Table::insert. Specify explicit length of key and char_set. (Key_List::get_occurrence): Use explicit length of char_set. (Key_List::set_determined): Likewise. (Key_List::already_determined): Likewise. (output_string): Add length argument. Output unprintable characters using octal escape sequence. (output_keyword_entry): Use explicit length of key. (Key_List::output_lookup_array): Specify explicit length of key. (output_switch_case): Likewise. (Key_List::dump): Likewise. * src/gen-perf.h (Gen_Perf::compute_disjoint_union): Add two length arguments. * src/gen-perf.cc (Gen_Perf::compute_disjoint_union): Likewise. Don't stop when encountering NUL characters. Don't NUL terminate the result. (Gen_Perf::hash): Use explicit length of char_set. (Gen_Perf::change): Specify explicit length of key. * doc/gperf.texi: Document it. * doc/help2man: New file, help2man version 1.022. * Makefile.devel (all): Add doc/gperf.1. (doc/gperf.1): New target. * doc/gperf.1: Automatically generated. * mkinstalldirs: New file, from automake-1.4, grep-2.4.1, guile-1.4, libtool-1.3.3, make-3.79.1, tar-1.13. * src/Makefile.in (MKINSTALLDIRS): New variable. (install, installdirs): Use it instead of mkdir. * doc/Makefile.in (MKINSTALLDIRS): New variable. (install, installdirs): Use it instead of mkdir. * INSTALL: Update. 2000-08-19 Bruno Haible * src/key-list.cc (Output_Compare_Memcmp): New class. (Key_List::output_lookup_function): When option -l is given, use memcmp instead of strcmp or strncmp. * doc/gperf.texi: The bug report address is . The download address is ftp.gnu.org. Remove mention of -a and -g options (now nops). Explain effect of -c option. * doc/configure.in (PACKAGE): New variable. * doc/Makefile.in (datadir, docdir): New variables. (dvidir, htmldir): Change values. (install, installdirs): Update. * src/configure.in: Rename cache variable gp_cxx_throw_decl to gp_cv_cxx_throw_decl. * src/key-list.cc (Key_List::output_hash_function): When outputting __inline, take advantage of C++ compilers which have inline. * src/key-list.cc (Output_Compare_Strncmp::output_comparison): After the call to strncmp, verify that expr2 is not longer than `len'. Reported by Carlo Wood . * src/key-list.cc (Key_List::output_lookup_function_body): Avoid emitting the loop for dealing with duplicates if total_duplicates == 0. * src/key-list.cc (Key_List::read_keys): Don't accept an empty key. * src/Makefile.in (install, installdirs, uninstall): Respect $(DESTDIR). * doc/Makefile.in (install, installdirs, uninstall): Likewise. * src/options.cc (Options::print_options): Escape the arguments which contain special characters. * tests/c-parse.gperf: Updated from gcc-2.95.2/gcc/c-parse.gperf. * tests/objc.gperf: New file, from gcc-2.95.2/gcc/objc/objc.gperf. * tests/chill.gperf: New file, from gcc-2.95.2/gcc/ch/gperf. * tests/cplusplus.gperf: New file, from gcc-2.95.2/gcc/cp/gxx.gperf. * tests/gplus.gperf: Remove file. * tests/java.gperf: New file, from gcc-2.95.2/gcc/java/keyword.gperf. * tests/Makefile: Check them all. * tests/c-parse.exp: Renamed from tests/test-1.exp. * tests/modula2.exp: Renamed from tests/test-2.exp. * tests/cplusplus.exp: Renamed from tests/test-3.exp. * tests/gpc.exp: Renamed from tests/test-5.exp. * src/key-list.cc (output_switch_case): Add trailing semicolon to lengthptr assignment line. Fixes bug with -D and -S. From Reini Urban . Also reported by David Hunter. * tests/Makefile.in (check-lang-syntax): Perform each test with -D once without and once with duplicates. * src/key-list.cc (output_keyword_entry): Avoid outputting a struct initializer of the form {"key",}. * src/iterator.cc: Don't include . From Michael Deutschmann . * tests/Makefile.in (VALIDATE, check-lang-syntax): Use $(srcdir) where appropriate. Reported by Andreas Schwab . * tests/validate: Don't run -traditional tests by default. * src/main.cc (main): Check for write error on stdout before returning. * src/Makefile.in (LDFLAGS): New definition, to catch the value given at configure time. Make the structure initializers customizable. Based on a patch by Kaveh R. Ghazi . * src/options.h (Options::get_initializer_suffix, Options::initializer_suffix): New declarations. * src/options.icc (Options::get_initializer_suffix): New function. * src/options.cc (DEFAULT_INITIALIZER_SUFFIX): New constant. (Options::initializer_suffix): New variable. (Options::short_usage): Document option "-F". (Options::long_usage): Document option "-F". (Options constructor): Initialize initializer_suffix. (Options destructor): Dump initializer_suffix. (long_options): Add option "-F". (Options::operator()): Accept option "-F". Sets initializer_suffix. * src/key-list.cc (output_keyword_blank_entries): Output initializer_suffix. * doc/gperf.texi: Document option "-F". * COPYING: Replace with GPL version 2 (with new FSF address and Y2K safe year format). * doc/gpl.texinfo: New file. * doc/gperf.texi: Document it. * doc/Makefile.in (gperf.info, gperf.dvi, gperf.html, gperf_toc.html): Update dependencies. * doc/Makefile.in (MAKEINFO): Unset LANG while running makeinfo. 1998-05-20 Bruno Haible * doc/Makefile.in (gperf.dvi, clean): Remove gperf.cps. (install, installdirs, uninstall): Don't install gperf.dvi. The info and HTML documentations are sufficient for on-line use, and users who wish to print the documentation (in PS or DVI format) can do this directly off the source distribution. (DVIPS): Use "-D600" instead of "-Pljfour", for portability. 1998-05-20 Akim Demaille * doc/gperf.texi: Many modifications: (Output Format): Declare `hash' and `in_word_set' as functions. (Concept Index): New section. (Title page): Use standard presentation. (Top): Use @top instead of @unnumbered so that automatic master update works. (Motivation): Avoid spaces in @var. (Options): Use the standard name ``Invoking ...''. (Options): Declare also the long form of the options. (Options): Remove redundant @itemize when @table is used. 1998-05-08 Andreas Schwab * aclocal.m4 (CL_PROG_INSTALL): Set cl_cv_path_install, not ac_cv_path_install. Sat May 2 13:20:54 1998 Bruno Haible * gperf-2.7 released. Sat May 2 12:31:51 1998 Bruno Haible * src/version.cc (version_string): Remove the "(C++ version)" suffix. It's redundant: the early C versions of gperf are called cperf. Reported by Karl Berry. * src/option.cc (Options::operator()): Trim the output of "gperf -v". Thu Apr 16 13:22:16 1998 Bruno Haible * lib/Makefile.in, src/Makefile.in: Don't use $(TARGET_ARCH). Solaris "make" sets it to a value not understood by "cc". Wed Apr 15 23:52:14 1998 Bruno Haible * lib/Makefile.in, src/Makefile.in: Don't use implicit rules. Don't use $<. AIX "make" and OSF/1 "make" have problems with both. * src/gen-perf.cc, src/key-list.cc: Cast free() argument to char*, otherwise it doesn't compile on SunOS 4. * src/key-list.h: Declare structs outside of other declarations, needed for OSF/1 cxx 5.5. * lib/getopt.h: Use prototypes if __STDC__ || __cplusplus. Don't give a prototype for getopt(), to avoid error on SunOS 4. * lib/getopt.c: Declare strncmp, to avoid warnings. Tue Apr 14 23:24:07 1998 Bruno Haible * lib/GetOpt.{h,cc}: Remove files. * lib/getopt.{h,c}, lib/getopt1.c: New files, from GNU libc. * lib/configure.in (AC_INIT): Search for hash.cc, not GetOpt.cc. * lib/Makefile.in (OBJECTS): Remove GetOpt.o, add getopt.o, getopt1.o. (getopt.o, getopt1.o, hash.o): Use explicit building rules. Some "make"s don't support to have both implicit rules for "%.o : %.c" and "%.o : %.cc" in the same Makefile. * lib/hash.{h,cc}: Remove #pragma; there are no templates here. * src/option.h (Options::usage): Remove. (Options::short_usage, Options::long_usage): Declare. * src/option.cc (Options::usage): Remove. (Options::short_usage, Options::long_usage): New functions. (long_options): New array. (Options::operator()): Use getopt_long instead of GetOpt::operator(), change all references to GetOpt members. * src/std-err.{h,cc}: Remove files. * src/gen-perf.cc, src/key-list.cc, list-node.cc, new.cc, options.cc: Call fprintf(stderr) instead of Std_Err::report_error(). * src/key-list.h, src/list-node.h, src/options.h: Don't use class Std_Err any more. * src/option.cc (program_name): New variable. * src/Makefile.in: Remove STD_ERR_H. (OBJECTS): Remove std-err.o. Mon Mar 23 01:03:35 1998 Bruno Haible * aclocal.m4, {lib,src,tests}/configure.in: Remove CL_CC_WORKS and CL_CXX_WORKS, already contained in autoconf 2.12. * src/gen-perf.cc, src/key-list.cc: Move some code from Gen_Perf::Gen_Perf() to Key_List::output(). * src/Makefile.in: Update dependencies. * src/options.{h,cc}: Remove option "-p". * src/key-list.cc (Key_List::set_output_types): Rewrite. (default_array_type, default_return_type): Remove. * src/key-list.cc: Adjust "const" handling. + With option "-t" [TYPE], don't emit wrong code if there is no space before the struct's opening brace. Sun Mar 22 16:59:15 1998 Bruno Haible * src/key-list.{h,cc}: Completely reorganized the output routines. Rewrote from scratch the output_switch() function. Use classes (Output_Constants, Output_Expr, Output_Compare) for abstraction. In particular: + Don't emit trailing whitespace and spurious blank lines. + Adjust indentation of the arrays. + Don't emit commas at the end of array initializers and struct initializers. + With option "-l" [LENTABLE], compare the length before fetching the word from memory. + With option "-S" [SWITCH], emit the comparison code just once, not once in every switch statement. + With option "-S" [SWITCH], choose the right switch statement through a binary search, not a linear search. + With option "-S" [SWITCH], emit straightforward comparisons instead of switch statements with just one "case" label. + With options "-S -p -t" [SWITCH, POINTER, TYPE], don't emit spurious empty elements at the beginning of the wordlist array. + With option "-D" [DUP] and not option "-S" [SWITCH], if there is no more room for duplicate entries in the lookup array, don't call `assert (i != 0)'. Instead, make the array larger :-) + With option "-D" [DUP], if there are no duplicates, don't automatically fall back to the non-"-D" algorithm. If the user wants the non-"-D" algorithm, he can just not specify "-D". + With option "-D" [DUP] and either options "-p -t" [POINTER, TYPE] or not option "-S" [SWITCH], don't emit spurious empty elements at the beginning of the wordlist array. + With option "-D" [DUP], simplify the detection and processing of duplicate entries in the lookup array. + With options "-D -l" [DUP, LENTABLE] and not option "-S" [SWITCH], don't forget to emit the lengthtable array. + With options "-D -l -S" [DUP, LENTABLE, SWITCH], don't forget to compare the lengths before comparing the strings. * src/gen-perf.cc: No need to include . * src/options.cc: Likewise. * src/options.cc: Don't use `errno' after freopen failed. * src/std-err.cc: `report_error' doesn't call strerror(errno) any more. No need to include and . * tests/Makefile.in (check-*): Any difference between .exp and .out is a failure. Don't ignore whitespace differences. * tests/Makefile.in (check-lang-syntax): Add some more checks. Fri Mar 20 00:54:54 1998 Bruno Haible * tests/jscript.gperf: Renamed from tests/javascript.gperf, because of Minix and SVR2 14-character filename limit. * src/key-list.cc (output_string): New function. (Key_List::output_switch, Key_List::output_keyword_table): Call it. * src/options.{h,icc,cc} (get_wordlist_name): New function. Add option -W. * src/key-list.cc (Key_List::output_switch, Key_List::output_keyword_table, Key_List::output_lookup_function): Use it. Patch from William Bader . * src/version.cc: Bump version number directly from 2.5 to 2.7, because Schmidt's last release from 1991 carries version number 2.6. Tue Jul 30 00:02:39 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) * Fixed a small bug in the Key_List::output_keyword_table routine that caused an extra newline to be printed if there where no leading blank entries... (who cares, right?!) Mon Jul 29 22:05:40 1991 Douglas C. Schmidt (schmidt at net4.ics.uci.edu) * Modified the handling of the -E (emit enums rather than #defines) option in conjunction with the -G option. Now, if -G and -E are given the enums are generated outside the lookup function, rather than within it! Mon Apr 8 18:17:04 1991 Doug Schmidt (schmidt at net4.ics.uci.edu) * Yucko, there was a bug in the handling of -c (and of course the new -I command in key-list.cc). Apparently when I added the super-duper hack that provided support for duplicate keys I forgot to update the strcmp output... Mon Mar 9 02:19:04 1998 Bruno Haible * Moved the documentation to doc/, put the stuff borrowed from libg++ into lib/. * Rewrote all Makefile.in's for better compliance with GNU standards. * Autoconf based configuration. Rewrote all configure.in's. Added aclocal.m4, with macros from CLISP and CLN. Added Makefile.devel. * src/depend: Removed. Dependencies are now in src/Makefile.in. * src/bool-array.icc: New file, contains inline functions, from both src/bool-array.h and src/bool-array.cc. * src/options.icc: New file, contains inline functions, from both src/options.h and src/options.cc. * src/read-line.icc: New file, contains inline functions, from both src/read-line.h and src/read-line.cc. * src/bool-array.h: Don't include . * src/bool-array.cc: Include . * src/gen-perf.cc: No need to include . Don't include <_G_config.h>. * src/hash-table.cc: Don't include and . Include and lib/hash.h instead. * src/iterator.cc: Don't include . * src/key-list.cc: Don't include . Include and instead. * src/list-node.cc: Don't include . Include instead. Remove `index' hack. * src/main.cc: Don't include <_G_config.h>. * src/new.cc: Don't include . Include instead. * src/options.cc: Don't include . Include and instead. * src/read-line.cc: Don't include . Include instead. * src/std-err.cc: Don't include . Include (for Irix). * src/vectors.h: No need to include . * src/version.cc: No need to include . * src/bool-array.h: Change `STORAGE_TYPE' from int to unsigned int. * src/bool-array.{h,cc}: Change type of `Bool_Array::size' from int to unsigned int. * src/bool-array.{h,cc}: Change type of `Bool_Array::init' argument from STORAGE_TYPE to unsigned int. * src/gen-perf.{h,cc}: Change two `Gen_Perf::compute_disjoint_union' argument types from `char *' to `const char *'. * src/iterator.h: Change type of `Iterator::str' and argument of `Iterator::Iterator' from `char *' to `const char *'. * src/iterator.cc: Cast to `unsigned char' before calling `isdigit'. * src/key-list.{h,cc}: Change type of `Key_List::array_type', `Key_List::return_type', `Key_List::struct_tag', `Key_List::include_src', `default_array_type', `default_return_type' and return type of `Key_List::get_array_type', `Key_List::get_special_input', `Key_List::save_include_src' from `char *' to `const char *'. * src/key-list.cc: Change "pretty gross" assignment. * src/key-list.cc: Don't use `alloca', HP-UX CC lacks it. * lib/GetOpt.cc: Likewise. * src/key-list.cc (merge): Use iteration instead of recursion. * src/list-node.{h,cc}: Change type of `List_Node::key', `List_Node::rest', `List_Node::char_set' from `char *' to `const char *'. * src/new.cc: Don't use BUFSIZ. Conditionalize the throw() declaration. * src/read-line.h: Don't use BUFSIZ. * src/read-line.cc: Make CHUNK_SIZE a constant, and use allocate the buffers on the stack by default. Use memcpy for copying buffers. Include . * src/read-line.icc (get_line): Use iteration instead of tail recursion. Don't call ungetc(EOF,stdin). * src/std-err.{h,cc}: Change type of `Std_Err::program_name' and of argument `Std_Err::report_error' from `char *' to `const char *'. * src/std-err.cc: `report_error' doesn't call `exit' any more. All callers changed to do that themselves. * src/trace.h: Make constructor/destructor calls non-inline. * src/key-list.cc (output_hash_function): If option[CPLUSPLUS], always make the hash function inline. (output): Declare the hash function inline, with the right name. * src/options.{h,cc}, src/gen-perf.cc, src/key-list.cc: Remove options -g, making it on by default. Remove option -a. Instead, introduce "-L KR-C", "-L C", "-L ANSI-C", "-L C++". * src/options.{h,cc}, src/key-list.cc: Add option -I. * src/key-list.cc: Don't emit "const" if compiling in mode "-L KR-C". * src/key-list.cc: Don't emit a comma at the end of an enum list. * src/main.cc: Remove COUNT_TIME code. * src/vectors.h, src/key-list.cc, src/options.cc, src/list-node.cc: ALPHA_SIZE defaults to 256 now. Add option -7. * tests/javascript.gperf: New file. * tests/jstest*.gperf, tests/validate: New tests. Sat Jan 31 01:38:11 1998 Alexandre Oliva * src/Makefile.in ($(TARGETPROG)): Add $(CFLAGS). Wed Jan 28 01:56:00 1998 Manfred Hollstein * configure.in (package_makefile_rules_frag): New and redirect stderr from ${srcdir}/config.shared to ${package_makefile_rules_frag}. * src/configure.in: Ditto. * tests/configure.in: Ditto. Fri Jan 23 08:00:41 1998 H.J. Lu (hjl@gnu.org) * gperf.texi (@ichapter): Changed to @chapter. Wed Jan 14 09:16:48 1998 H.J. Lu (hjl@gnu.org) * src/key-list.cc, src/key-list.h (Key_List::strcspn): Don't define if strcspn is defined. Fri Jan 24 13:23:47 1997 Mike Stump * src/new.cc (operator delete): Add the exception specification. Mon Feb 5 19:29:16 1996 Per Bothner * src/read-line.cc (Read_Line::readln_aux): Handle EOF if last line has a length which is an exact multiple of CHUNK_SIZE. (Used to throw away the line's contents.) From Bruno Haible . * src/Makefile.in ($(TARGETPROG)): Add -lm to link line. Tue Jun 11 13:43:50 1996 Brendan Kehoe * src/list-node.cc (List_Node): Reorder init of nodes to match declaration order. * src/hash-table.cc (Hash_Table): Likewise. Tue Oct 10 16:37:28 1995 Mike Stump * src/new.cc: Since malloc/delete are not paired, we cannot call free. Wed Jan 4 12:40:14 1995 Per Bothner * src/Makefile.in ($(TARGETPROG)): Link with $(LDFLAGS). Patch from John Interrante . Sat Nov 5 19:12:48 1994 Jason Merrill (jason@phydeaux.cygnus.com) * src/Makefile.in (LIBS): Remove. Tue Oct 18 17:51:14 1994 Per Bothner * src/std-err.cc: Use stderror, instead of the non-standard sys_nerr and sys_errlist. Sat Sep 17 22:02:13 1994 Per Bothner (bothner@kalessin.cygnus.com) * src/key-list.cc (output_hash_function): Patch from William Bader . Fri Jul 15 09:38:11 1994 Per Bothner (bothner@cygnus.com) * src/std-err.cc: #include , and only declare extern int errno if errno is not a macro. Mon May 30 17:29:34 1994 Per Bothner (bothner@kalessin.cygnus.com) * Makefile.in (src_all, install): Make sure to add '/' after `pwd` in $rootme, as expected by FLAGS_TO_PASS. Wed May 11 00:47:22 1994 Jason Merrill (jason@deneb.cygnus.com) Make libg++ build with gcc -ansi -pedantic-errors * src/options.h: Lose commas at end of enumerator lists. Sun Dec 5 19:16:40 1993 Brendan Kehoe (brendan@lisa.cygnus.com) * src/hash-table.cc (Hash_Table::~Hash_Table): Don't pass an argument to fprintf, since it's not expecting one. Fri Nov 26 19:03:18 1993 Per Bothner (bothner@kalessin.cygnus.com) * src/list-node.cc: #undef index, for the sake of broken NeXT, Thu Nov 4 11:16:03 1993 Per Bothner (bothner@kalessin.cygnus.com) * Makefile.in (install): Use INSTALL_DATA for gperf.1. Mon Oct 25 18:40:51 1993 Per Bothner (bothner@kalessin.cygnus.com) * src/key-list.cc (Key_List::read_keys): Use POW macro to increase hash table size to power of 2. * options.h (LARGE_STACK_ARRAYS): New flag. Defaults to zero. * gen-perf.cc, key-list.cc, read-line.cc: Only stack-allocate large arrays if LARGE_STACK_ARRAYS is set. * main.cc (main): Only call setrlimit (RLIMIT_STACK, ...) if LARGE_STACK_ARRAYS. Mon Oct 4 17:45:08 1993 Per Bothner (bothner@kalessin.cygnus.com) * src/gen-perf.cc: Always use ANSI rand/srand instead of BSDisms. Wed Aug 18 12:19:53 1993 Per Bothner (bothner@kalessin.cygnus.com) * Makefile.in (src_all): Make less verbose output. Fri May 28 14:01:18 1993 Per Bothner (bothner@rtl.cygnus.com) * src/gen-perf.cc (Gen_Perf::change): Don't use gcc-specific 2-operand conditional expression. * src/key-list.cc (Key_List::output_lookup_array): Don't use variable-size stack arrays, unless compiled by g++. Tue May 4 14:08:44 1993 Per Bothner (bothner@cygnus.com) Changes (mostly from Peter Schauer) to permit compilation using cfront 3.0 and otherwise be ARM-conforming. * src/key-list.h: class Key_List must use public derivation of base class Std_Err (because Gen_Perf::operator() in gen-perf.cc calls Std_Err::report_error). * src/gen-perf.cc (Gen_Perf::affects_prev), src/hash-table.cc (Hash_Table::operator()): Don't use gcc-specific 2-operand conditional expression. * src/iterator.cc (Iterator::operator()): Don't use gcc-specific range construct in case label. * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), src/gen-perf.cc (Gen_Perf::operator(), src/read-line.cc (Read_Line::readln_aux): If not gcc, don't allocate variable-sized arrays on stack. * src/new.cc (operator new): Argument type should be size_t. * key-list.cc (Key_List::output_lookup_array, Key_List::read_keys), new/cc (::operator new): Don't use non-standard >?= operator. Tue Apr 27 20:11:30 1993 Per Bothner (bothner@cygnus.com) * src/Makefile.in: Define TARGETPROG, and use it. Mon Apr 19 00:29:18 1993 Per Bothner (bothner@cygnus.com) * Makefile.in, configure.in: Re-vamped configure scheme. * gperf.texinfo: Renamed to gperf.texi. * src/bool-array.{h,cc}: ANSIfy bzero->memset. Sat Jan 30 20:21:28 1993 Brendan Kehoe (brendan@lisa.cygnus.com) * tests/Makefile.in (mostlyclean): Also delete aout, cout, m3out, pout, and preout. Tue Dec 29 08:58:17 1992 Ian Lance Taylor (ian@cygnus.com) * Makefile.in: pass $(FLAGS_TO_PASS) to all calls to make. (FLAGS_TO_PASS): added INSTALL, INSTALL_DATA, INSTALL_PROGRAM. Mon Dec 21 18:46:46 1992 Per Bothner (bothner@rtl.cygnus.com) * tests/expected.* renamed to *.exp to fit in 14 chars. * tests/Makefile.in: Update accordingly. Also rename output.* to *.out. * src/Makefile.in (clean): Remove gperf program. Wed Dec 9 14:33:34 1992 Per Bothner (bothner@cygnus.com) * src/hash-table.cc, src/bool-array.h: ANSIfy bzero->memset. Thu Dec 3 19:34:12 1992 Per Bothner (bothner@cygnus.com) * Makefile.in (distclean, realclean): Don't delete Makefile before recursing. Fri Nov 6 13:41:49 1992 Per Bothner (bothner@rtl.cygnus.com) * key-list.{h,cc}: Remove MAX_INT (and similar) constant fields from Key_List class, and use INT_MAX (etc) from limits.h. * key-list.{h,cc}, options.{h,cc}, vectors.h: Removed all uses of initialized const fields, as they are non-standard - and their use was easy to do away with. Mostly, just made the constants static non-fields in the .cc file. Mon Nov 2 13:10:11 1992 Per Bothner (bothner@cygnus.com) * tests/Makefile.in: When generating cinset.c, don't pass -C, since -C assumes an ANSI compiler. Add the -C flag (with -a) when generating test.out.3 instead. * tests/expected.out.3: Update accordingly. Wed Aug 12 11:47:54 1992 Per Bothner (bothner@cygnus.com) * Makefile.in: Factor out common flags into $(FLAGS_TO_PASS). * Makefile.in: 'install-info' depends on gperf.info. Mon Aug 10 11:39:52 1992 Ian Lance Taylor (ian@dumbest.cygnus.com) * Makefile.in, src/Makefile.in: always create installation directories. Mon Jul 20 15:33:21 1992 Mike Stump (mrs@cygnus.com) * src/new.cc (operator new): Add cast from void * to char *, since it is not a standard conversion. Wed Jun 17 16:25:30 1992 Per Bothner (bothner@rtl.cygnus.com) * src/gen-perf.cc: #include <_G_config.h> for _G_SYSV. * src/key-list.cc: alloca() hair. * src/main.cc (main): Only call getrlimit if _G_HAVE_SYS_RESOURCE. * Makefile,in, {src,test}/Makefile.in: Fix *clean rules. Fri May 29 13:21:13 1992 Per Bothner (bothner@rtl.cygnus.com) * src/gen-perf.cc: Replace USG -> _G_SYSV. Thu May 14 13:58:36 1992 Per Bothner (bothner@rtl.cygnus.com) * src/Makefile.in: Don't pass obsolete flag -DUNLIMIT_STACK. * tests/Makefile.in (clean): Fix. Sat Mar 7 00:03:56 1992 K. Richard Pixley (rich@rtl.cygnus.com) * gperf.texinfo: added menu item hook. Wed Feb 26 18:04:40 1992 K. Richard Pixley (rich@cygnus.com) * Makefile.in, configure.in: removed traces of namesubdir, -subdirs, $(subdir), $(unsubdir), some rcs triggers. Forced copyrights to '92, changed some from Cygnus to FSF. Sun Jan 26 19:21:58 1992 Per Bothner (bothner at cygnus.com) * tests/Makefile.in: Use re-directed stdin instead of file name in argv. This allows us to remove the filename from the output, the expected output, and hence the diffs. (Note that the input file is in $(srcdir), which we cannot place in the expected out files.) * tests/expected.out.[1235]: Edit out input filename, to match new output. Thu Jun 28 16:17:27 1990 Doug Schmidt (schmidt at brilliant) * Wow, first fix on the new job! There was a dumb error in Key_List::output_lookup_function, where I printed the string "&wordlist[key]" instead of the correct "&wordlist[index]". * Added a couple of #ifdefs for USG support. Sun Jun 3 17:16:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Updated the version number to 2.5 and sent to Doug Lea for release with the latest GNU libg++. * Changed the error handling when a keyword file cannot be opened (now calls perror). Wed May 30 14:49:40 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Instrumented the source code with trace statements automagically inserted using my new automated trace instrumentation tool! Wed May 9 11:47:41 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) * Really fixed the previous bug. Turns out that a small amount of logic had to be duplicated to handle static links that occur as part of dynamic link chains. What a pain!!! Tue May 8 23:11:44 1990 Doug Schmidt (schmidt at siam.ics.uci.edu) * Fixed a stupid bug in Key_List::output_lookup_array that was causing incorrect counts to be generated when there were both static and dynamic links occurring for the same hash value. Also simplified the code that performs the logic in this routine. Mon Apr 30 17:37:24 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Fixed stupid bug in Key_List::output_lookup_array that was making the generated lookup[] array contain `chars' even when the values stored in the chars are greater than 127! * Changed the behavior of the -G (global table) option so that it will output the `length[]' array in the global scope along with the `word_list[]' array. * Fixed a stupid bug in Key_List::output_lookup_function that would always output the complicated `duplicate-handling' lookup logic, even when there were no duplicates in the input! * Yikes, had to modify a bunch of stuff in key-list.cc to correctly handle duplicate entries. Changed the generated code so that the MIN_HASH_VALUE is no longer subtracted off when calculating the hash value for a keyword. This required changing some other code by substituting MAX_HASH_VALUE for TOTAL_KEYS in several places. Finally, this means that the generated tables may contain leading null entries, but I suppose it is better to trade-off space to get faster performance... Mon Mar 26 13:08:43 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Updated version number to 2.4 to reflect the latest changes. * Changed the main program so that it always prints out gperf's execution timings to the generated output file. Sun Mar 25 12:39:30 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Added the -Z option so that users can specify the name of the generated class explicitly. Updated documentation to reflect this change. * Modified the generated C++ class interface so that the functions are declared static (to remove the overhead of passing the `this' pointer). This means that operator()() can no longer be used, since it only works on non-static member functions. Also changed things so that there is no constructor (why waste the extra call, when it doesn't do anything, eh?) * Modified the behavior of Key_List::output when the -L C++ option is enabled. Previously the code generated use const data members to record MIN_WORD_LENGTH, MIN_HASH_VALUE, etc. However, as pointed out by James Clark this may result in suboptimal behavior on the part of C++ compilers that can't inline these values. Therefore, the new behavior is identical to what happens with -L C, i.e., either #defines or function-specific enums are used. Why sacrifice speed for some abstract notion of `code purity?' ;-) Tue Mar 6 18:17:42 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Added the -E option that defines constant values using an enum local to the lookup function rather than with #defines. This also means that different lookup functions can reside in the same file. Thanks to James Clark (jjc@ai.mit.edu). Sat Mar 3 20:19:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * Added a special case to key_list::output_switch that doesn't generate extra comparisons when the `-S' is given an argument of 1 (the normal case). This should speed up the generated code output a tad... Fri Feb 23 14:21:28 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * Renamed all instances of member function get_keysig_size to get_max_keysig_size, since this is more precise... * Changed all occurrences of charset to keysig (stands for ``key signature'') to reflect the new naming convention used in the USENIX paper. Thu Feb 22 11:28:36 1990 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Changed the name of the generated associated values table from asso_value to asso_values to reflect conventions in the USENIX C++ paper. Thu Feb 15 23:29:03 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * Updated the gperf.texinfo file to fix some formatting problems that had crept in since last time. Wed Feb 14 23:27:24 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * Fixed stupid bug in key-list.cc (get_special_input), wher gperf replaced each '%' with the succeeding character. * Added support for multiple target language generation. Currently handled languages are C and C++, with C as the default. Updated documentation and option handler to reflect the changes. * Added a global destructor to new.cc and removed the #ifdef, since the bloody thing now works with libg++. Mon Feb 14 13:00:00 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * Found out that my gperf paper was accepted at the upcoming USENIX C++ Conference in San Francisco. Yow! Tue Jan 30 09:00:29 1990 Doug Schmidt (schmidt at zola.ics.uci.edu) * #ifdef'd out the new.cc memory allocator, since there are problems with this and the libg++ stuff. * Changed key-list.h so that class Vectors is a public (rather than private) base class for class Key_List. The previous form was illegal C++, but wasn't being caught by the old g++ compiler. Should work now... ;-) Sun Dec 10 14:08:23 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added several changes from rfg@ics.uci.edu. These changes help to automate the build process. Wed Nov 15 15:49:33 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Removed conditional compilation for GATHER_STATISTICS. There's really no good reason to avoid collecting this info at run-time, since that section of code is *hardly* the bottleneck... ;-) * Simplified the C output routines in Key_List::set_output_types and Key_List::output_keyword_table a bit in order to speed-up and clean up the code generation. * Modified function Key_List::get_special_input so that it does not try to `delete' a buffer that turned out to be too short. This is important since the new memory management scheme does not handle deletions. However, adding a small amount of garbage won't hurt anything, since we generally don't do this operation more than a couple times *at most*! * Created a new file (new.cc) which includes my own overloaded operator new. This function should dramatically reduce the number of calls to malloc since it grabs large chunks and doles them out in small pieces. As a result of this change the class-specific `operator new' was removed from class List_Node. Tue Nov 14 21:45:30 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Continued to refine the great hack. The latest trick is to try and replace most uses of dynamic memory (i.e., calls to new) with uses of gcc dynamic arrays (i.e., an alloca solution). This makes life much easier for the overall process-size, since it reduces the amount of overhead for memory management. As a side-effect from this change there is no reason to have the Bool_Array::dispose member function, so it's outta here! * Fixed a stupid bug that was an disaster waiting to happen... Instead of making the boolean array large enough to index max_hash_value it was only large enough to index max_hash_value - 1. Once again, an off-by-one mistake in C/C++!!!! Mon Nov 13 19:38:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added the final great hack! This allows us to generate hash tables for near-perfect hash functions that contain duplicates, *without* having to use switch statements! Since many compilers die on large switch statements this feature is essential. Furthermore, it appears that the generated code is often *smaller* than that put out by compilers, even though a large, sparse array must be created. Here's the general idea: a. Generate the wordlist as a contiguous block of keywords, just as before when using a switch statement. This wordlist *must* be sorted by hash value. b. Generate the lookup array, which is an array of signed {chars,shorts,ints}, (which ever allows full coverage of the wordlist dimensions). If the value v, where v = lookup[hash(str,len)], is >= 0 and < TOTAL_KEYWORDS, then we simply use this result as a direct access into the wordlist array to snag the keyword for comparison. c. Otherwise, if v is < -TOTAL_KEYWORDS or > TOTAL_KEYWORDS this is an indication that we'll need to search through some number of duplicates hash values. Using a hash linking scheme we'd then index into a different part of the hash table that provides the starting index and total length of the duplicate entries to find via linear search! Sun Nov 12 13:48:10 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Simplified Key_List::output_min_max considerably by recognizing that since the keyword list was already sorted by hash value finding the min and max values is trivial! * Improved the debugging diagnostics considerably in classes Key_List, Hash_Table, and Gen_Perf. * Modified the `-s' option so that a negative argument is now interpreted to mean `allow the maximum associated value to be about x times *smaller* than the number of input keys.' This should help prevent massive explosion of generated hash table size for large keysets. Sat Nov 11 11:31:13 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added a field in class Key_List that counts the total number of duplicate keywords, both static and dynamic. * Added a new member function Bool_Array that deletes the dynamic memory allocated to Bool_Array::storage_array. This space may be needed for subsequent options, so it made sense to free it as soon as possible... * Renamed file/class Alpha_Vectors to Vectors, to avoid problems with 14 character length filenames on SYSV. Also changed file adapredefined.gperf to adadefs.gperf in the ./tests directory. * Modified class Options by changing the member function Options::total_positions to Options::get_charset_size and Options::set_charset_size. These two routines now either return the total charset size *or* the length of the largest keyword if the user specifies the -k'*' (ALLCHARS) option. This change cleans up client code. * Merged all the cperf changes into gperf. * Made sure to explicitly initialize perfect.fewest_collisions to 0. * Cleaned up some loose ends noticed by Nels Olson. 1. Removed `if (collisions <= perfect.fewest_collisions)' from Gen_Perf::affects_prev since it was superfluous. 2. Removed the fields best_char_value and best_asso_value from Gen_Perf. There were also unnecessary. 3. Fixed a braino in the Bool_Array::bool_array_reset function. Since iteration numbers can never be zero the `if (bool_array.iteration_number++ == 0)' must be `if (++bool_array.iteration_number == 0).' 4. Modified Std_Err::report_error so that it correctly handles "%%". * It is important to note that -D no longer enables -S. There is a good reason for this change, which will become manifested in the next release... (suspense!). * Made some subtle changes to Key_List::print_switch so that if finally seems to work correctly. Needs more stress testing, however... * Made a major change to the Key_List::print_switch function. The user can now specify the number of switch statements to generate via an argument to the -S option, i.e., -S1 means `generate 1 switch statement with all keywords in it,' -S2 means generate 2 switch statements with 1/2 the elements in each one, etc. Hopefully this will fix the problem with C compilers not being able to generate code for giant switch statements (but don't hold your breath!) * Changed Key_List::length function to Key_List::keyword_list_length. * Added a feature to main.c that prints out the starting wall-clock time before the program begins and prints out the ending wall-clock time when the program is finished. * Added the GATHER_STATISTICS code in hash-table.c so we can keep track of how well double hashing is doing. Eventually, GATHER_STATISTICS will be added so that all instrumentation code can be conditionally compiled in. * Fixed a stupid bug in Key_List::print_switch routine. This was necessary to make sure the generated switch statement worked correctly when *both* `natural,' i.e., static links and dynamic links, i.e., unresolved duplicates, hash to the same value. * Modified Bool_Array::~Bool_Array destructor so that it now frees the bool_array.storage_array when it is no longer needed. Since this array is generally very large it makes sense to return the memory to the freelist when it is no longer in use. * Changed the interface to constructor Hash_Table::Hash_Table. This constructor now passed a pointer to a power-of-two sized buffer that serve as storage for the hash table. Although this weakens information hiding a little bit it greatly reduces dynamic memory fragmentation, since we can now obtain the memory via a call to alloca, rather than malloc. This change modified Key_List::read_keys calling interface. * Since alloca is now being used more aggressively a conditional compilation section was added in main.c. Taken from GNU GCC, this code gets rid of any avoidable limit on stack size so that alloca does not fail. It is only used if the -DRLIMIT_STACK symbol is defined when gperf is compiled. * Added warnings in option.c so that user's would be informed that -r superceeds -i on the command-line. * Rewrote Gen_Perf::affects_prev. First, the code structure was cleaned up considerably (removing the need for a dreaded goto!). Secondly, a major change occurred so that Gen_Perf::affects_prev returns FALSE (success) when fewest_hits gets down to whatever it was after inserting the previous key (instead of waiting for it to reach 0). In other words, it stops trying if it can resolve the new collisions added by a key, even if there are still other old, unresolved collisions. This modification was suggested by Nels Olson and seems to *greatly* increase the speed of gperf for large keyfiles. Thanks Nels! * In a similar vein, inside the Gen_Perf::change routine the variable `perfect.fewest_collisions is no longer initialized with the length of the keyword list. Instead it starts out at 0 and is incremented by 1 every time change () is called. The rationale for this behavior is that there are times when a collision causes the number of duplicates (collisions) to increase by a large amount when it would presumably just have gone up by 1 if none of the asso_values were changed. That is, at the beginning of change(), you could initialize fewest_hits to 1+(previous value of fewest_hits) instead of to the number of keys. Thanks again, Nels. * Replaced alloca with new in the Gen_Perf::change function. This should eliminate some overhead at the expense of a little extra memory that is never reclaimed. * Renamed Gen_Perf::merge_sets to Gen_Perf::compute_disjoint_union to reflect the change in behavior. * Added the -e option so users can supply a string containing the characters used to separate keywords from their attributes. The default behavior is ",\n". * Removed the char *uniq_set field from LIST_NODE and modified uses of uniq_set in perfect.c and keylist.c. Due to changes to Gen_Perf::compute_disjoint_sets this field was no longer necessary, and its removal makes the program smaller and potentially faster. * Added lots of changes/fixes suggested by Nels Olson (umls.UUCP!olson@mis.ucsf.edu). In particular: 1. Changed Bool_Array so that it would dynamically create an array of unsigned shorts rather than ints if the LO_CAL symbol was defined during program compilation. This cuts the amount of dynamic memory usage in half, which is important for large keyfile input. 2. Added some additional debugging statements that print extra info to stderr when the -d option is enabled. 3. Fixed a really stupid bug in Key_List::print_switch A right paren was placed at the wrong location, which broke strlen (). 4. Fixed a subtle problem with printing case values when keylinks appear. The logic failed to account for the fact that there can be keylinks *and* regular node info also! 5. Changed the behavior of Key_List::read_keys so that it would honor -D unequivocally, i.e., it doesn't try to turn off dup handling if the user requests it, even if there are no immediate links in the keyfile input. 6. Modified the -j option so that -j 0 means `try random values when searching for a way to resolve collisions.' 7. Added a field `num_done' to the Gen_Perf struct. This is used to report information collected when trying to resolve hash collisions. 8. Modified the merge_sets algorithm to perform a disjoint union of two multisets. This ensures that subsequent processing in Gen_Perf::affect_prev doesn't waste time trying to change an associated value that is shared between two conflicting keywords. 9. Modified Gen_Perf::affects_prev so that it doesn't try random jump values unless the -j 0 option is enabled. 10. Fixed a silly bug in Gen_Perf::change. This problem caused gperf to seg fault when the -k* option was given and the keyfile file had long keywords. Sun Oct 29 00:18:55 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) * Modified class-specific new operations for Read_Line and List_Node so they don't fail if SIZE is larger than twice the previous buffer size. Note we double buffer size everytime the previous buffer runs out, as a heuristic to reduce future calls to malloc. Sun Oct 22 13:49:43 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Updated gperf version number to 2.0. Send to Doug Lea for incorporation into the long-awaited `official' libg++ 1.36 release! * Thanks to Nels Olson a silly bug in Gen_Perf::change () was fixed. This problem caused gperf to seg fault when the -k* option was given and the keyfile file had long keywords. * Modified Key_List::print_hash_function so that it output max_hash_value + 1 (rather than just max_hash_value) for any associated value entries that don't correspond to keyword charset characters. This should speed up rejection of non-keyword strings a little in some cases. Sat Oct 21 19:28:36 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Fixed Key_List::print_hash_function so that it no longer output things like `return 0 + ...' Although this probably gets optimized away by even the worst C compilers there isn't any point tempting fate... ;-) * Fixed class List_Node's constructor so that it wouldn't a priori refuse to consider trying to hash keys whose length is less than the smallest user-specified key position. It turns out this is not a problem unless the user also specifies the -n (NOLENGTH) option, in which case such keys most likely don't have a prayer of being hashed correctly! * Changed the name of the generated lookup table from `Hash_Table' to `asso_value' to be consistent with the gperf paper. Tue Oct 17 14:19:48 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added a flag GATHER_STATISTICS in the Makefile. If defined during compilation this turns on certain collection facilities that track the performance of gperf during its execution. In particular, I want to see how many collisions occur for the double hashing Hash_Table. * Added a safety check so that we don't screw up if the total number of `resets' of the Bool_Array exceeds MAX_INT. Since this number is around 2^31 it is unlikely that this would ever occur for most input, but why take the risk? * Changed the behavior for the -a (ANSI) option so that the generated prototypes use int rather than size_t for the LEN parameter. It was too ugly having to #include all over the place... Mon Oct 16 11:00:35 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Continued to work on the gperf paper for the USENIX C++ conference. At some point this will be merged back into the gperf documentation... Sat Oct 14 20:29:43 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) * Added a majorly neat hack to Bool_Array, suggested by rfg. The basic idea was to throw away the Ullman array technique. The Ullman array was used to remove the need to reinitialize all the Bool_Array elements to zero everytime we needed to determine whether there were duplicate hash values in the keyword list. The current trick uses an `iteration number' scheme, which takes about 1/3 the space and reduces the overall program running a time by about 20 percent for large input! The hack works as follows: 1. Dynamically allocation 1 boolean array of size k. 2. Initialize the boolean array to zeros, and consider the first iteration to be iteration 1. 2. Then on all subsequent iterations we `reset' the bool array by kicking the iteration count by 1. 3. When it comes time to check whether a hash value is currently in the boolean array we simply check its index location. If the value stored there is *not* equal to the current iteration number then the item is clearly *not* in the set. In that case we assign the iteration number to that array's index location for future reference. Otherwise, if the item at the index location *is* equal to the iteration number we've found a duplicate. No muss, no fuss! Mon Oct 2 12:30:54 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Changed some consts in options.h to enumerals, since g++ doesn't seem to like them at the moment! Sat Sep 30 12:55:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed a stupid bug in Key_List::print_hash_function that manifested itself if the `-k$' option was given (i.e., only use the key[length] character in the hash function). * Added support for the -C option. This makes the contents of all generated tables `readonly'. * Changed the handling of generated switches so that there is only one call to str[n]?cmp. This *greatly* reduces the size of the generated assembly code on all compilers I've seen. * Fixed a subtle bug that occurred when the -l and -S option was given. Code produced looked something like: if (len != key_len || !strcmp (s1, resword->name)) return resword; which doesn't make any sense. Clearly, this should be: if (len == key_len && !strcmp (s1, resword->name)) return resword; Tue Sep 26 10:36:50 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Changed class Read_Line's definition so that it no longer needs to know about the buffering scheme used to speed up dynamic memory allocation of input keywords and their associated attributes. This means that operator new is no longer a friend of Read_Line. Mon Sep 25 23:17:10 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Decided that Obstacks had too much overhead, so they were removed in favor of super-efficient, low-overhead buffered storage allocation hacks in Read_Line and List_Node. * No longer try to inline functions that g++ complains about (Key_List::Merge and Key_List::Merge_Sort). Sun Sep 24 13:11:24 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Changed classes Read_Line and List_Node to use Obstacks in order to cache memory allocation for keyword strings and List_Nodes. * Continued to experiment with inheritance schemes. * Added a new file `alpha.h', that declares static data shared (i.e., inherited) between classes List_Node and Key_List. Tue Sep 12 16:14:41 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Made numerous changes to incorporate multiple inheritance in gperf. Wed Aug 16 23:04:08 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added the -DCOMPILER_FIXED flag to the ./src/Makefile. This implies that people trying to compile gperf need to have a working version of the new g++ compiler (1.36.0). * Removed some extra spaces that were being added in the generated C code. Mon Jul 24 17:09:46 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed PRINT_HASH_FUNCTION and PRINT_LOOKUP_FUNCTION in keylist.c so that the generated functions take an unsigned int length argument. If -a is enabled the prototype is (const char *str, size_t len). Fri Jul 21 13:06:15 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Fixed a typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented the indentation from working correctly. * Fixed a horrible typo in PRINT_KEYWORD_TABLE in keylist.cc that prevented links from being printed correctly. Tue Jul 18 16:04:31 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Fixed up readline.cc and readline.h so that they work OK with g++ compilers that aren't completely up-to-date. If symbol COMPILER_FIXED is defined then the behavior that works on my more recent version of g++ is enabled. Sun Jul 9 17:53:28 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Changed the ./tests subdirectory Makefile so that it uses $(CC) instead of gcc. Sun Jul 2 21:52:15 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed a number of subtle bugs that occurred when -S was combined with various and sundry options. * Added the -G option, that makes the generated keyword table a global static variable, rather than hiding it inside the lookup function. This allows other functions to directly access the contents in this table. * Added the "#" feature, that allows comments inside the keyword list from the input file. Comment handling takes place in readline.c. This simplifies the code and reduces the number of malloc calls. * Also added the -H option (user can give the name of the hash function) and the -T option (prevents the transfer of the type decl to the output file, which is useful if the type is already defined elsewhere). Thu Jun 22 20:39:39 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Modified many classes so that they would inherit Std_Err as a base class. This makes things more abstract... Fri Jun 16 14:23:00 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Modified the -f (FAST) option. This now takes an argument. The argument corresponds to the number of iterations used to resolve collisions. -f 0 uses the length of the keyword list (which is what -f did before). This makes life much easier when dealing with large keyword files. Tue Jun 6 17:53:27 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added the -c (comparison) option. Enabling this will use the strncmp function for string comparisons. The default is to use strcmp. * Fixed a typo in key_list.cc (PRINT_SWITCH). This caused faulty C code to be generated when the -D, -p, and -t options were all enabled. Thu May 25 14:07:21 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) * Once again, changed class Read_Line to overload global operator new. Hopefully, this will work...! Sun May 21 01:51:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Modified Key_List::print_hash_function () so that it properly formats the associated values in the hash table according to the maximum number of digits required to represent the largest value. * Removed the named return value from class Hash_Table's operator (), since this causes a seg fault when -O is enabled. No sense tripping subtle g++ bugs if we don't have to.... ;-) * Removed the operator new hack from Read_Line, since this seemed to create horrible bus error problems. * Changed many class member functions and data members to be `static', if they don't manipulate this! Fri May 12 23:06:56 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Changed class Std_Err to use static member functions, a la Ada or Modula 2. This eliminates the need for an explicit error-handler class object. * Added the ``named return value'' feature to Hash_Table::operator () and Bool_Array::operator [], just for the heck of it.... ;-) * Changed the previous hack in Read_Line so that we now use the overloaded global `new' instead of NEW_STRING! Wed May 3 17:36:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Updated to version 1.7. This reflects the recent major changes and the new C port. * Modified the GNU getopt.cc routine to have a class-based interface. * Fixed a typo in Perfect.cc ~Perfect that prevented the actual maximum hash table size from being printed (maybe the stream classes weren't so bad after all.... ;-). * Added support for the -f option. This generates the perfect hash function ``fast.'' It reduces the execution time of gperf, at the cost of minimizing the range of hash values. Tue May 2 16:23:29 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Added an efficiency hack to Read_Line. Instead of making a call to operator NEW (a.k.a. malloc) for each input string a new member function NEW_STRING stores a large buffer from which new strings are carved out, growing the buffer if necessary. It might be useful to add this throughout the program.... * Removed all unnecessary calls to DELETE. If the program is about to exit it is silly to waste time freeing memory. * Added the GNU getopt program to the distribution. This makes GPERF portable to systems that don't include getopt in libc. * Added a strcspn member to class Key_List. This also increases portability. * Added the get_include_src function from keylist.c as a member function in class Key_List. Hopefully every function is now associated with a class. This aids abstraction and modularity. * Ported gperf to C. From now on both K&R C and GNU G++ versions will be supported. There will be two ChangeLog files, one for each version of the program. Mon May 1 16:41:45 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed a bug with -k'*'. This now prints out *all* the cases up to the length of the longest word in the keyword set. Sun Apr 30 12:15:25 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Removed all use of the stream classes. Too ugly, slow, and not handled by the c++-mode formatter.... * Modified the handling of links (i.e., keywords that have identical hash values as other keywords). This should speed up hash function generation for keyword sets with many duplicate entries. The trick is to treat duplicate values as equivalence classes, so that each set of duplicate values is represented only once in the main list processing. * Fixed some capitialization typos and indentations mistakes in Key_List::print_hash_function. Sat Apr 29 12:04:03 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Fixed a typo/logico in Key_List::print_switch that prevented the last keyword in the keyword list to be print out. This requires further examination..... * Fixed a stupid bug in List_Node::List_node. If the -k'*' option was enabled the KEY_SET string wasn't getting terminated with '\0'! Fri Apr 28 12:38:35 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Renamed strexp.h and strexp.cc to iterator.h and iterator.cc. Also changed the strexp class to iterator. Continued to work on style... * Updated the version number to 1.6. This reflects all the recent changes. Thu Apr 27 00:14:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added the -D option that properly handles keyword sets that contain duplicate hash values. * Continued the stylistic changes. Added the #pragma once directive to all the *.h files. Removed all #defines and replaced them with static consts. Also moved the key_sort routine from options.cc into the options class as a member function. Mon Apr 3 13:26:55 1989 Doug Schmidt (schmidt at zola.ics.uci.edu) * Made massive stylistic changes to bring source code into conformance with GNU style guidelines. Thu Mar 30 23:28:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Fixed up the output routines so that they generate code corresponding to the GNU style guidelines. Sat Mar 11 13:12:37 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed Stderr constructors so that they wouldn't try to use the base class initializer syntax for the static class variable Program_Name. G++ 1.34 is stricter in enforcing the rules! Fri Mar 10 11:24:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Removed -v and ``| more'' from the Makefile to keep rfg happy... Thu Mar 2 12:37:30 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Sent latest GNU gperf version 1.5 to Doug Lea for inclusion into libg++ 1.34. Note that there is a small bug with the new %{ ... %} source inclusion facility, since it doesn't understand comments and will barf if %{ or %} appear nested inside the outermost delimiters. This is too trivial of a defect to fix at the moment... Tue Feb 28 11:19:58 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added the -K option, which allows the user to provide a alternative name for the keyword structure component. The default is still ``name.'' * Added the LEX and YACC-like ability to include arbitrary text at the beginning of the generated C source code output. This required two new functions Get_Special_Input, Key_List::Save_Include_Src; * Fixed memory allocation bug in Key_List::Set_Types. Variable Return_Type needs 1 additional location to store the "*" if the -p option is used. * Added code to NULL terminate both Struct_Tag and Return_Type, *after* the strncpy (stupid mistake). Mon Feb 27 14:39:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added a new option -N. This allows the user to specify the name to be used for the generated lookup function. The default name is still ``in_word_set.'' This makes it possible to completely automate the perfect hash function generation process! Mon Feb 20 23:33:14 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Corrected the Hash_Table::operator () function so that *it* is responsible for deciding when a new key has the same signature as a previously seen key. The key length information is now used internally to this function to decide whether to add to the hash table those keys with the same key sets, but different lengths. Before, this was handled by the Key_List::Read_Keys function. However, this failed to work for certain duplicate keys, since they weren't being entered into the hash table properly. Sun Feb 19 16:02:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Modified class Options by moving the enum Option_Type out of the class. This is to satisfy the new enumeration scope rules in C++. Sun Jan 15 15:12:09 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Incremented the version number upto 1.4 to reflect the new options that affect the generated code. Send the new distribution off to Michael for use with g++ 1.33. * Added a fix to Key_List::Read_Keys so that it checks for links properly when the -n option is used. Previously, it didn't catch obvious links, which caused it to spend large amount of time searching for a solution that could never occur! * Modified the Key_List data structure to record *both* the minimum and the maximum key lengths. This information is now computed in Key_List::Read_Keys, and thus Key_List::Print_Min_Max doesn't need to bother. * Modifed the key position iterator scheme in options.cc to eliminate the need for member function Options::Advance. Now, the Options::Get function performs the advancement automatically, obviating the need for an extra function call. * Added the new function Options::Print_Options, to print out the user-specified command line options to generated C output file. * Added a new function, Key_List::Print_Keylength_Table, which creates a table of lengths for use in speeding up the keyword search. This also meant that a new option, -l (LENTABLE) is recognized. It controls whether the length table is printed and the comparison made in the generated function ``in_word_set.'' * Added a comment at the top of the generated C code output file that tells what version of gperf was used. Next, I'll also dump out the command line options as a comment too. Thanks to Michael Tiemann for the feedback on this. * Fixed the -n option to make it work correctly with other parts of the program (most notably the Perfect::Hash function and the computation of minimum and maximum lengths. Fri Jan 13 21:25:27 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) * Realized the the need to add a test that will enable optimziation of the generated C code in the ``hash'' function by checking whether all the requested key positions are guaranteed to exist due to the comparison in `in_word_set.'' I'll put this in soon.... Thu Jan 12 20:09:21 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Added pascal, modula3, and modula2 tests inputs to the Makefile * Recognised that there is a bug with the -n option. However I'm too busy to fix it properly, right now. The problem is that the generated #define end up being 0, since that's my hack to make -n work. This needs complete rethinking! Tue Jan 10 00:08:16 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Added a new option, -n, that instructs gperf to not use the length of an identifier when computing the hash functions. I'm not sure how useful this is! * Retransmitted the distribution to rocky.oswego.edu. Hopefully, this will work! * Began fixing the indentation and capitalization to conform to the GNU coding guidelines. Mon Jan 9 22:23:18 1989 Doug Schmidt (schmidt at pompe.ics.uci.edu) * Fixed horrible bug in Read_Line::Readln_Aux. This was a subtle and pernicous off-by-1 error, that overwrote past the last character of the input string buffer. I think this fault was killing the vax! * Yow, fixed an oversight in List_Node::List_Node, where the pointer field Next was uninitialized. Luckily, the new routine seems to return 0 filled objects the first time through! Sun Jan 8 13:43:14 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Modified the ``key linked'' diagnostic in Key_List::Read_Keys to be more helpful and easy to read. * Fixed the List_Node::List_Node so that it would ignore trailing fields if the -t option was not enabled. * Moved the List_Node declarations out of keylist.h and into a file of its own, called listnode.cc and listnode.h Made Set_Sort a member function of class List_Node. * Massively updated the documentation in the gperf.texinfo file. * Polished off the major revision to the print functions, added a few new tests in the Makefile to check for the validity of the program and ftp'ed the entire distribution off to Doug Lea for libg++. ( changed it to 1.3 to reflect the major changes with the generated C code ). * Fixed Key_List::Print_Switch to deal with the -p and -t options. This meant that the ``still-born'' function Key_List:: Print_Type_Switch was superflous, so I removed it. Also, removed the restriction in Option that the -p and -t options couldn't be used simultaneously. * Modified List_Node::List_Node, to perform only 1 call to ``new'' when dynamically allocating memory for the Key_Set and the Uniq_Set. Sat Jan 7 14:10:51 1989 Doug Schmidt (schmidt at glacier.ics.uci.edu) * Fixed a big bug with the new policy of nesting the wordlist inside of generated function ``in_word_set.'' I'd forgotten to declare the wordlist array as static! ( arrgh ). * Added a new function Key_List::Set_Types, that figures out the return type for generated function ``in_word_set,'' the user-defined ``struct tag,'' if one is used, and also formates the array type for the static local array. * Changed the print routines to take advantage of the new -p option. * Began adding the hooks to allow the return of a pointer to a user defined struct location from the generated ``in_word_set'' function instead of the current 0 or 1 return value. Created function Key_List::Print_Type_Switch and added option -p to class Option, allowing the user to request generation of the aforementioned pointers returned instead of booleans. * Put in checks in class Option to make sure that -S and -t options are not used simultaneously. This restriction will be removed in subsequent releases, once I decide on a clean way to implement it. * Sent version 1.2 to Doug Lea for possible inclusion into the libg++ distribution. * Moved the static word_list array inside the generated function in_word_set. This supports better data hiding. * Added a texinfo file, gperf.texinfo * Revised the Makefile to cleanup the droppings from texinfo and changed the name of gperf.cc and gperf.h to perfect.cc and perfect.h. Fri Jan 6 13:04:45 1989 Doug Schmidt (schmidt at crimee.ics.uci.edu) * Implemented the switch statement output format. Much better for large datasets in terms of space used. * Added new functions to break up the Key_List::Output function. Functions added were Key_List::Print_Switch, Key_List::Print_Min_Max, Key_List::Print_Keyword_Table, Key_List::Print_Hash_Function, and Key_List::Print_Lookup_Function. This simplifies the big mess in Key_List::Output considerably! * Added switch statement option to Options, which potentially trades time for space in the generated lookup code. Thu Jan 5 22:46:34 1989 Doug Schmidt (schmidt at siam.ics.uci.edu) * Released version 1.1 * Fixed a bug with Gperf::Merge_Set, it was skipping letters shared between the Set_1 and Set_2. * Added the optimal min/max algorithm in Key_List::Output. This runs in O ( 3n/2 ), rather than O ( 2n ) time. * Changed Gperf::Sort_Set to use insertion sort, rather than bubble sort. * Added a check in Key_List::Output for the special case where the keys used are 1,$. It is possible to generate more efficient C code in this case. gperf-3.2.1/Makefile.devel0000664000000000000000000000177513620406555011027 # This is the developer's makefile, not the user's makefile. # Don't use it unless you know exactly what you do! SHELL = /bin/sh MAKE = make all : configures src/config.h.in CONFIGURES = configure lib/configure src/configure tests/configure doc/configure configures : $(CONFIGURES) configure : configure.ac aclocal.m4 autoconf -I . && rm -rf autom4te.cache lib/configure : lib/configure.ac aclocal.m4 cd lib && autoconf -I .. && rm -rf autom4te.cache src/configure : src/configure.ac aclocal.m4 cd src && autoconf -I .. && rm -rf autom4te.cache tests/configure : tests/configure.ac aclocal.m4 cd tests && autoconf -I .. && rm -rf autom4te.cache doc/configure : doc/configure.ac aclocal.m4 cd doc && autoconf -I .. && rm -rf autom4te.cache check-configures : $(CONFIGURES) set -e; for f in $(CONFIGURES); do bash -x -n $$f; done src/config.h.in : src/configure.ac aclocal.m4 cd src && autoheader -I .. && rm -rf autom4te.cache totally-clean : force rm -f $(CONFIGURES) rm -f src/config.h.in force : gperf-3.2.1/configure0000775000000000000000000026065614774103073010205 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='' PACKAGE_TARNAME='' PACKAGE_VERSION='' PACKAGE_STRING='' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="doc/gperf.texi" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS subdirs SET_MAKE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='lib src tests doc' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_config_files="$ac_config_files Makefile" subdirs="$subdirs lib src tests doc" extrasub="$extrasub"' /@subdir@/{ h g s/@subdir@/lib/ p g s/@subdir@/src/ p g s/@subdir@/tests/ p g s/@subdir@/doc/ p d } ' cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 printf "%s\n" "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 printf "%s\n" "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gperf-3.2.1/Makefile.in0000664000000000000000000000677514647447250010352 # Makefile for gperf # Copyright (C) 1989, 1992-1993, 1998, 2012, 2016, 2018, 2020, 2022, 2024 Free Software Foundation, Inc. # Written by Douglas C. Schmidt # and Bruno Haible . # # This file is part of GNU GPERF. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #### Start of system configuration section. #### # Directories used by "make": srcdir = @srcdir@ # Programs used by "make": RM = rm -f @SET_MAKE@ #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) all : force cd @subdir@; $(MAKE) all install : force cd @subdir@; $(MAKE) install installdirs : force cd @subdir@; $(MAKE) installdirs uninstall : force cd @subdir@; $(MAKE) uninstall check : force cd @subdir@; $(MAKE) check mostlyclean : force cd @subdir@; $(MAKE) mostlyclean clean : force cd @subdir@; $(MAKE) clean distclean : force cd @subdir@; if test -f Makefile; then $(MAKE) distclean; fi $(RM) config.status config.log config.cache Makefile maintainer-clean : force cd @subdir@; if test -f Makefile; then $(MAKE) maintainer-clean; fi $(RM) config.status config.log config.cache Makefile # List of source files. SOURCE_FILES = \ README INSTALL.windows NEWS AUTHORS JOIN-GNU \ autogen.sh configure.ac aclocal.m4 Makefile.in \ Makefile.devel ChangeLog # List of distributed files imported from other packages. IMPORTED_FILES = \ COPYING INSTALL \ build-aux/install-sh build-aux/mkinstalldirs \ build-aux/compile build-aux/ar-lib \ lib/filename.h # List of distributed files generated by autotools or Makefile.devel. GENERATED_FILES = configure # List of distributed files generated by "make". DISTRIBUTED_BUILT_FILES = # List of distributed files. DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES) distdir : $(DISTFILES) for file in $(DISTFILES); do \ if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \ destdir=`echo '$(distdir)'/$$file | sed -e 's|//*[^/]*$$||'`; \ test -d "$$destdir" || mkdir "$$destdir"; \ cp -p $$dir/$$file '$(distdir)'/$$file || exit 1; \ done subdir=@subdir@; test -d '$(distdir)'/$$subdir || mkdir '$(distdir)'/$$subdir; cd $$subdir; $(MAKE) distdir distdir='$(distdir)'/$$subdir # Creating a distribution tarball. PACKAGE = gperf VERSION = `sed -n -e 's/.*version_string = "\(.*\)".*/\1/p' < $(srcdir)/src/version.cc` TAR = tar GZIP = gzip dist : force tmpdistdir=$(PACKAGE)-$(VERSION); \ abstmpdistdir=`pwd`/$$tmpdistdir; \ rm -rf $$tmpdistdir $$tmpdistdir.tar $$tmpdistdir.tar.gz \ && mkdir $$tmpdistdir \ && $(MAKE) distdir distdir="$$abstmpdistdir" \ && $(TAR) chof $$tmpdistdir.tar --owner=root --group=root $$tmpdistdir \ && $(GZIP) -9 $$tmpdistdir.tar \ && rm -rf $$tmpdistdir # Ensure that the manual page is up-to-date when "make dist" runs. dist : doc/gperf.1 doc/gperf.1: $(srcdir)/src/options.cc cd lib && $(MAKE) cd src && $(MAKE) gperf$(EXEEXT) cd doc && $(MAKE) gperf.1 force : gperf-3.2.1/src/0000775000000000000000000000000014776761171007141 5gperf-3.2.1/src/positions.cc0000664000000000000000000000755513347736204011423 /* A set of byte positions. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "positions.h" #include #include /* declares exit() */ #include /* ---------------------------- Class Positions ---------------------------- */ /* Set operations. Assumes the array is in reverse order. */ bool Positions::contains (int pos) const { unsigned int count = _size; const int *p = _positions + _size - 1; for (; count > 0; p--, count--) { if (*p == pos) return true; if (*p > pos) break; } return false; } void Positions::add (int pos) { set_useall (false); unsigned int count = _size; if (count == MAX_SIZE) { fprintf (stderr, "Positions::add internal error: overflow\n"); exit (1); } int *p = _positions + _size - 1; for (; count > 0; p--, count--) { if (*p == pos) { fprintf (stderr, "Positions::add internal error: duplicate\n"); exit (1); } if (*p > pos) break; p[1] = p[0]; } p[1] = pos; _size++; } void Positions::remove (int pos) { set_useall (false); unsigned int count = _size; if (count > 0) { int *p = _positions + _size - 1; if (*p == pos) { _size--; return; } if (*p < pos) { int prev = *p; for (;;) { p--; count--; if (count == 0) break; if (*p == pos) { *p = prev; _size--; return; } if (*p > pos) break; int curr = *p; *p = prev; prev = curr; } } } fprintf (stderr, "Positions::remove internal error: not found\n"); exit (1); } /* Output in external syntax. */ void Positions::print () const { if (_useall) printf ("*"); else { bool first = true; bool seen_LASTCHAR = false; unsigned int count = _size; const int *p = _positions + _size - 1; for (; count > 0; p--) { count--; if (*p == LASTCHAR) seen_LASTCHAR = true; else { if (!first) printf (","); printf ("%d", *p + 1); if (count > 0 && p[-1] == *p + 1) { printf ("-"); do { p--; count--; } while (count > 0 && p[-1] == *p + 1); printf ("%d", *p + 1); } first = false; } } if (seen_LASTCHAR) { if (!first) printf (","); printf ("$"); } } } /* ------------------------------------------------------------------------- */ #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "positions.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ gperf-3.2.1/src/output.h0000664000000000000000000001441513347736210010564 /* This may look like C code, but it is really -*- C++ -*- */ /* Output routines. Copyright (C) 1989-1998, 2000, 2002-2003, 2009, 2016 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef output_h #define output_h 1 #include "keyword-list.h" #include "positions.h" /* OSF/1 cxx needs these forward declarations. */ struct Output_Constants; struct Output_Compare; class Output { public: /* Constructor. */ Output (KeywordExt_List *head, const char *struct_decl, unsigned int struct_decl_lineno, const char *return_type, const char *struct_tag, const char *verbatim_declarations, const char *verbatim_declarations_end, unsigned int verbatim_declarations_lineno, const char *verbatim_code, const char *verbatim_code_end, unsigned int verbatim_code_lineno, bool charset_dependent, int total_keys, int max_key_len, int min_key_len, bool hash_includes_len, const Positions& positions, const unsigned int *alpha_inc, int total_duplicates, unsigned int alpha_size, const int *asso_values); /* Generates the hash function and the key word recognizer function. */ void output (); private: /* Computes the minimum and maximum hash values, and stores them in _min_hash_value and _max_hash_value. */ void compute_min_max (); /* Returns the number of different hash values. */ int num_hash_values () const; /* Outputs the maximum and minimum hash values etc. */ void output_constants (struct Output_Constants&) const; /* Generates a C expression for an asso_values[] index. */ void output_asso_values_index (int pos) const; /* Generates a C expression for an asso_values[] reference. */ void output_asso_values_ref (int pos) const; /* Generates C code for the hash function that returns the proper encoding for each keyword. */ void output_hash_function () const; /* Prints out a table of keyword lengths, for use with the comparison code in generated function 'in_word_set'. */ void output_keylength_table () const; /* Prints out the string pool, containing the strings of the keyword table. */ void output_string_pool () const; /* Prints out the array containing the keywords for the hash function. */ void output_keyword_table () const; /* Generates the large, sparse table that maps hash values into the smaller, contiguous range of the keyword table. */ void output_lookup_array () const; /* Generate all pools needed for the lookup function. */ void output_lookup_pools () const; /* Generate all the tables needed for the lookup function. */ void output_lookup_tables () const; /* Generates C code to perform the keyword lookup. */ void output_lookup_function_body (const struct Output_Compare&) const; /* Generates C code for the lookup function. */ void output_lookup_function () const; /* Linked list of keywords. */ KeywordExt_List * _head; /* Declaration of struct type for a keyword and its attributes. */ const char * const _struct_decl; unsigned int const _struct_decl_lineno; /* Pointer to return type for lookup function. */ const char * _return_type; /* Shorthand for user-defined struct tag type. */ const char * _struct_tag; /* Element type of keyword array. */ const char * _wordlist_eltype; /* The C code from the declarations section. */ const char * const _verbatim_declarations; const char * const _verbatim_declarations_end; unsigned int const _verbatim_declarations_lineno; /* The C code from the end of the file. */ const char * const _verbatim_code; const char * const _verbatim_code_end; unsigned int const _verbatim_code_lineno; /* Whether the keyword chars would have different values in a different character set. */ bool _charset_dependent; /* Total number of keys, counting duplicates. */ int const _total_keys; /* Maximum length of the longest keyword. */ int const _max_key_len; /* Minimum length of the shortest keyword. */ int const _min_key_len; /* Whether the hash function includes the length. */ bool _hash_includes_len; /* Key positions. */ Positions const _key_positions; /* Adjustments to add to bytes add specific key positions. */ const unsigned int * const _alpha_inc; /* Total number of duplicate hash values. */ int const _total_duplicates; /* Minimum hash value for all keywords. */ int _min_hash_value; /* Maximum hash value for all keywords. */ int _max_hash_value; /* Size of alphabet. */ unsigned int const _alpha_size; /* Value associated with each character. */ const int * const _asso_values; }; #endif gperf-3.2.1/src/bool-array.h0000664000000000000000000000473413347736212011300 /* This may look like C code, but it is really -*- C++ -*- */ /* Simple lookup table abstraction implemented as an Iteration Number Array. Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef bool_array_h #define bool_array_h 1 /* A Bool_Array instance is a bit array of fixed size, optimized for being filled sparsely and cleared frequently. For example, when processing tests/chill.gperf, the array will be: - of size 15391, - clear will be called 3509 times, - set_bit will be called 300394 times. With a conventional bit array implementation, clear would be too slow. With a tree/hash based bit array implementation, set_bit would be slower. */ class Bool_Array { public: /* Initializes the bit array with room for SIZE bits, numbered from 0 to SIZE-1. */ Bool_Array (unsigned int size); /* Frees this object. */ ~Bool_Array (); /* Resets all bits to zero. */ void clear (); /* Sets the specified bit to true. Returns its previous value (false or true). */ bool set_bit (unsigned int index); private: /* Size of array. */ unsigned int const _size; /* Current iteration number. Always nonzero. Starts out as 1, and is incremented each time clear() is called. */ unsigned int _iteration_number; /* For each index, we store in storage_array[index] the iteration_number at the time set_bit(index) was last called. */ unsigned int * const _storage_array; }; #ifdef __OPTIMIZE__ /* efficiency hack! */ #include #include #include "options.h" #define INLINE inline #include "bool-array.icc" #undef INLINE #endif #endif gperf-3.2.1/src/search.h0000664000000000000000000001364213347736215010477 /* This may look like C code, but it is really -*- C++ -*- */ /* Search algorithm. Copyright (C) 1989-1998, 2000, 2002-2003, 2009 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef search_h #define search_h 1 #include "keyword-list.h" #include "positions.h" #include "bool-array.h" struct EquivalenceClass; class Search { public: Search (KeywordExt_List *list); ~Search (); void optimize (); private: void prepare (); /* Computes the upper bound on the indices passed to asso_values[], assuming no alpha_increments. */ unsigned int compute_alpha_size () const; /* Computes the unification rules between different asso_values[c], assuming no alpha_increments. */ unsigned int * compute_alpha_unify () const; /* Initializes each keyword's _selchars array. */ void init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify) const; /* Deletes each keyword's _selchars array. */ void delete_selchars () const; /* Count the duplicate keywords that occur with a given set of positions. */ unsigned int count_duplicates_tuple (const Positions& positions, const unsigned int *alpha_unify) const; /* Find good key positions. */ void find_positions (); /* Count the duplicate keywords that occur with the found set of positions. */ unsigned int count_duplicates_tuple () const; /* Computes the upper bound on the indices passed to asso_values[]. */ unsigned int compute_alpha_size (const unsigned int *alpha_inc) const; /* Computes the unification rules between different asso_values[c]. */ unsigned int * compute_alpha_unify (const Positions& positions, const unsigned int *alpha_inc) const; /* Initializes each keyword's _selchars array. */ void init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) const; /* Count the duplicate keywords that occur with the given set of positions and a given alpha_inc[] array. */ unsigned int count_duplicates_multiset (const unsigned int *alpha_inc) const; /* Find good _alpha_inc[]. */ void find_alpha_inc (); /* Initializes the asso_values[] related parameters. */ void prepare_asso_values (); EquivalenceClass * compute_partition (bool *undetermined) const; unsigned int count_possible_collisions (EquivalenceClass *partition, unsigned int c) const; bool unchanged_partition (EquivalenceClass *partition, unsigned int c) const; /* Finds some _asso_values[] that fit. */ void find_asso_values (); /* Computes a keyword's hash value, relative to the current _asso_values[], and stores it in keyword->_hash_value. */ int compute_hash (KeywordExt *keyword) const; /* Finds good _asso_values[]. */ void find_good_asso_values (); /* Sorts the keyword list by hash value. */ void sort (); public: /* Linked list of keywords. */ KeywordExt_List * _head; /* Total number of keywords, counting duplicates. */ int _total_keys; /* Maximum length of the longest keyword. */ int _max_key_len; /* Minimum length of the shortest keyword. */ int _min_key_len; /* Whether the hash function includes the length. */ bool _hash_includes_len; /* User-specified or computed key positions. */ Positions _key_positions; /* Adjustments to add to bytes add specific key positions. */ unsigned int * _alpha_inc; /* Size of alphabet. */ unsigned int _alpha_size; /* Alphabet character unification, either the identity or a mapping from upper case characters to lower case characters (and maybe more). */ unsigned int * _alpha_unify; /* Maximum _selchars_length over all keywords. */ unsigned int _max_selchars_length; /* Total number of duplicates that have been moved to _duplicate_link lists (not counting their representatives which stay on the main list). */ int _total_duplicates; /* Counts occurrences of each key set character. _occurrences[c] is the number of times that c occurs among the _selchars of a keyword. */ int * _occurrences; /* Value associated with each character. */ int * _asso_values; private: /* Length of _head list. Number of keywords, not counting duplicates. */ int _list_len; /* Exclusive upper bound for every _asso_values[c]. A power of 2. */ unsigned int _asso_value_max; /* Initial value for asso_values table. -1 means random. */ int _initial_asso_value; /* Jump length when trying alternative values. 0 means random. */ int _jump; /* Maximal possible hash value. */ int _max_hash_value; /* Sparse bit vector for collision detection. */ Bool_Array * _collision_detector; }; #endif gperf-3.2.1/src/main.cc0000664000000000000000000001236114774211627010311 /* Driver program for the hash function generator Copyright (C) 1989-1998, 2000, 2002-2003, 2009, 2017, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "options.h" #include "input.h" #include "search.h" #include "output.h" /* ------------------------------------------------------------------------- */ /* This Keyword factory produces KeywordExt instances. */ typedef Keyword_Factory KeywordExt_Factory; template <> KeywordExt * Keyword_Factory::create_keyword (const char *allchars, int allchars_length, const char *rest, unsigned int lineno) { return new KeywordExt (allchars, allchars_length, rest, lineno); } /* ------------------------------------------------------------------------- */ int main (int argc, char *argv[]) { int exitcode; /* Set the Options. Open the input file and assign stdin to it. */ option.parse_options (argc, argv); /* Open the input file. */ if (option.get_input_file_name ()) if (!freopen (option.get_input_file_name (), "r", stdin)) { fprintf (stderr, "Cannot open input file '%s'\n", option.get_input_file_name ()); exit (1); } { /* Initialize the keyword list. */ KeywordExt_Factory factory; Input inputter (stdin, &factory); inputter.read_input (); /* We can cast the keyword list to KeywordExt_List* because its list elements were created by KeywordExt_Factory. */ KeywordExt_List* list = inputter._head; { /* Search for a good hash function. */ Search searcher (list); searcher.optimize (); list = searcher._head; /* Open the output file. */ if (option.get_output_file_name ()) if (strcmp (option.get_output_file_name (), "-") != 0) if (!freopen (option.get_output_file_name (), "w", stdout)) { fprintf (stderr, "Cannot open output file '%s'\n", option.get_output_file_name ()); exit (1); } { /* Output the hash function code. */ Output outputter (searcher._head, inputter._struct_decl, inputter._struct_decl_lineno, inputter._return_type, inputter._struct_tag, inputter._verbatim_declarations, inputter._verbatim_declarations_end, inputter._verbatim_declarations_lineno, inputter._verbatim_code, inputter._verbatim_code_end, inputter._verbatim_code_lineno, inputter._charset_dependent, searcher._total_keys, searcher._max_key_len, searcher._min_key_len, searcher._hash_includes_len, searcher._key_positions, searcher._alpha_inc, searcher._total_duplicates, searcher._alpha_size, searcher._asso_values); outputter.output (); /* Check for write error on stdout. */ exitcode = 0; if (fflush (stdout) || ferror (stdout)) { fprintf (stderr, "error while writing output file\n"); exitcode = 1; } /* Here we run the Output destructor. */ } /* Here we run the Search destructor. */ } /* Also delete the list that was allocated inside Input and reordered inside Search. */ for (KeywordExt_List *ptr = list; ptr; ptr = ptr->rest()) { KeywordExt *keyword = ptr->first(); do { KeywordExt *next_keyword = keyword->_duplicate_link; delete[] const_cast(keyword->_selchars); if (keyword->_rest != empty_string) delete[] const_cast(keyword->_rest); if (!(keyword->_allchars >= inputter._input && keyword->_allchars < inputter._input_end)) delete[] const_cast(keyword->_allchars); delete keyword; keyword = next_keyword; } while (keyword != NULL); } delete_list (list); /* Here we run the Input destructor. */ } /* Don't use exit() here, it skips the destructors. */ return exitcode; } gperf-3.2.1/src/options.cc0000664000000000000000000012575414774237267011103 /* Handles parsing the Options provided to the user. Copyright (C) 1989-1998, 2000, 2002-2004, 2006-2009, 2011, 2016-2018, 2022-2023, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "options.h" #include #include /* declares atoi(), abs(), exit() */ #include /* declares strcmp() */ #include /* declares isdigit() */ #include /* defines CHAR_MAX */ #include "filename.h" #include "getopt.h" #include "version.h" /* Global option coordinator for the entire program. */ Options option; /* Records the program name. */ const char *program_name; /* Size to jump on a collision. */ static const int DEFAULT_JUMP_VALUE = 5; /* Default name for generated lookup function. */ static const char *const DEFAULT_FUNCTION_NAME = "in_word_set"; /* Default name for the key component. */ static const char *const DEFAULT_SLOT_NAME = "name"; /* Default struct initializer suffix. */ static const char *const DEFAULT_INITIALIZER_SUFFIX = ""; /* Default name for the generated class. */ static const char *const DEFAULT_CLASS_NAME = "Perfect_Hash"; /* Default name for generated hash function. */ static const char *const DEFAULT_HASH_NAME = "hash"; /* Default name for generated hash table array. */ static const char *const DEFAULT_WORDLIST_NAME = "wordlist"; /* Default name for generated length table array. */ static const char *const DEFAULT_LENGTHTABLE_NAME = "lengthtable"; /* Default name for string pool. */ static const char *const DEFAULT_STRINGPOOL_NAME = "stringpool"; /* Default prefix for constants. */ static const char *const DEFAULT_CONSTANTS_PREFIX = ""; /* Default delimiters that separate keywords from their attributes. */ static const char *const DEFAULT_DELIMITERS = ","; /* Prints program usage to given stream. */ void Options::short_usage (FILE * stream) { fprintf (stream, "Try '%s --help' for more information.\n", program_name); } void Options::long_usage (FILE * stream) { fprintf (stream, "GNU 'gperf' generates perfect hash functions.\n"); fprintf (stream, "\n"); fprintf (stream, "Usage: %s [OPTION]... [INPUT-FILE]\n", program_name); fprintf (stream, "\n"); fprintf (stream, "If a long option shows an argument as mandatory, then it is mandatory\n" "for the equivalent short option also.\n"); fprintf (stream, "\n"); fprintf (stream, "Output file location:\n"); fprintf (stream, " --output-file=FILE Write output to specified file.\n"); fprintf (stream, "The results are written to standard output if no output file is specified\n" "or if it is -.\n"); fprintf (stream, "\n"); fprintf (stream, "Input file interpretation:\n"); fprintf (stream, " -e, --delimiters=DELIMITER-LIST\n" " Allow user to provide a string containing delimiters\n" " used to separate keywords from their attributes.\n" " Default is \",\".\n"); fprintf (stream, " -t, --struct-type Allows the user to include a structured type\n" " declaration for generated code. Any text before %%%%\n" " is considered part of the type declaration. Key\n" " words and additional fields may follow this, one\n" " group of fields per line.\n"); fprintf (stream, " --ignore-case Consider upper and lower case ASCII characters as\n" " equivalent. Note that locale dependent case mappings\n" " are ignored.\n"); fprintf (stream, "\n"); fprintf (stream, "Language for the output code:\n"); fprintf (stream, " -L, --language=LANGUAGE-NAME\n" " Generates code in the specified language. Languages\n" " handled are currently C++, ANSI-C, C, and KR-C. The\n" " default is ANSI-C.\n"); fprintf (stream, "\n"); fprintf (stream, "Details in the output code:\n"); fprintf (stream, " -K, --slot-name=NAME Select name of the keyword component in the keyword\n" " structure.\n"); fprintf (stream, " -F, --initializer-suffix=INITIALIZERS\n" " Initializers for additional components in the keyword\n" " structure.\n"); fprintf (stream, " -H, --hash-function-name=NAME\n" " Specify name of generated hash function. Default is\n" " 'hash'.\n"); fprintf (stream, " -N, --lookup-function-name=NAME\n" " Specify name of generated lookup function. Default\n" " name is 'in_word_set'.\n"); fprintf (stream, " -Z, --class-name=NAME Specify name of generated C++ class. Default name is\n" " 'Perfect_Hash'.\n"); fprintf (stream, " -7, --seven-bit Assume 7-bit characters.\n"); fprintf (stream, " -l, --compare-lengths Compare key lengths before trying a string\n" " comparison. This is necessary if the keywords\n" " contain NUL bytes. It also helps cut down on the\n" " number of string comparisons made during the lookup.\n"); fprintf (stream, " -c, --compare-strncmp Generate comparison code using strncmp rather than\n" " strcmp.\n"); fprintf (stream, " -C, --readonly-tables Make the contents of generated lookup tables\n" " constant, i.e., readonly.\n"); fprintf (stream, " -E, --enum Define constant values using an enum local to the\n" " lookup function rather than with defines.\n"); fprintf (stream, " -I, --includes Include the necessary system include file \n" " at the beginning of the code.\n"); fprintf (stream, " -G, --global-table Generate the static table of keywords as a static\n" " global variable, rather than hiding it inside of the\n" " lookup function (which is the default behavior).\n"); fprintf (stream, " -P, --pic Optimize the generated table for inclusion in shared\n" " libraries. This reduces the startup time of programs\n" " using a shared library containing the generated code.\n"); fprintf (stream, " -Q, --string-pool-name=NAME\n" " Specify name of string pool generated by option --pic.\n" " Default name is 'stringpool'.\n"); fprintf (stream, " --null-strings Use NULL strings instead of empty strings for empty\n" " keyword table entries.\n"); fprintf (stream, " --constants-prefix=PREFIX\n" " Specify prefix for the constants like TOTAL_KEYWORDS.\n"); fprintf (stream, " -W, --word-array-name=NAME\n" " Specify name of word list array. Default name is\n" " 'wordlist'.\n"); fprintf (stream, " --length-table-name=NAME\n" " Specify name of length table array. Default name is\n" " 'lengthtable'.\n"); fprintf (stream, " -S, --switch=COUNT Causes the generated C code to use a switch\n" " statement scheme, rather than an array lookup table.\n" " This can lead to a reduction in both time and space\n" " requirements for some keyfiles. The COUNT argument\n" " determines how many switch statements are generated.\n" " A value of 1 generates 1 switch containing all the\n" " elements, a value of 2 generates 2 tables with 1/2\n" " the elements in each table, etc. If COUNT is very\n" " large, say 1000000, the generated C code does a\n" " binary search.\n"); fprintf (stream, " -T, --omit-struct-type\n" " Prevents the transfer of the type declaration to the\n" " output file. Use this option if the type is already\n" " defined elsewhere.\n"); fprintf (stream, "\n"); fprintf (stream, "Algorithm employed by gperf:\n"); fprintf (stream, " -k, --key-positions=KEYS\n" " Select the key positions used in the hash function.\n" " The allowable choices range between 1-%d, inclusive.\n" " The positions are separated by commas, ranges may be\n" " used, and key positions may occur in any order.\n" " Also, the meta-character '*' causes the generated\n" " hash function to consider ALL key positions, and $\n" " indicates the \"final character\" of a key, e.g.,\n" " $,1,2,4,6-10.\n", Positions::MAX_KEY_POS); fprintf (stream, " -D, --duplicates Handle keywords that hash to duplicate values. This\n" " is useful for certain highly redundant keyword sets.\n"); fprintf (stream, " -m, --multiple-iterations=ITERATIONS\n" " Perform multiple choices of the -i and -j values,\n" " and choose the best results. This increases the\n" " running time by a factor of ITERATIONS but does a\n" " good job minimizing the generated table size.\n"); fprintf (stream, " -i, --initial-asso=N Provide an initial value for the associate values\n" " array. Default is 0. Setting this value larger helps\n" " inflate the size of the final table.\n"); fprintf (stream, " -j, --jump=JUMP-VALUE Affects the \"jump value\", i.e., how far to advance\n" " the associated character value upon collisions. Must\n" " be an odd number, default is %d.\n", DEFAULT_JUMP_VALUE); fprintf (stream, " -n, --no-strlen Do not include the length of the keyword when\n" " computing the hash function.\n"); fprintf (stream, " -r, --random Utilizes randomness to initialize the associated\n" " values table.\n"); fprintf (stream, " -s, --size-multiple=N Affects the size of the generated hash table. The\n" " numeric argument N indicates \"how many times larger\n" " or smaller\" the associated value range should be,\n" " in relationship to the number of keys, e.g. a value\n" " of 3 means \"allow the maximum associated value to\n" " be about 3 times larger than the number of input\n" " keys\". Conversely, a value of 1/3 means \"make the\n" " maximum associated value about 3 times smaller than\n" " the number of input keys\". A larger table should\n" " decrease the time required for an unsuccessful\n" " search, at the expense of extra table space. Default\n" " value is 1.\n"); fprintf (stream, "\n"); fprintf (stream, "Informative output:\n" " -h, --help Print this message.\n" " -v, --version Print the gperf version number.\n" " -d, --debug Enables the debugging option (produces verbose\n" " output to the standard error).\n"); fprintf (stream, "\n"); fprintf (stream, "Report bugs to .\n"); } /* Prints the given options. */ void Options::print_options () const { printf ("/* Command-line: "); for (int i = 0; i < _argument_count; i++) { char *arg = _argument_vector[i]; if (i == 0) { /* _argument_vector[0] is the program name. Print only its base name, and also drop its ".exe" suffix on native Windows. This is useful for reproducible builds. */ { char *p = arg + strlen (arg); while (p > arg && ! ISSLASH (p[-1])) p--; arg = p; } { char *p = arg + strlen (arg); if (p - arg > 4 && p[-4] == '.' && (p[-3] == 'E' || p[-3] == 'e') && (p[-2] == 'X' || p[-2] == 'x') && (p[-1] == 'E' || p[-1] == 'e')) p[-4] = '\0'; } } /* Escape arg if it contains shell metacharacters. */ if (*arg == '-') { putchar (*arg); arg++; if ((*arg >= 'A' && *arg <= 'Z') || (*arg >= 'a' && *arg <= 'z')) { putchar (*arg); arg++; } else if (*arg == '-') { do { putchar (*arg); arg++; } while ((*arg >= 'A' && *arg <= 'Z') || (*arg >= 'a' && *arg <= 'z') || *arg == '-'); if (*arg == '=') { putchar (*arg); arg++; } } } if (strpbrk (arg, "\t\n !\"#$&'()*;<>?[\\]`{|}~") != NULL) { if (strchr (arg, '\'') != NULL) { putchar ('"'); for (; *arg; arg++) { if (*arg == '\"' || *arg == '\\' || *arg == '$' || *arg == '`') putchar ('\\'); putchar (*arg); } putchar ('"'); } else { putchar ('\''); for (; *arg; arg++) { if (*arg == '\\') putchar ('\\'); putchar (*arg); } putchar ('\''); } } else printf ("%s", arg); printf (" "); } printf (" */"); } /* ------------------------------------------------------------------------- */ /* Parses a string denoting key positions. */ class PositionStringParser { public: /* Initializes a key position string parser for string STR. */ PositionStringParser (const char *str, int low_bound, int high_bound, int end_word_marker, int error_value, int end_marker); /* Returns the next key position from the given string. */ int nextPosition (); private: /* A pointer to the string provided by the user. */ const char * _str; /* Smallest possible value, inclusive. */ int const _low_bound; /* Greatest possible value, inclusive. */ int const _high_bound; /* A value marking the abstract "end of word" ( usually '$'). */ int const _end_word_marker; /* Error value returned when input is syntactically erroneous. */ int const _error_value; /* Value returned after last key is processed. */ int const _end_marker; /* Intermediate state for producing a range of positions. */ bool _in_range; /* True while producing a range of positions. */ int _range_upper_bound; /* Upper bound (inclusive) of the range. */ int _range_curr_value; /* Last value returned. */ }; /* Initializes a key position strng parser for string STR. */ PositionStringParser::PositionStringParser (const char *str, int low_bound, int high_bound, int end_word_marker, int error_value, int end_marker) : _str (str), _low_bound (low_bound), _high_bound (high_bound), _end_word_marker (end_word_marker), _error_value (error_value), _end_marker (end_marker), _in_range (false) { } /* Returns the next key position from the given string. */ int PositionStringParser::nextPosition () { if (_in_range) { /* We are inside a range. Return the next value from the range. */ if (++_range_curr_value >= _range_upper_bound) _in_range = false; return _range_curr_value; } else { /* Continue parsing the given string. */ while (*_str) switch (*_str) { case ',': /* Skip the comma. */ _str++; break; case '$': /* Valid key position. */ _str++; return _end_word_marker; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* Valid key position. */ { int curr_value; for (curr_value = 0; isdigit (static_cast(*_str)); _str++) curr_value = curr_value * 10 + (*_str - '0'); if (*_str == '-') { _str++; /* Starting a range of key positions. */ _in_range = true; for (_range_upper_bound = 0; isdigit (static_cast(*_str)); _str++) _range_upper_bound = _range_upper_bound * 10 + (*_str - '0'); /* Verify range's upper bound. */ if (!(_range_upper_bound > curr_value && _range_upper_bound <= _high_bound)) return _error_value; _range_curr_value = curr_value; } /* Verify range's lower bound. */ if (!(curr_value >= _low_bound && curr_value <= _high_bound)) return _error_value; return curr_value; } default: /* Invalid syntax. */ return _error_value; } return _end_marker; } } /* ------------------------------------------------------------------------- */ /* Sets the default Options. */ Options::Options () : _option_word (ANSIC), _input_file_name (NULL), _output_file_name (NULL), _language (NULL), _jump (DEFAULT_JUMP_VALUE), _initial_asso_value (0), _asso_iterations (0), _total_switches (1), _size_multiple (1), _function_name (DEFAULT_FUNCTION_NAME), _slot_name (DEFAULT_SLOT_NAME), _initializer_suffix (DEFAULT_INITIALIZER_SUFFIX), _class_name (DEFAULT_CLASS_NAME), _hash_name (DEFAULT_HASH_NAME), _wordlist_name (DEFAULT_WORDLIST_NAME), _lengthtable_name (DEFAULT_LENGTHTABLE_NAME), _stringpool_name (DEFAULT_STRINGPOOL_NAME), _constants_prefix (DEFAULT_CONSTANTS_PREFIX), _delimiters (DEFAULT_DELIMITERS), _key_positions () { } /* Dumps option status when debugging is enabled. */ Options::~Options () { if (_option_word & DEBUG) { fprintf (stderr, "\ndumping Options:" "\nTYPE is........: %s" "\nUPPERLOWER is..: %s" "\nKRC is.........: %s" "\nC is...........: %s" "\nANSIC is.......: %s" "\nCPLUSPLUS is...: %s" "\nSEVENBIT is....: %s" "\nLENTABLE is....: %s" "\nCOMP is........: %s" "\nCONST is.......: %s" "\nENUM is........: %s" "\nINCLUDE is.....: %s" "\nGLOBAL is......: %s" "\nNULLSTRINGS is.: %s" "\nSHAREDLIB is...: %s" "\nSWITCH is......: %s" "\nNOTYPE is......: %s" "\nDUP is.........: %s" "\nNOLENGTH is....: %s" "\nRANDOM is......: %s" "\nDEBUG is.......: %s" "\nlookup function name = %s" "\nhash function name = %s" "\nword list name = %s" "\nlength table name = %s" "\nstring pool name = %s" "\nslot name = %s" "\ninitializer suffix = %s" "\nasso_values iterations = %d" "\njump value = %d" "\nhash table size multiplier = %g" "\ninitial associated value = %d" "\ndelimiters = %s" "\nnumber of switch statements = %d\n", _option_word & TYPE ? "enabled" : "disabled", _option_word & UPPERLOWER ? "enabled" : "disabled", _option_word & KRC ? "enabled" : "disabled", _option_word & C ? "enabled" : "disabled", _option_word & ANSIC ? "enabled" : "disabled", _option_word & CPLUSPLUS ? "enabled" : "disabled", _option_word & SEVENBIT ? "enabled" : "disabled", _option_word & LENTABLE ? "enabled" : "disabled", _option_word & COMP ? "enabled" : "disabled", _option_word & CONST ? "enabled" : "disabled", _option_word & ENUM ? "enabled" : "disabled", _option_word & INCLUDE ? "enabled" : "disabled", _option_word & GLOBAL ? "enabled" : "disabled", _option_word & NULLSTRINGS ? "enabled" : "disabled", _option_word & SHAREDLIB ? "enabled" : "disabled", _option_word & SWITCH ? "enabled" : "disabled", _option_word & NOTYPE ? "enabled" : "disabled", _option_word & DUP ? "enabled" : "disabled", _option_word & NOLENGTH ? "enabled" : "disabled", _option_word & RANDOM ? "enabled" : "disabled", _option_word & DEBUG ? "enabled" : "disabled", _function_name, _hash_name, _wordlist_name, _lengthtable_name, _stringpool_name, _slot_name, _initializer_suffix, _asso_iterations, _jump, _size_multiple, _initial_asso_value, _delimiters, _total_switches); if (_key_positions.is_useall()) fprintf (stderr, "all characters are used in the hash function\n"); else { fprintf (stderr, "maximum keysig size = %d\nkey positions are: \n", _key_positions.get_size()); PositionIterator iter = _key_positions.iterator(); for (int pos; (pos = iter.next()) != PositionIterator::EOS; ) if (pos == Positions::LASTCHAR) fprintf (stderr, "$\n"); else fprintf (stderr, "%d\n", pos + 1); } fprintf (stderr, "finished dumping Options\n"); } } /* Sets the output language, if not already set. */ void Options::set_language (const char *language) { if (_language == NULL) { _language = language; _option_word &= ~(KRC | C | ANSIC | CPLUSPLUS); if (!strcmp (language, "KR-C")) _option_word |= KRC; else if (!strcmp (language, "C")) _option_word |= C; else if (!strcmp (language, "ANSI-C")) _option_word |= ANSIC; else if (!strcmp (language, "C++")) _option_word |= CPLUSPLUS; else { fprintf (stderr, "unsupported language option %s, defaulting to ANSI-C\n", language); _option_word |= ANSIC; } } } /* Sets the total number of switch statements, if not already set. */ void Options::set_total_switches (int total_switches) { if (!(_option_word & SWITCH)) { _option_word |= SWITCH; _total_switches = total_switches; } } /* Sets the generated function name, if not already set. */ void Options::set_function_name (const char *name) { if (_function_name == DEFAULT_FUNCTION_NAME) _function_name = name; } /* Sets the keyword key name, if not already set. */ void Options::set_slot_name (const char *name) { if (_slot_name == DEFAULT_SLOT_NAME) _slot_name = name; } /* Returns true if the struct initializer suffix has been set. */ bool Options::has_initializer_suffix () const { return _initializer_suffix != DEFAULT_INITIALIZER_SUFFIX; } /* Sets the struct initializer suffix, if not already set. */ void Options::set_initializer_suffix (const char *initializers) { if (_initializer_suffix == DEFAULT_INITIALIZER_SUFFIX) _initializer_suffix = initializers; } /* Sets the generated class name, if not already set. */ void Options::set_class_name (const char *name) { if (_class_name == DEFAULT_CLASS_NAME) _class_name = name; } /* Sets the hash function name, if not already set. */ void Options::set_hash_name (const char *name) { if (_hash_name == DEFAULT_HASH_NAME) _hash_name = name; } /* Sets the hash table array name, if not already set. */ void Options::set_wordlist_name (const char *name) { if (_wordlist_name == DEFAULT_WORDLIST_NAME) _wordlist_name = name; } /* Sets the length table array name, if not already set. */ void Options::set_lengthtable_name (const char *name) { if (_lengthtable_name == DEFAULT_LENGTHTABLE_NAME) _lengthtable_name = name; } /* Sets the prefix for the constants, if not already set. */ void Options::set_constants_prefix (const char *prefix) { if (_constants_prefix == DEFAULT_CONSTANTS_PREFIX) _constants_prefix = prefix; } /* Sets the string pool name, if not already set. */ void Options::set_stringpool_name (const char *name) { if (_stringpool_name == DEFAULT_STRINGPOOL_NAME) _stringpool_name = name; } /* Sets the delimiters string, if not already set. */ void Options::set_delimiters (const char *delimiters) { if (_delimiters == DEFAULT_DELIMITERS) _delimiters = delimiters; } /* Parses the command line Options and sets appropriate flags in option_word. */ static const struct option long_options[] = { { "output-file", required_argument, NULL, CHAR_MAX + 1 }, { "ignore-case", no_argument, NULL, CHAR_MAX + 2 }, { "delimiters", required_argument, NULL, 'e' }, { "struct-type", no_argument, NULL, 't' }, { "language", required_argument, NULL, 'L' }, { "slot-name", required_argument, NULL, 'K' }, { "initializer-suffix", required_argument, NULL, 'F' }, { "hash-fn-name", required_argument, NULL, 'H' }, /* backward compatibility */ { "hash-function-name", required_argument, NULL, 'H' }, { "lookup-fn-name", required_argument, NULL, 'N' }, /* backward compatibility */ { "lookup-function-name", required_argument, NULL, 'N' }, { "class-name", required_argument, NULL, 'Z' }, { "seven-bit", no_argument, NULL, '7' }, { "compare-strncmp", no_argument, NULL, 'c' }, { "readonly-tables", no_argument, NULL, 'C' }, { "enum", no_argument, NULL, 'E' }, { "includes", no_argument, NULL, 'I' }, { "global-table", no_argument, NULL, 'G' }, { "constants-prefix", required_argument, NULL, CHAR_MAX + 5 }, { "word-array-name", required_argument, NULL, 'W' }, { "length-table-name", required_argument, NULL, CHAR_MAX + 4 }, { "switch", required_argument, NULL, 'S' }, { "omit-struct-type", no_argument, NULL, 'T' }, { "key-positions", required_argument, NULL, 'k' }, { "compare-strlen", no_argument, NULL, 'l' }, /* backward compatibility */ { "compare-lengths", no_argument, NULL, 'l' }, { "duplicates", no_argument, NULL, 'D' }, { "fast", required_argument, NULL, 'f' }, { "initial-asso", required_argument, NULL, 'i' }, { "jump", required_argument, NULL, 'j' }, { "multiple-iterations", required_argument, NULL, 'm' }, { "no-strlen", no_argument, NULL, 'n' }, { "occurrence-sort", no_argument, NULL, 'o' }, { "optimized-collision-resolution", no_argument, NULL, 'O' }, { "pic", no_argument, NULL, 'P' }, { "string-pool-name", required_argument, NULL, 'Q' }, { "null-strings", no_argument, NULL, CHAR_MAX + 3 }, { "random", no_argument, NULL, 'r' }, { "size-multiple", required_argument, NULL, 's' }, { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { "debug", no_argument, NULL, 'd' }, { NULL, no_argument, NULL, 0 } }; void Options::parse_options (int argc, char *argv[]) { int option_char; program_name = argv[0]; _argument_count = argc; _argument_vector = argv; while ((option_char = getopt_long (_argument_count, _argument_vector, "acCdDe:Ef:F:gGhH:i:Ij:k:K:lL:m:nN:oOpPQ:rs:S:tTvW:Z:7", long_options, NULL)) != -1) { switch (option_char) { case 'a': /* Generated code uses the ANSI prototype format. */ break; /* This is now the default. */ case 'c': /* Generate strncmp rather than strcmp. */ { _option_word |= COMP; break; } case 'C': /* Make the generated tables readonly (const). */ { _option_word |= CONST; break; } case 'd': /* Enable debugging option. */ { _option_word |= DEBUG; fprintf (stderr, "Starting program %s, version %s, with debugging on.\n", program_name, version_string); break; } case 'D': /* Enable duplicate option. */ { _option_word |= DUP; break; } case 'e': /* Specify keyword/attribute separator */ { _delimiters = /*getopt*/optarg; break; } case 'E': { _option_word |= ENUM; break; } case 'f': /* Generate the hash table "fast". */ break; /* Not needed any more. */ case 'F': { _initializer_suffix = /*getopt*/optarg; break; } case 'g': /* Use the 'inline' keyword for generated sub-routines, ifdef __GNUC__. */ break; /* This is now the default. */ case 'G': /* Make the keyword table a global variable. */ { _option_word |= GLOBAL; break; } case 'h': /* Displays a list of helpful Options to the user. */ { long_usage (stdout); exit (0); } case 'H': /* Sets the name for the hash function. */ { _hash_name = /*getopt*/optarg; break; } case 'i': /* Sets the initial value for the associated values array. */ { if ((_initial_asso_value = atoi (/*getopt*/optarg)) < 0) fprintf (stderr, "Initial value %d should be non-zero, ignoring and continuing.\n", _initial_asso_value); if (option[RANDOM]) fprintf (stderr, "warning, -r option superceeds -i, ignoring -i option and continuing\n"); break; } case 'I': /* Enable #include statements. */ { _option_word |= INCLUDE; break; } case 'j': /* Sets the jump value, must be odd for later algorithms. */ { if ((_jump = atoi (/*getopt*/optarg)) < 0) { fprintf (stderr, "Jump value %d must be a positive number.\n", _jump); short_usage (stderr); exit (1); } else if (_jump && ((_jump % 2) == 0)) fprintf (stderr, "Jump value %d should be odd, adding 1 and continuing...\n", _jump++); break; } case 'k': /* Sets key positions used for hash function. */ { _option_word |= POSITIONS; const int BAD_VALUE = -3; const int EOS = PositionIterator::EOS; int value; PositionStringParser sparser (/*getopt*/optarg, 1, Positions::MAX_KEY_POS, Positions::LASTCHAR, BAD_VALUE, EOS); if (/*getopt*/optarg [0] == '*') /* Use all the characters for hashing!!!! */ _key_positions.set_useall(true); else { _key_positions.set_useall(false); int *key_positions = _key_positions.pointer(); int *key_pos; for (key_pos = key_positions; (value = sparser.nextPosition()) != EOS; key_pos++) { if (value == BAD_VALUE) { fprintf (stderr, "Invalid position value or range, use 1,2,3-%d,'$' or '*'.\n", Positions::MAX_KEY_POS); short_usage (stderr); exit (1); } if (key_pos - key_positions == Positions::MAX_SIZE) { /* More than Positions::MAX_SIZE key positions. Since all key positions are in the range 0..Positions::MAX_KEY_POS-1 or == Positions::LASTCHAR, there must be duplicates. */ fprintf (stderr, "Duplicate key positions selected\n"); short_usage (stderr); exit (1); } if (value != Positions::LASTCHAR) /* We use 0-based indices in the class Positions. */ value = value - 1; *key_pos = value; } unsigned int total_keysig_size = key_pos - key_positions; if (total_keysig_size == 0) { fprintf (stderr, "No key positions selected.\n"); short_usage (stderr); exit (1); } _key_positions.set_size (total_keysig_size); /* Sorts the key positions *IN REVERSE ORDER!!* This makes further routines more efficient. Especially when generating code. */ if (! _key_positions.sort()) { fprintf (stderr, "Duplicate key positions selected\n"); short_usage (stderr); exit (1); } } break; } case 'K': /* Make this the keyname for the keyword component field. */ { _slot_name = /*getopt*/optarg; break; } case 'l': /* Create length table to avoid extra string compares. */ { _option_word |= LENTABLE; break; } case 'L': /* Deal with different generated languages. */ { _language = NULL; set_language (/*getopt*/optarg); break; } case 'm': /* Multiple iterations for finding good asso_values. */ { if ((_asso_iterations = atoi (/*getopt*/optarg)) < 0) { fprintf (stderr, "asso_iterations value must not be negative, assuming 0\n"); _asso_iterations = 0; } break; } case 'n': /* Don't include the length when computing hash function. */ { _option_word |= NOLENGTH; break; } case 'N': /* Make generated lookup function name be optarg. */ { _function_name = /*getopt*/optarg; break; } case 'o': /* Order input by frequency of key set occurrence. */ break; /* Not needed any more. */ case 'O': /* Optimized choice during collision resolution. */ break; /* Not needed any more. */ case 'p': /* Generated lookup function a pointer instead of int. */ break; /* This is now the default. */ case 'P': /* Optimize for position-independent code. */ { _option_word |= SHAREDLIB; break; } case 'Q': /* Sets the name for the string pool. */ { _stringpool_name = /*getopt*/optarg; break; } case 'r': /* Utilize randomness to initialize the associated values table. */ { _option_word |= RANDOM; if (_initial_asso_value != 0) fprintf (stderr, "warning, -r option supersedes -i, disabling -i option and continuing\n"); break; } case 's': /* Range of associated values, determines size of final table. */ { float numerator; float denominator = 1; bool invalid = false; char *endptr; numerator = strtod (/*getopt*/optarg, &endptr); if (endptr == /*getopt*/optarg) invalid = true; else if (*endptr != '\0') { if (*endptr == '/') { char *denomptr = endptr + 1; denominator = strtod (denomptr, &endptr); if (endptr == denomptr || *endptr != '\0') invalid = true; } else invalid = true; } if (invalid) { fprintf (stderr, "Invalid value for option -s.\n"); short_usage (stderr); exit (1); } _size_multiple = numerator / denominator; /* Backward compatibility: -3 means 1/3. */ if (_size_multiple < 0) _size_multiple = 1 / (-_size_multiple); /* Catch stupid users. */ if (_size_multiple == 0) _size_multiple = 1; /* Warnings. */ if (_size_multiple > 50) fprintf (stderr, "Size multiple %g is excessive, did you really mean this?! (try '%s --help' for help)\n", _size_multiple, program_name); else if (_size_multiple < 0.01f) fprintf (stderr, "Size multiple %g is extremely small, did you really mean this?! (try '%s --help' for help)\n", _size_multiple, program_name); break; } case 'S': /* Generate switch statement output, rather than lookup table. */ { _option_word |= SWITCH; _total_switches = atoi (/*getopt*/optarg); if (_total_switches <= 0) { fprintf (stderr, "number of switches %s must be a positive number\n", /*getopt*/optarg); short_usage (stderr); exit (1); } break; } case 't': /* Enable the TYPE mode, allowing arbitrary user structures. */ { _option_word |= TYPE; break; } case 'T': /* Don't print structure definition. */ { _option_word |= NOTYPE; break; } case 'v': /* Print out the version and quit. */ fprintf (stdout, "GNU gperf %s\n", version_string); fprintf (stdout, "Copyright (C) %s Free Software Foundation, Inc.\n\ License GPLv3+: GNU GPL version 3 or later \n\ This is free software: you are free to change and redistribute it.\n\ There is NO WARRANTY, to the extent permitted by law.\n\ ", "2025"); fprintf (stdout, "Written by %s and %s.\n", "Douglas C. Schmidt", "Bruno Haible"); exit (0); case 'W': /* Sets the name for the hash table array. */ { _wordlist_name = /*getopt*/optarg; break; } case 'Z': /* Set the class name. */ { _class_name = /*getopt*/optarg; break; } case '7': /* Assume 7-bit characters. */ { _option_word |= SEVENBIT; break; } case CHAR_MAX + 1: /* Set the output file name. */ { _output_file_name = /*getopt*/optarg; break; } case CHAR_MAX + 2: /* Case insignificant. */ { _option_word |= UPPERLOWER; break; } case CHAR_MAX + 3: /* Use NULL instead of "". */ { _option_word |= NULLSTRINGS; break; } case CHAR_MAX + 4: /* Sets the name for the length table array. */ { _lengthtable_name = /*getopt*/optarg; break; } case CHAR_MAX + 5: /* Sets the prefix for the constants. */ { _constants_prefix = /*getopt*/optarg; break; } default: short_usage (stderr); exit (1); } } if (/*getopt*/optind < argc) _input_file_name = argv[/*getopt*/optind++]; if (/*getopt*/optind < argc) { fprintf (stderr, "Extra trailing arguments to %s.\n", program_name); short_usage (stderr); exit (1); } } /* ------------------------------------------------------------------------- */ #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "options.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ gperf-3.2.1/src/positions.h0000664000000000000000000001325013347736225011255 /* This may look like C code, but it is really -*- C++ -*- */ /* A set of byte positions. Copyright (C) 1989-1998, 2000, 2002-2003, 2005 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef positions_h #define positions_h 1 /* Classes defined below. */ class PositionIterator; class PositionReverseIterator; /* This class denotes a set of byte positions, used to access a keyword. */ class Positions { friend class PositionIterator; friend class PositionReverseIterator; public: /* Denotes the last char of a keyword, depending on the keyword's length. */ enum { LASTCHAR = -1 }; /* Maximum key position specifiable by the user, 1-based. Note that MAX_KEY_POS-1 must fit into the element type of _positions[], below. */ enum { MAX_KEY_POS = 255 }; /* Maximum possible size. Since duplicates are eliminated and the possible 0-based positions are -1 .. MAX_KEY_POS-1, this is: */ enum { MAX_SIZE = MAX_KEY_POS + 1 }; /* Constructors. */ Positions (); Positions (int pos1); Positions (int pos1, int pos2); /* Copy constructor. */ Positions (const Positions& src); /* Assignment operator. */ Positions& operator= (const Positions& src); /* Accessors. */ bool is_useall () const; int operator[] (unsigned int index) const; unsigned int get_size () const; /* Write access. */ void set_useall (bool useall); int * pointer (); void set_size (unsigned int size); /* Sorts the array in reverse order. Returns true if there are no duplicates, false otherwise. */ bool sort (); /* Creates an iterator, returning the positions in descending order. */ PositionIterator iterator () const; /* Creates an iterator, returning the positions in descending order, that apply to strings of length <= maxlen. */ PositionIterator iterator (int maxlen) const; /* Creates an iterator, returning the positions in ascending order. */ PositionReverseIterator reviterator () const; /* Creates an iterator, returning the positions in ascending order, that apply to strings of length <= maxlen. */ PositionReverseIterator reviterator (int maxlen) const; /* Set operations. Assumes the array is in reverse order. */ bool contains (int pos) const; void add (int pos); void remove (int pos); /* Output in external syntax. */ void print () const; private: /* The special case denoted by '*'. */ bool _useall; /* Number of positions. */ unsigned int _size; /* Array of positions. 0 for the first char, 1 for the second char etc., LASTCHAR for the last char. */ int _positions[MAX_SIZE]; }; /* This class denotes an iterator through a set of byte positions. */ class PositionIterator { friend class Positions; public: /* Copy constructor. */ PositionIterator (const PositionIterator& src); /* End of iteration marker. */ enum { EOS = -2 }; /* Retrieves the next position, or EOS past the end. */ int next (); /* Returns the number of remaining positions, i.e. how often next() will return a value != EOS. */ unsigned int remaining () const; private: /* Initializes an iterator through POSITIONS. */ PositionIterator (Positions const& positions); /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ PositionIterator (Positions const& positions, int maxlen); const Positions& _set; unsigned int _index; }; /* This class denotes an iterator in reverse direction through a set of byte positions. */ class PositionReverseIterator { friend class Positions; public: /* Copy constructor. */ PositionReverseIterator (const PositionReverseIterator& src); /* End of iteration marker. */ enum { EOS = -2 }; /* Retrieves the next position, or EOS past the end. */ int next (); /* Returns the number of remaining positions, i.e. how often next() will return a value != EOS. */ unsigned int remaining () const; private: /* Initializes an iterator through POSITIONS. */ PositionReverseIterator (Positions const& positions); /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ PositionReverseIterator (Positions const& positions, int maxlen); const Positions& _set; unsigned int _index; unsigned int _minindex; }; #ifdef __OPTIMIZE__ #include #define INLINE inline #include "positions.icc" #undef INLINE #endif #endif gperf-3.2.1/src/configure0000775000000000000000000050016514774103073010764 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='' PACKAGE_TARNAME='' PACKAGE_VERSION='' PACKAGE_STRING='' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="main.cc" ac_subst_vars='LTLIBOBJS LIBOBJS GPERF_LIBM INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM CXXCPP ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC SET_MAKE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/../build-aux" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP ;; esac fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for stack-allocated variable-size arrays" >&5 printf %s "checking for stack-allocated variable-size arrays... " >&6; } if test ${gp_cv_cxx_dynamic_array+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int func (int n) { int dynamic_array[n]; } int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : gp_cv_cxx_dynamic_array=yes else case e in #( e) gp_cv_cxx_dynamic_array=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $gp_cv_cxx_dynamic_array" >&5 printf "%s\n" "$gp_cv_cxx_dynamic_array" >&6; } if test $gp_cv_cxx_dynamic_array = yes; then printf "%s\n" "#define HAVE_DYNAMIC_ARRAY 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for rand in -lm" >&5 printf %s "checking for rand in -lm... " >&6; } if test ${ac_cv_lib_m_rand+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char rand (void); int main (void) { return rand (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_m_rand=yes else case e in #( e) ac_cv_lib_m_rand=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_rand" >&5 printf "%s\n" "$ac_cv_lib_m_rand" >&6; } if test "x$ac_cv_lib_m_rand" = xyes then : GPERF_LIBM="-lm" else case e in #( e) GPERF_LIBM="" ;; esac fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gperf-3.2.1/src/Makefile.in0000664000000000000000000001266213620406577011126 # Makefile for gperf/src # Copyright (C) 1989, 1992-1993, 1998, 2000, 2002-2003, 2006, 2009, 2012, 2020 Free Software Foundation, Inc. # Written by Douglas C. Schmidt # and Bruno Haible . # # This file is part of GNU GPERF. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #### Start of system configuration section. #### # Directories used by "make": srcdir = @srcdir@ # Directories used by "make install": prefix = @prefix@ local_prefix = /usr/local exec_prefix = @exec_prefix@ bindir = @bindir@ # Programs used by "make": # C compiler CC = @CC@ CFLAGS = @CFLAGS@ CPP = @CPP@ # C++ compiler CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ CXXCPP = @CXXCPP@ # Both C and C++ compiler LDFLAGS = @LDFLAGS@ OBJEXT = @OBJEXT@ EXEEXT = @EXEEXT@ # Other MV = mv LN = ln RM = rm -f @SET_MAKE@ # Programs used by "make install": INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(SHELL) $(srcdir)/../build-aux/mkinstalldirs #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) OBJECTS = version.$(OBJEXT) positions.$(OBJEXT) options.$(OBJEXT) keyword.$(OBJEXT) keyword-list.$(OBJEXT) \ input.$(OBJEXT) bool-array.$(OBJEXT) hash-table.$(OBJEXT) search.$(OBJEXT) output.$(OBJEXT) main.$(OBJEXT) LIBS = ../lib/libgp.a @GPERF_LIBM@ CPPFLAGS = @CPPFLAGS@ -I. -I$(srcdir)/../lib TARGETPROG = gperf$(EXEEXT) all : $(TARGETPROG) $(TARGETPROG): $(OBJECTS) $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LIBS) # Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always # expand $< correctly in this context. # #%.o : %.c # $(CC) $(CFLAGS) $(CPPFLAGS) -c $< # #%.o : %.cc # $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< # Dependencies. CONFIG_H = config.h VERSION_H = version.h POSITIONS_H = positions.h positions.icc OPTIONS_H = options.h options.icc $(POSITIONS_H) KEYWORD_H = keyword.h keyword.icc KEYWORD_LIST_H = keyword-list.h keyword-list.icc $(KEYWORD_H) INPUT_H = input.h $(KEYWORD_LIST_H) BOOL_ARRAY_H = bool-array.h bool-array.icc $(OPTIONS_H) HASH_TABLE_H = hash-table.h $(KEYWORD_H) SEARCH_H = search.h $(KEYWORD_LIST_H) $(POSITIONS_H) $(BOOL_ARRAY_H) OUTPUT_H = output.h $(KEYWORD_LIST_H) $(POSITIONS_H) version.$(OBJEXT): version.cc $(VERSION_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/version.cc positions.$(OBJEXT): positions.cc $(POSITIONS_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/positions.cc options.$(OBJEXT): options.cc $(OPTIONS_H) $(VERSION_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/options.cc keyword.$(OBJEXT): keyword.cc $(KEYWORD_H) $(POSITIONS_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/keyword.cc keyword-list.$(OBJEXT): keyword-list.cc $(KEYWORD_LIST_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/keyword-list.cc input.$(OBJEXT): input.cc $(INPUT_H) $(OPTIONS_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/input.cc bool-array.$(OBJEXT): bool-array.cc $(BOOL_ARRAY_H) $(OPTIONS_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/bool-array.cc hash-table.$(OBJEXT): hash-table.cc $(HASH_TABLE_H) $(OPTIONS_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash-table.cc search.$(OBJEXT): search.cc $(SEARCH_H) $(OPTIONS_H) $(HASH_TABLE_H) $(CONFIG_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/search.cc output.$(OBJEXT): output.cc $(OUTPUT_H) $(OPTIONS_H) $(VERSION_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/output.cc main.$(OBJEXT): main.cc $(OPTIONS_H) $(INPUT_H) $(SEARCH_H) $(OUTPUT_H) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/main.cc install : all force $(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(INSTALL_PROGRAM) $(TARGETPROG) $(DESTDIR)$(bindir)/$(TARGETPROG) installdirs : force $(MKINSTALLDIRS) $(DESTDIR)$(bindir) uninstall : force $(RM) $(DESTDIR)$(bindir)/$(TARGETPROG) check : all mostlyclean : clean clean : force $(RM) *~ *.s *.$(OBJEXT) *.a $(TARGETPROG) $(TARGETPROG).manifest core distclean : clean $(RM) config.status config.log config.cache Makefile config.h maintainer-clean : distclean # List of source files. SOURCE_FILES = \ configure.ac Makefile.in \ version.cc $(VERSION_H) \ positions.cc $(POSITIONS_H) \ options.cc $(OPTIONS_H) \ keyword.cc $(KEYWORD_H) \ keyword-list.cc $(KEYWORD_LIST_H) \ input.cc $(INPUT_H) \ bool-array.cc $(BOOL_ARRAY_H) \ hash-table.cc $(HASH_TABLE_H) \ search.cc $(SEARCH_H) \ output.cc $(OUTPUT_H) \ main.cc # List of distributed files imported from other packages. IMPORTED_FILES = # List of distributed files generated by autotools or Makefile.devel. GENERATED_FILES = \ configure config.h.in # List of distributed files generated by "make". DISTRIBUTED_BUILT_FILES = # List of distributed files. DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES) distdir : $(DISTFILES) for file in $(DISTFILES); do \ if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \ cp -p $$dir/$$file '$(distdir)'/$$file || exit 1; \ done force : gperf-3.2.1/src/keyword-list.h0000664000000000000000000000432614774201171011657 /* This may look like C code, but it is really -*- C++ -*- */ /* Keyword list. Copyright (C) 2002-2003, 2025 Free Software Foundation, Inc. Written by Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef keyword_list_h #define keyword_list_h 1 #include "keyword.h" /* List node of a linear list of KT, where KT is a subclass of Keyword. */ template class Keyword_List { public: /* Constructor. */ Keyword_List (KT *car); /* Access to first element of list. */ KT * first () const; /* Access to next element of list. */ Keyword_List *& rest (); protected: Keyword_List * _cdr; KT * const _car; }; /* List node of a linear list of KeywordExt. */ typedef Keyword_List KeywordExt_List; /* Copies a linear list, sharing the list elements. */ template extern Keyword_List * copy_list (Keyword_List *list); /* Deletes a linear list, keeping the list elements in memory. */ template extern void delete_list (Keyword_List *list); /* Sorts a linear list, given a comparison function. Note: This uses a variant of mergesort that is *not* a stable sorting algorithm. */ template extern Keyword_List * mergesort_list (Keyword_List *list, bool (*less) (KT *keyword1, KT *keyword2)); #ifdef __OPTIMIZE__ #define INLINE inline #include "keyword-list.icc" #undef INLINE #endif #endif gperf-3.2.1/src/version.h0000664000000000000000000000165313347736234010717 /* Current program version number. Copyright (C) 1989-1998 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Current release version. */ extern const char *version_string; gperf-3.2.1/src/input.h0000664000000000000000000000465514774211162010367 /* This may look like C code, but it is really -*- C++ -*- */ /* Input routines. Copyright (C) 1989-1998, 2002-2003, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef input_h #define input_h 1 #include #include "keyword-list.h" template class Input { public: Input (FILE *stream, Keyword_Factory *keyword_factory); ~Input (); void read_input (); private: /* Input stream. */ FILE * _stream; /* Creates the keywords. */ Keyword_Factory * const _factory; public: /* Memory block containing the entire input. */ char * _input; char * _input_end; /* The C code from the declarations section. */ const char * _verbatim_declarations; const char * _verbatim_declarations_end; unsigned int _verbatim_declarations_lineno; /* The C code from the end of the file. */ const char * _verbatim_code; const char * _verbatim_code_end; unsigned int _verbatim_code_lineno; /* Declaration of struct type for a keyword and its attributes. */ const char * _struct_decl; unsigned int _struct_decl_lineno; /* Return type of the lookup function. */ const char * _return_type; /* Shorthand for user-defined struct tag type. */ const char * _struct_tag; /* List of all keywords. */ Keyword_List * _head; /* Whether the keyword chars would have different values in a different character set. */ bool _charset_dependent; }; #endif gperf-3.2.1/src/options.icc0000664000000000000000000000706614475667653011253 /* Inline Functions for options.{h,cc}. Copyright (C) 1989-1998, 2000, 2002-2004, 2011 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* ----------------------------- Class Options ----------------------------- */ /* Tests a given boolean option. Returns true if set, false otherwise. */ INLINE bool Options::operator[] (Option_Type option) const { return _option_word & option; } /* Sets a given boolean option. */ INLINE void Options::set (Option_Type option) { _option_word |= option; } /* Returns the input file name. */ INLINE const char * Options::get_input_file_name () const { return _input_file_name; } /* Returns the output file name. */ INLINE const char * Options::get_output_file_name () const { return _output_file_name; } /* Returns the jump value. */ INLINE int Options::get_jump () const { return _jump; } /* Returns the initial associated character value. */ INLINE int Options::get_initial_asso_value () const { return _initial_asso_value; } /* Returns the number of iterations for finding finding good asso_values. */ INLINE int Options::get_asso_iterations () const { return _asso_iterations; } /* Returns the total number of switch statements to generate. */ INLINE int Options::get_total_switches () const { return _total_switches; } /* Returns the factor by which to multiply the generated table's size. */ INLINE float Options::get_size_multiple () const { return _size_multiple; } /* Returns the generated function name. */ INLINE const char * Options::get_function_name () const { return _function_name; } /* Returns the keyword key name. */ INLINE const char * Options::get_slot_name () const { return _slot_name; } /* Returns the struct initializer suffix. */ INLINE const char * Options::get_initializer_suffix () const { return _initializer_suffix; } /* Returns the generated class name. */ INLINE const char * Options::get_class_name () const { return _class_name; } /* Returns the hash function name. */ INLINE const char * Options::get_hash_name () const { return _hash_name; } /* Returns the hash table array name. */ INLINE const char * Options::get_wordlist_name () const { return _wordlist_name; } /* Returns the length table array name. */ INLINE const char * Options::get_lengthtable_name () const { return _lengthtable_name; } /* Returns the string pool name. */ INLINE const char * Options::get_stringpool_name () const { return _stringpool_name; } /* Returns the prefix for the constants. */ INLINE const char * Options::get_constants_prefix () const { return _constants_prefix; } /* Returns the string used to delimit keywords from other attributes. */ INLINE const char * Options::get_delimiters () const { return _delimiters; } /* Returns key positions. */ INLINE const Positions& Options::get_key_positions () const { return _key_positions; } gperf-3.2.1/src/hash-table.h0000664000000000000000000000434213347736246011243 /* This may look like C code, but it is really -*- C++ -*- */ /* Hash table used to check for duplicate keyword entries. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef hash_table_h #define hash_table_h 1 #include "keyword.h" /* Hash table of KeywordExt* entries. Two entries are considered equal if their _selchars are the same and - if !ignore_length - if their _allchars_length are the same. */ class Hash_Table { public: /* Constructor. size is the maximum number of entries. ignore_length determines a detail in the comparison function. */ Hash_Table (unsigned int size, bool ignore_length); /* Destructor. */ ~Hash_Table (); /* Attempts to insert ITEM in the table. If there is already an equal entry in it, returns it. Otherwise inserts ITEM and returns NULL. */ KeywordExt * insert (KeywordExt *item); /* Print the table's contents. */ void dump () const; private: /* Vector of entries. */ KeywordExt ** _table; /* Size of the vector. */ unsigned int _size; /* log2(_size). */ unsigned int _log_size; /* A detail of the comparison function. */ bool const _ignore_length; /* Statistics: Number of collisions so far. */ unsigned int _collisions; /* Compares two items. */ bool equal (KeywordExt *item1, KeywordExt *item2) const; }; #endif gperf-3.2.1/src/hash-table.cc0000664000000000000000000001151013347736251011370 /* Hash table for checking keyword links. Implemented using double hashing. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "hash-table.h" #include #include /* declares memset(), strcmp() */ #include #include "options.h" /* We use a hash table with double hashing. This is the simplest kind of hash table, given that we always only insert and never remove entries from the hash table. */ /* To make double hashing efficient, there need to be enough spare entries. */ static const int size_factor = 10; /* We make the size of the hash table a power of 2. This allows for two optimizations: It eliminates the modulo instruction, and allows for an easy secondary hashing function. */ /* Constructor. */ Hash_Table::Hash_Table (unsigned int size, bool ignore_length) : _ignore_length (ignore_length), _collisions (0) { /* There need to be enough spare entries. */ size = size * size_factor; /* Find smallest power of 2 that is >= size. */ unsigned int shift = 0; if ((size >> 16) > 0) { size = size >> 16; shift += 16; } if ((size >> 8) > 0) { size = size >> 8; shift += 8; } if ((size >> 4) > 0) { size = size >> 4; shift += 4; } if ((size >> 2) > 0) { size = size >> 2; shift += 2; } if ((size >> 1) > 0) { size = size >> 1; shift += 1; } _log_size = shift; _size = 1 << shift; /* Allocate table. */ _table = new KeywordExt*[_size]; memset (_table, 0, _size * sizeof (*_table)); } /* Destructor. */ Hash_Table::~Hash_Table () { delete[] _table; } /* Print the table's contents. */ void Hash_Table::dump () const { int field_width; field_width = 0; { for (int i = _size - 1; i >= 0; i--) if (_table[i]) if (field_width < _table[i]->_selchars_length) field_width = _table[i]->_selchars_length; } fprintf (stderr, "\ndumping the hash table\n" "total available table slots = %d, total bytes = %d, total collisions = %d\n" "location, %*s, keyword\n", _size, _size * static_cast(sizeof (*_table)), _collisions, field_width, "keysig"); for (int i = _size - 1; i >= 0; i--) if (_table[i]) { fprintf (stderr, "%8d, ", i); if (field_width > _table[i]->_selchars_length) fprintf (stderr, "%*s", field_width - _table[i]->_selchars_length, ""); for (int j = 0; j < _table[i]->_selchars_length; j++) putc (_table[i]->_selchars[j], stderr); fprintf (stderr, ", %.*s\n", _table[i]->_allchars_length, _table[i]->_allchars); } fprintf (stderr, "\nend dumping hash table\n\n"); } /* Compares two items. */ inline bool Hash_Table::equal (KeywordExt *item1, KeywordExt *item2) const { return item1->_selchars_length == item2->_selchars_length && memcmp (item1->_selchars, item2->_selchars, item2->_selchars_length * sizeof (unsigned int)) == 0 && (_ignore_length || item1->_allchars_length == item2->_allchars_length); } /* Attempts to insert ITEM in the table. If there is already an equal entry in it, returns it. Otherwise inserts ITEM and returns NULL. */ KeywordExt * Hash_Table::insert (KeywordExt *item) { unsigned hash_val = hashpjw (reinterpret_cast(item->_selchars), item->_selchars_length * sizeof (unsigned int)); unsigned int probe = hash_val & (_size - 1); unsigned int increment = (((hash_val >> _log_size) ^ (_ignore_length ? 0 : item->_allchars_length)) << 1) + 1; /* Note that because _size is a power of 2 and increment is odd, we have gcd(increment,_size) = 1, which guarantees that we'll find an empty entry during the loop. */ while (_table[probe] != NULL) { if (equal (_table[probe], item)) return _table[probe]; _collisions++; probe = (probe + increment) & (_size - 1); } _table[probe] = item; return NULL; } gperf-3.2.1/src/output.cc0000664000000000000000000022267314775444527010746 /* Output routines. Copyright (C) 1989-2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "output.h" #include #include /* declares strncpy(), strchr() */ #include /* declares isprint() */ #include /* defines assert() */ #include /* defines SCHAR_MAX etc. */ #include "options.h" #include "version.h" #include "config.h" /* ============================== Portability ============================== */ /* Dynamically allocated array with dynamic extent: Example: DYNAMIC_ARRAY (my_array, int, n); ... FREE_DYNAMIC_ARRAY (my_array); Attention: depending on your implementation my_array is either the array itself or a pointer to the array! Always use my_array only as expression! */ #if HAVE_DYNAMIC_ARRAY #define DYNAMIC_ARRAY(var,eltype,size) eltype var[size] #define FREE_DYNAMIC_ARRAY(var) #else #define DYNAMIC_ARRAY(var,eltype,size) eltype *var = new eltype[size] #define FREE_DYNAMIC_ARRAY(var) delete[] var #endif /* ========================================================================= */ /* The "register " storage-class specifier. */ static const char *register_scs; /* The "const " qualifier. */ static const char *const_always; /* The "const " qualifier, for read-only arrays. */ static const char *const_readonly_array; /* The "const " qualifier, for the array type. */ static const char *const_for_struct; /* Returns the smallest unsigned C type capable of holding integers up to N. */ static const char * smallest_integral_type (int n) { if (n <= UCHAR_MAX) return "unsigned char"; if (n <= USHRT_MAX) return "unsigned short"; return "unsigned int"; } /* Returns the smallest signed C type capable of holding integers from MIN to MAX. */ static const char * smallest_integral_type (int min, int max) { if (option[ANSIC] | option[CPLUSPLUS]) if (min >= SCHAR_MIN && max <= SCHAR_MAX) return "signed char"; if (min >= SHRT_MIN && max <= SHRT_MAX) return "short"; return "int"; } /* ------------------------------------------------------------------------- */ /* Constructor. Note about the keyword list starting at head: - The list is ordered by increasing _hash_value. This has been achieved by Search::sort(). - Duplicates, i.e. keywords with the same _selchars set, are chained through the _duplicate_link pointer. Only one representative per duplicate equivalence class remains on the linear keyword list. - Accidental duplicates, i.e. keywords for which the _asso_values[] search couldn't achieve different hash values, cannot occur on the linear keyword list. Search::optimize would catch this mistake. */ Output::Output (KeywordExt_List *head, const char *struct_decl, unsigned int struct_decl_lineno, const char *return_type, const char *struct_tag, const char *verbatim_declarations, const char *verbatim_declarations_end, unsigned int verbatim_declarations_lineno, const char *verbatim_code, const char *verbatim_code_end, unsigned int verbatim_code_lineno, bool charset_dependent, int total_keys, int max_key_len, int min_key_len, bool hash_includes_len, const Positions& positions, const unsigned int *alpha_inc, int total_duplicates, unsigned int alpha_size, const int *asso_values) : _head (head), _struct_decl (struct_decl), _struct_decl_lineno (struct_decl_lineno), _return_type (return_type), _struct_tag (struct_tag), _verbatim_declarations (verbatim_declarations), _verbatim_declarations_end (verbatim_declarations_end), _verbatim_declarations_lineno (verbatim_declarations_lineno), _verbatim_code (verbatim_code), _verbatim_code_end (verbatim_code_end), _verbatim_code_lineno (verbatim_code_lineno), _charset_dependent (charset_dependent), _total_keys (total_keys), _max_key_len (max_key_len), _min_key_len (min_key_len), _hash_includes_len (hash_includes_len), _key_positions (positions), _alpha_inc (alpha_inc), _total_duplicates (total_duplicates), _alpha_size (alpha_size), _asso_values (asso_values) { } /* ------------------------------------------------------------------------- */ /* Computes the minimum and maximum hash values, and stores them in _min_hash_value and _max_hash_value. */ void Output::compute_min_max () { /* Since the list is already sorted by hash value all we need to do is to look at the first and the last element of the list. */ _min_hash_value = _head->first()->_hash_value; KeywordExt_List *temp; for (temp = _head; temp->rest(); temp = temp->rest()) ; _max_hash_value = temp->first()->_hash_value; } /* ------------------------------------------------------------------------- */ /* Returns the number of different hash values. */ int Output::num_hash_values () const { /* Since the list is already sorted by hash value and doesn't contain duplicates, we can simply count the number of keywords on the list. */ int count = 0; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) count++; return count; } /* -------------------- Output_Constants and subclasses -------------------- */ /* This class outputs an enumeration defining some constants. */ struct Output_Constants { virtual void output_start () = 0; virtual void output_item (const char *name, int value) = 0; virtual void output_end () = 0; Output_Constants () {} virtual ~Output_Constants () {} }; /* This class outputs an enumeration in #define syntax. */ struct Output_Defines : public Output_Constants { virtual void output_start (); virtual void output_item (const char *name, int value); virtual void output_end (); Output_Defines () {} virtual ~Output_Defines () {} }; void Output_Defines::output_start () { printf ("\n"); } void Output_Defines::output_item (const char *name, int value) { printf ("#define %s %d\n", name, value); } void Output_Defines::output_end () { } /* This class outputs an enumeration using 'enum'. */ struct Output_Enum : public Output_Constants { virtual void output_start (); virtual void output_item (const char *name, int value); virtual void output_end (); Output_Enum (const char *indent) : _indentation (indent) {} virtual ~Output_Enum () {} private: const char *_indentation; bool _pending_comma; }; void Output_Enum::output_start () { printf ("%senum\n" "%s {\n", _indentation, _indentation); _pending_comma = false; } void Output_Enum::output_item (const char *name, int value) { if (_pending_comma) printf (",\n"); printf ("%s %s = %d", _indentation, name, value); _pending_comma = true; } void Output_Enum::output_end () { if (_pending_comma) printf ("\n"); printf ("%s };\n\n", _indentation); } /* Outputs a constant in the given style. */ static void output_constant (struct Output_Constants& style, const char *name, int value) { const char *prefix = option.get_constants_prefix (); DYNAMIC_ARRAY (combined_name, char, strlen (prefix) + strlen (name) + 1); strcpy (combined_name, prefix); strcpy (combined_name + strlen (prefix), name); style.output_item (combined_name, value); FREE_DYNAMIC_ARRAY (combined_name); } /* Outputs the maximum and minimum hash values etc. */ void Output::output_constants (struct Output_Constants& style) const { style.output_start (); output_constant (style, "TOTAL_KEYWORDS", _total_keys); output_constant (style, "MIN_WORD_LENGTH", _min_key_len); output_constant (style, "MAX_WORD_LENGTH", _max_key_len); output_constant (style, "MIN_HASH_VALUE", _min_hash_value); output_constant (style, "MAX_HASH_VALUE", _max_hash_value); style.output_end (); } /* ------------------------------------------------------------------------- */ /* We use a downcase table because when called repeatedly, the code gperf_downcase[c] is faster than if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; */ #define USE_DOWNCASE_TABLE 1 #if USE_DOWNCASE_TABLE /* Output gperf's ASCII-downcase table. */ static void output_upperlower_table () { unsigned int c; printf ("#ifndef GPERF_DOWNCASE\n" "#define GPERF_DOWNCASE 1\n" "static %sunsigned char gperf_downcase[256] =\n" " {", const_readonly_array); for (c = 0; c < 256; c++) { if ((c % 15) == 0) printf ("\n "); printf (" %3d", c >= 'A' && c <= 'Z' ? c + 'a' - 'A' : c); if (c < 255) printf (","); } printf ("\n" " };\n" "#endif\n\n"); } #endif /* Output gperf's ASCII-case insensitive strcmp replacement. */ static void output_upperlower_strcmp () { printf ("#ifndef GPERF_CASE_STRCMP\n" "#define GPERF_CASE_STRCMP 1\n" "static int\n" "gperf_case_strcmp "); printf (option[KRC] ? "(s1, s2)\n" " %schar *s1;\n" " %schar *s2;\n" : option[C] ? "(s1, s2)\n" " %sconst char *s1;\n" " %sconst char *s2;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(%sconst char *s1, %sconst char *s2)\n" : "", register_scs, register_scs); #if USE_DOWNCASE_TABLE printf ("{\n" " for (;;)\n" " {\n" " unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n" " unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n" " if (c1 != 0 && c1 == c2)\n" " continue;\n" " return (int)c1 - (int)c2;\n" " }\n" "}\n"); #else printf ("{\n" " for (;;)\n" " {\n" " unsigned char c1 = *s1++;\n" " unsigned char c2 = *s2++;\n" " if (c1 >= 'A' && c1 <= 'Z')\n" " c1 += 'a' - 'A';\n" " if (c2 >= 'A' && c2 <= 'Z')\n" " c2 += 'a' - 'A';\n" " if (c1 != 0 && c1 == c2)\n" " continue;\n" " return (int)c1 - (int)c2;\n" " }\n" "}\n"); #endif printf ("#endif\n\n"); } /* Output gperf's ASCII-case insensitive strncmp replacement. */ static void output_upperlower_strncmp () { printf ("#ifndef GPERF_CASE_STRNCMP\n" "#define GPERF_CASE_STRNCMP 1\n" "static int\n" "gperf_case_strncmp "); printf (option[KRC] ? "(s1, s2, n)\n" " %schar *s1;\n" " %schar *s2;\n" " %ssize_t n;\n" : option[C] ? "(s1, s2, n)\n" " %sconst char *s1;\n" " %sconst char *s2;\n" " %ssize_t n;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(%sconst char *s1, %sconst char *s2, %ssize_t n)\n" : "", register_scs, register_scs, register_scs); #if USE_DOWNCASE_TABLE printf ("{\n" " for (; n > 0;)\n" " {\n" " unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n" " unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n" " if (c1 != 0 && c1 == c2)\n" " {\n" " n--;\n" " continue;\n" " }\n" " return (int)c1 - (int)c2;\n" " }\n" " return 0;\n" "}\n"); #else printf ("{\n" " for (; n > 0;)\n" " {\n" " unsigned char c1 = *s1++;\n" " unsigned char c2 = *s2++;\n" " if (c1 >= 'A' && c1 <= 'Z')\n" " c1 += 'a' - 'A';\n" " if (c2 >= 'A' && c2 <= 'Z')\n" " c2 += 'a' - 'A';\n" " if (c1 != 0 && c1 == c2)\n" " {\n" " n--;\n" " continue;\n" " }\n" " return (int)c1 - (int)c2;\n" " }\n" " return 0;\n" "}\n"); #endif printf ("#endif\n\n"); } /* Output gperf's ASCII-case insensitive memcmp replacement. */ static void output_upperlower_memcmp () { printf ("#ifndef GPERF_CASE_MEMCMP\n" "#define GPERF_CASE_MEMCMP 1\n" "static int\n" "gperf_case_memcmp "); printf (option[KRC] ? "(s1, s2, n)\n" " %schar *s1;\n" " %schar *s2;\n" " %ssize_t n;\n" : option[C] ? "(s1, s2, n)\n" " %sconst char *s1;\n" " %sconst char *s2;\n" " %ssize_t n;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(%sconst char *s1, %sconst char *s2, %ssize_t n)\n" : "", register_scs, register_scs, register_scs); #if USE_DOWNCASE_TABLE printf ("{\n" " for (; n > 0;)\n" " {\n" " unsigned char c1 = gperf_downcase[(unsigned char)*s1++];\n" " unsigned char c2 = gperf_downcase[(unsigned char)*s2++];\n" " if (c1 == c2)\n" " {\n" " n--;\n" " continue;\n" " }\n" " return (int)c1 - (int)c2;\n" " }\n" " return 0;\n" "}\n"); #else printf ("{\n" " for (; n > 0;)\n" " {\n" " unsigned char c1 = *s1++;\n" " unsigned char c2 = *s2++;\n" " if (c1 >= 'A' && c1 <= 'Z')\n" " c1 += 'a' - 'A';\n" " if (c2 >= 'A' && c2 <= 'Z')\n" " c2 += 'a' - 'A';\n" " if (c1 == c2)\n" " {\n" " n--;\n" " continue;\n" " }\n" " return (int)c1 - (int)c2;\n" " }\n" " return 0;\n" "}\n"); #endif printf ("#endif\n\n"); } /* ------------------------------------------------------------------------- */ /* Outputs a keyword, as a string: enclosed in double quotes, escaping backslashes, double quote and unprintable characters. */ static void output_string (const char *key, int len) { putchar ('"'); for (; len > 0; len--) { unsigned char c = static_cast(*key++); if (isprint (c)) { if (c == '"' || c == '\\') putchar ('\\'); putchar (c); } else { /* Use octal escapes, not hexadecimal escapes, because some old C compilers didn't understand hexadecimal escapes, and because hexadecimal escapes are not limited to 2 digits, thus needing special care if the following character happens to be a digit. */ putchar ('\\'); putchar ('0' + ((c >> 6) & 7)); putchar ('0' + ((c >> 3) & 7)); putchar ('0' + (c & 7)); } } putchar ('"'); } /* ------------------------------------------------------------------------- */ /* Outputs a #line directive, referring to the given line number. */ static void output_line_directive (unsigned int lineno) { const char *file_name = option.get_input_file_name (); if (file_name != NULL) { printf ("#line %u ", lineno); output_string (file_name, strlen (file_name)); printf ("\n"); } } /* ------------------------------------------------------------------------- */ /* Outputs a type and a const specifier (i.e. "const " or ""). The output is terminated with a space. */ static void output_const_type (const char *const_string, const char *type_string) { if (type_string[strlen(type_string)-1] == '*') /* For pointer types, put the 'const' after the type. */ printf ("%s %s", type_string, const_string); else /* For scalar or struct types, put the 'const' before the type. */ printf ("%s%s ", const_string, type_string); } /* ----------------------- Output_Expr and subclasses ----------------------- */ /* This class outputs a general expression. */ struct Output_Expr { virtual void output_expr () const = 0; Output_Expr () {} virtual ~Output_Expr () {} }; /* This class outputs an expression formed by a single string. */ struct Output_Expr1 : public Output_Expr { virtual void output_expr () const; Output_Expr1 (const char *piece1) : _p1 (piece1) {} virtual ~Output_Expr1 () {} private: const char *_p1; }; void Output_Expr1::output_expr () const { printf ("%s", _p1); } #if 0 /* unused */ /* This class outputs an expression formed by the concatenation of two strings. */ struct Output_Expr2 : public Output_Expr { virtual void output_expr () const; Output_Expr2 (const char *piece1, const char *piece2) : _p1 (piece1), _p2 (piece2) {} virtual ~Output_Expr2 () {} private: const char *_p1; const char *_p2; }; void Output_Expr2::output_expr () const { printf ("%s%s", _p1, _p2); } #endif /* --------------------- Output_Compare and subclasses --------------------- */ /* This class outputs a comparison expression. */ struct Output_Compare { /* Outputs the comparison expression. expr1 outputs a simple expression of type 'const char *' referring to the string being looked up. expr2 outputs a simple expression of type 'const char *' referring to the constant string stored in the gperf generated hash table. */ virtual void output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const = 0; /* Outputs the comparison expression for the first byte. Returns true if the this comparison is complete. */ bool output_firstchar_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const; Output_Compare () {} virtual ~Output_Compare () {} }; bool Output_Compare::output_firstchar_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const { /* First, we emit a comparison of the first byte of the two strings. This catches most cases where the string being looked up is not in the hash table but happens to have the same hash code as an element of the hash table. */ if (option[UPPERLOWER]) { /* Incomplete comparison, just for speedup. */ printf ("(((unsigned char)*"); expr1.output_expr (); printf (" ^ (unsigned char)*"); expr2.output_expr (); printf (") & ~32) == 0"); return false; } else { /* Complete comparison. */ printf ("*"); expr1.output_expr (); printf (" == *"); expr2.output_expr (); return true; } } /* This class outputs a comparison using strcmp. */ struct Output_Compare_Strcmp : public Output_Compare { virtual void output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const; Output_Compare_Strcmp () {} virtual ~Output_Compare_Strcmp () {} }; void Output_Compare_Strcmp::output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const { bool firstchar_done = output_firstchar_comparison (expr1, expr2); printf (" && !"); if (option[UPPERLOWER]) printf ("gperf_case_"); printf ("strcmp ("); if (firstchar_done) { expr1.output_expr (); printf (" + 1, "); expr2.output_expr (); printf (" + 1"); } else { expr1.output_expr (); printf (", "); expr2.output_expr (); } printf (")"); } /* This class outputs a comparison using strncmp. Note that the length of expr1 will be available through the local variable 'len'. */ struct Output_Compare_Strncmp : public Output_Compare { virtual void output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const; Output_Compare_Strncmp () {} virtual ~Output_Compare_Strncmp () {} }; void Output_Compare_Strncmp::output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const { bool firstchar_done = output_firstchar_comparison (expr1, expr2); printf (" && !"); if (option[UPPERLOWER]) printf ("gperf_case_"); printf ("strncmp ("); if (firstchar_done) { expr1.output_expr (); printf (" + 1, "); expr2.output_expr (); printf (" + 1, len - 1"); } else { expr1.output_expr (); printf (", "); expr2.output_expr (); printf (", len"); } printf (") && "); expr2.output_expr (); printf ("[len] == '\\0'"); } /* This class outputs a comparison using memcmp. Note that the length of expr1 (available through the local variable 'len') must be verified to be equal to the length of expr2 prior to this comparison. */ struct Output_Compare_Memcmp : public Output_Compare { virtual void output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const; Output_Compare_Memcmp () {} virtual ~Output_Compare_Memcmp () {} }; void Output_Compare_Memcmp::output_comparison (const Output_Expr& expr1, const Output_Expr& expr2) const { bool firstchar_done = output_firstchar_comparison (expr1, expr2); printf (" && !"); if (option[UPPERLOWER]) printf ("gperf_case_"); printf ("memcmp ("); if (firstchar_done) { expr1.output_expr (); printf (" + 1, "); expr2.output_expr (); printf (" + 1, len - 1"); } else { expr1.output_expr (); printf (", "); expr2.output_expr (); printf (", len"); } printf (")"); } /* ------------------------------------------------------------------------- */ /* Generates a C expression for an asso_values[] index. */ void Output::output_asso_values_index (int pos) const { if (pos == Positions::LASTCHAR) printf ("str[len - 1]"); else { printf ("str[%d]", pos); if (_alpha_inc[pos]) printf ("+%u", _alpha_inc[pos]); } } /* Generates a C expression for an asso_values[] reference. */ void Output::output_asso_values_ref (int pos) const { printf ("asso_values["); /* Always cast to unsigned char. This is necessary when the alpha_inc is nonzero, and also avoids a gcc warning "subscript has type 'char'". */ if (option[CPLUSPLUS]) { /* In C++, a C style cast may lead to a 'warning: use of old-style cast'. Therefore prefer the C++ style cast syntax. */ printf ("static_cast("); output_asso_values_index (pos); printf (")"); } else { printf ("(unsigned char)"); output_asso_values_index (pos); } printf ("]"); } /* Generates C code for the hash function that returns the proper encoding for each keyword. The hash function has the signature unsigned int (const char *str, size_t len). */ void Output::output_hash_function () const { /* Output the function's head. */ if (option[CPLUSPLUS]) printf ("inline "); else if (option[KRC] | option[C] | option[ANSIC]) printf ("#ifdef __GNUC__\n" "__inline\n" "#else\n" "#ifdef __cplusplus\n" "inline\n" "#endif\n" "#endif\n"); /* Does the function use the 'str' argument? */ bool uses_str = (_key_positions.get_size() > 0); /* Does the function use the 'len' argument? */ bool uses_len = (_hash_includes_len || (_key_positions.get_size() > 0 && (_key_positions[0] >= _min_key_len || _key_positions[_key_positions.get_size() - 1] == Positions::LASTCHAR))); if (!uses_str || !uses_len) /* Pacify lint. */ printf ("/*ARGSUSED*/\n"); if (option[KRC] | option[C] | option[ANSIC]) printf ("static "); printf ("unsigned int\n"); if (option[CPLUSPLUS]) printf ("%s::", option.get_class_name ()); printf ("%s ", option.get_hash_name ()); /* We better not use [[__maybe_unused__]] or __attribute__ ((__unused__)) because support for these syntaxes in the compilers is constantly changing. */ printf (option[KRC] ? "(str, len)\n" " %schar *str;\n" " %ssize_t len;\n" : option[C] ? "(str, len)\n" " %sconst char *str;\n" " %ssize_t len;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(%sconst char *str, %ssize_t len)\n" : "", register_scs, register_scs); /* Note that when the hash function is called, it has already been verified that min_key_len <= len <= max_key_len. */ /* Output the function's body. */ printf ("{\n"); /* First the asso_values array. */ if (_key_positions.get_size() > 0) { /* The values in the asso_values array are all unsigned integers <= MAX_HASH_VALUE + 1. */ printf (" static %s%s asso_values[] =\n" " {", const_readonly_array, smallest_integral_type (_max_hash_value + 1)); const int columns = 10; /* Calculate maximum number of digits required for MAX_HASH_VALUE + 1. */ int field_width = 2; for (int trunc = _max_hash_value + 1; (trunc /= 10) > 0;) field_width++; for (unsigned int count = 0; count < _alpha_size; count++) { if (count > 0) printf (","); if ((count % columns) == 0) printf ("\n "); printf ("%*d", field_width, _asso_values[count]); } printf ("\n" " };\n"); } if (!uses_str) /* The function does not use the 'str' argument. Silence "gcc -Wunused-parameter". */ printf (" (void) str;\n"); if (!uses_len) /* The function does not use the 'len' argument. Silence "gcc -Wunused-parameter". */ printf (" (void) len;\n"); if (_key_positions.get_size() == 0) { /* Trivial case: No key positions at all. */ printf (" return %s;\n", _hash_includes_len ? "len" : "0"); } else { /* Iterate through the key positions. Remember that Positions::sort() has sorted them in decreasing order, with Positions::LASTCHAR coming last. */ PositionIterator iter = _key_positions.iterator(_max_key_len); int key_pos; /* Get the highest key position. */ key_pos = iter.next (); if (key_pos == Positions::LASTCHAR || key_pos < _min_key_len) { /* We can perform additional optimizations here: Write it out as a single expression. Note that the values are added as 'int's even though the asso_values array may contain 'unsigned char's or 'unsigned short's. */ printf (" return %s", _hash_includes_len ? "len + " : ""); if (_key_positions.get_size() == 2 && _key_positions[0] == 0 && _key_positions[1] == Positions::LASTCHAR) /* Optimize special case of "-k 1,$". */ { output_asso_values_ref (Positions::LASTCHAR); printf (" + "); output_asso_values_ref (0); } else { for (; key_pos != Positions::LASTCHAR; ) { output_asso_values_ref (key_pos); if ((key_pos = iter.next ()) != PositionIterator::EOS) printf (" + "); else break; } if (key_pos == Positions::LASTCHAR) output_asso_values_ref (Positions::LASTCHAR); } printf (";\n"); } else { /* We've got to use the correct, but brute force, technique. */ /* Pseudo-statement or comment that avoids a compiler warning or lint warning. */ const char * const fallthrough_marker = "#if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9)))\n" " [[fallthrough]];\n" "#elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10)\n" " __attribute__ ((__fallthrough__));\n" "#endif\n" " /*FALLTHROUGH*/\n"; /* It doesn't really matter whether hval is an 'int' or 'unsigned int', but 'unsigned int' gives fewer warnings. */ printf (" %sunsigned int hval = %s;\n\n" " switch (%s)\n" " {\n" " default:\n", register_scs, _hash_includes_len ? "len" : "0", _hash_includes_len ? "hval" : "len"); while (key_pos != Positions::LASTCHAR && key_pos >= _max_key_len) if ((key_pos = iter.next ()) == PositionIterator::EOS) break; if (key_pos != PositionIterator::EOS && key_pos != Positions::LASTCHAR) { int i = key_pos; do { if (i > key_pos) printf ("%s", fallthrough_marker); for ( ; i > key_pos; i--) printf (" case %d:\n", i); printf (" hval += "); output_asso_values_ref (key_pos); printf (";\n"); key_pos = iter.next (); } while (key_pos != PositionIterator::EOS && key_pos != Positions::LASTCHAR); if (i >= _min_key_len) printf ("%s", fallthrough_marker); for ( ; i >= _min_key_len; i--) printf (" case %d:\n", i); } printf (" break;\n" " }\n" " return hval"); if (key_pos == Positions::LASTCHAR) { printf (" + "); output_asso_values_ref (Positions::LASTCHAR); } printf (";\n"); } } printf ("}\n\n"); } /* ------------------------------------------------------------------------- */ /* Prints out a table of keyword lengths, for use with the comparison code in generated function 'in_word_set'. Only called if option[LENTABLE]. */ void Output::output_keylength_table () const { const int columns = 14; const char * const indent = option[GLOBAL] ? "" : " "; printf ("%sstatic %s%s %s[] =\n" "%s {", indent, const_readonly_array, smallest_integral_type (_max_key_len), option.get_lengthtable_name (), indent); /* Generate an array of lengths, similar to output_keyword_table. */ int index; int column; KeywordExt_List *temp; column = 0; for (temp = _head, index = 0; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* If generating a switch statement, and there is no user defined type, we generate non-duplicates directly in the code. Only duplicates go into the table. */ if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link) continue; if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP]) { /* Some blank entries. */ for ( ; index < keyword->_hash_value; index++) { if (index > 0) printf (","); if ((column++ % columns) == 0) printf ("\n%s ", indent); printf ("%3d", 0); } } if (index > 0) printf (","); if ((column++ % columns) == 0) printf("\n%s ", indent); printf ("%3d", keyword->_allchars_length); index++; /* Deal with duplicates specially. */ if (keyword->_duplicate_link) // implies option[DUP] for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link) { printf (","); if ((column++ % columns) == 0) printf("\n%s ", indent); printf ("%3d", links->_allchars_length); index++; } } printf ("\n%s };\n", indent); if (option[GLOBAL]) printf ("\n"); } /* ------------------------------------------------------------------------- */ /* Prints out the string pool, containing the strings of the keyword table. Only called if option[SHAREDLIB]. */ void Output::output_string_pool () const { const char * const indent = option[TYPE] || option[GLOBAL] ? "" : " "; int index; KeywordExt_List *temp; printf ("%sstruct %s_t\n" "%s {\n", indent, option.get_stringpool_name (), indent); for (temp = _head, index = 0; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* If generating a switch statement, and there is no user defined type, we generate non-duplicates directly in the code. Only duplicates go into the table. */ if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link) continue; if (!option[SWITCH] && !option[DUP]) index = keyword->_hash_value; printf ("%s char %s_str%d[sizeof(", indent, option.get_stringpool_name (), index); output_string (keyword->_allchars, keyword->_allchars_length); printf (")];\n"); /* Deal with duplicates specially. */ if (keyword->_duplicate_link) // implies option[DUP] for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link) if (!(links->_allchars_length == keyword->_allchars_length && memcmp (links->_allchars, keyword->_allchars, keyword->_allchars_length) == 0)) { index++; printf ("%s char %s_str%d[sizeof(", indent, option.get_stringpool_name (), index); output_string (links->_allchars, links->_allchars_length); printf (")];\n"); } index++; } printf ("%s };\n", indent); printf ("%sstatic %sstruct %s_t %s_contents =\n" "%s {\n", indent, const_readonly_array, option.get_stringpool_name (), option.get_stringpool_name (), indent); for (temp = _head, index = 0; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* If generating a switch statement, and there is no user defined type, we generate non-duplicates directly in the code. Only duplicates go into the table. */ if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link) continue; if (index > 0) printf (",\n"); if (!option[SWITCH] && !option[DUP]) index = keyword->_hash_value; printf ("%s ", indent); output_string (keyword->_allchars, keyword->_allchars_length); /* Deal with duplicates specially. */ if (keyword->_duplicate_link) // implies option[DUP] for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link) if (!(links->_allchars_length == keyword->_allchars_length && memcmp (links->_allchars, keyword->_allchars, keyword->_allchars_length) == 0)) { index++; printf (",\n"); printf ("%s ", indent); output_string (links->_allchars, links->_allchars_length); } index++; } if (index > 0) printf ("\n"); printf ("%s };\n", indent); printf ("%s#define %s ((%schar *) &%s_contents)\n", indent, option.get_stringpool_name (), const_always, option.get_stringpool_name ()); if (option[GLOBAL]) printf ("\n"); } /* ------------------------------------------------------------------------- */ static void output_keyword_entry (KeywordExt *temp, int stringpool_index, const char *indent, bool is_duplicate) { if (option[TYPE]) output_line_directive (temp->_lineno); printf ("%s ", indent); if (option[TYPE]) printf ("{"); if (option[SHAREDLIB]) /* How to determine a certain offset in stringpool at compile time? - The standard way would be to use the 'offsetof' macro. But it is only defined in , and is not among the prerequisite header files that the user must #include. - The next best way would be to take the address and cast to 'intptr_t' or 'uintptr_t'. But these types are only defined in , and is not among the prerequisite header files that the user must #include. - The next best approximation of 'uintptr_t' is 'size_t'. It is defined in the prerequisite header . - The types 'long' and 'unsigned long' do work as well, but on 64-bit native Windows platforms, they don't have the same size as pointers and therefore generate warnings. */ printf ("(int)(size_t)&((struct %s_t *)0)->%s_str%d", option.get_stringpool_name (), option.get_stringpool_name (), stringpool_index); else output_string (temp->_allchars, temp->_allchars_length); if (option[TYPE]) { if (strlen (temp->_rest) > 0) printf (",%s", temp->_rest); printf ("}"); } if (option[DEBUG]) { printf (" /* "); if (is_duplicate) printf ("hash value duplicate, "); else printf ("hash value = %d, ", temp->_hash_value); printf ("index = %d */", temp->_final_index); } } static void output_keyword_blank_entries (int count, const char *indent) { int columns; if (option[TYPE]) { columns = 58 / (4 + (option[SHAREDLIB] ? 2 : option[NULLSTRINGS] ? 8 : 2) + strlen (option.get_initializer_suffix())); if (columns == 0) columns = 1; } else { columns = (option[SHAREDLIB] ? 9 : option[NULLSTRINGS] ? 4 : 9); } int column = 0; for (int i = 0; i < count; i++) { if ((column % columns) == 0) { if (i > 0) printf (",\n"); printf ("%s ", indent); } else { if (i > 0) printf (", "); } if (option[TYPE]) printf ("{"); if (option[SHAREDLIB]) printf ("-1"); else { if (option[NULLSTRINGS]) printf ("(char*)0"); else printf ("\"\""); } if (option[TYPE]) printf ("%s}", option.get_initializer_suffix()); column++; } } /* Prints out the array containing the keywords for the hash function. */ void Output::output_keyword_table () const { const char *indent = option[GLOBAL] ? "" : " "; int index; KeywordExt_List *temp; /* Avoid compiler warnings "warning: missing initializer for field ..." for each of the blank entries. */ bool silence_missing_initializer_warning = option[TYPE] && !option.has_initializer_suffix(); const char *preprocessor_condition = "(defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3)"; if (silence_missing_initializer_warning) { printf ("#if %s\n", preprocessor_condition); printf ("#pragma GCC diagnostic push\n"); printf ("#pragma GCC diagnostic ignored \"-Wmissing-field-initializers\"\n"); printf ("#endif\n"); } printf ("%sstatic ", indent); output_const_type (const_readonly_array, _wordlist_eltype); printf ("%s[] =\n" "%s {\n", option.get_wordlist_name (), indent); /* Generate an array of reserved words at appropriate locations. */ for (temp = _head, index = 0; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* If generating a switch statement, and there is no user defined type, we generate non-duplicates directly in the code. Only duplicates go into the table. */ if (option[SWITCH] && !option[TYPE] && !keyword->_duplicate_link) continue; if (index > 0) printf (",\n"); if (index < keyword->_hash_value && !option[SWITCH] && !option[DUP]) { /* Some blank entries. */ output_keyword_blank_entries (keyword->_hash_value - index, indent); printf (",\n"); index = keyword->_hash_value; } keyword->_final_index = index; output_keyword_entry (keyword, index, indent, false); /* Deal with duplicates specially. */ if (keyword->_duplicate_link) // implies option[DUP] for (KeywordExt *links = keyword->_duplicate_link; links; links = links->_duplicate_link) { links->_final_index = ++index; printf (",\n"); int stringpool_index = (links->_allchars_length == keyword->_allchars_length && memcmp (links->_allchars, keyword->_allchars, keyword->_allchars_length) == 0 ? keyword->_final_index : links->_final_index); output_keyword_entry (links, stringpool_index, indent, true); } index++; } if (index > 0) printf ("\n"); printf ("%s };\n", indent); if (silence_missing_initializer_warning) { printf ("#if %s\n", preprocessor_condition); printf ("#pragma GCC diagnostic pop\n"); printf ("#endif\n"); } printf ("\n"); } /* ------------------------------------------------------------------------- */ /* Generates the large, sparse table that maps hash values into the smaller, contiguous range of the keyword table. */ void Output::output_lookup_array () const { if (option[DUP]) { const int DEFAULT_VALUE = -1; /* Because of the way output_keyword_table works, every duplicate set is stored contiguously in the wordlist array. */ struct duplicate_entry { int hash_value; /* Hash value for this particular duplicate set. */ int index; /* Index into the main keyword storage array. */ int count; /* Number of consecutive duplicates at this index. */ }; duplicate_entry *duplicates = new duplicate_entry[_total_duplicates]; int *lookup_array = new int[_max_hash_value + 1 + 2*_total_duplicates]; int lookup_array_size = _max_hash_value + 1; duplicate_entry *dup_ptr = &duplicates[0]; int *lookup_ptr = &lookup_array[_max_hash_value + 1 + 2*_total_duplicates]; while (lookup_ptr > lookup_array) *--lookup_ptr = DEFAULT_VALUE; /* Now dup_ptr = &duplicates[0] and lookup_ptr = &lookup_array[0]. */ for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { int hash_value = temp->first()->_hash_value; lookup_array[hash_value] = temp->first()->_final_index; if (option[DEBUG]) fprintf (stderr, "keyword = %.*s, index = %d\n", temp->first()->_allchars_length, temp->first()->_allchars, temp->first()->_final_index); if (temp->first()->_duplicate_link) { /* Start a duplicate entry. */ dup_ptr->hash_value = hash_value; dup_ptr->index = temp->first()->_final_index; dup_ptr->count = 1; for (KeywordExt *ptr = temp->first()->_duplicate_link; ptr; ptr = ptr->_duplicate_link) { dup_ptr->count++; if (option[DEBUG]) fprintf (stderr, "static linked keyword = %.*s, index = %d\n", ptr->_allchars_length, ptr->_allchars, ptr->_final_index); } assert (dup_ptr->count >= 2); dup_ptr++; } } while (dup_ptr > duplicates) { dup_ptr--; if (option[DEBUG]) fprintf (stderr, "dup_ptr[%lu]: hash_value = %d, index = %d, count = %d\n", static_cast(dup_ptr - duplicates), dup_ptr->hash_value, dup_ptr->index, dup_ptr->count); int i; /* Start searching for available space towards the right part of the lookup array. */ for (i = dup_ptr->hash_value; i < lookup_array_size-1; i++) if (lookup_array[i] == DEFAULT_VALUE && lookup_array[i + 1] == DEFAULT_VALUE) goto found_i; /* If we didn't find it to the right look to the left instead... */ for (i = dup_ptr->hash_value-1; i >= 0; i--) if (lookup_array[i] == DEFAULT_VALUE && lookup_array[i + 1] == DEFAULT_VALUE) goto found_i; /* Append to the end of lookup_array. */ i = lookup_array_size; lookup_array_size += 2; found_i: /* Put in an indirection from dup_ptr->_hash_value to i. At i and i+1 store dup_ptr->_final_index and dup_ptr->count. */ assert (lookup_array[dup_ptr->hash_value] == dup_ptr->index); lookup_array[dup_ptr->hash_value] = - 1 - _total_keys - i; lookup_array[i] = - _total_keys + dup_ptr->index; lookup_array[i + 1] = - dup_ptr->count; /* All these three values are <= -2, distinct from DEFAULT_VALUE. */ } /* The values of the lookup array are now known. */ int min = INT_MAX; int max = INT_MIN; lookup_ptr = lookup_array + lookup_array_size; while (lookup_ptr > lookup_array) { int val = *--lookup_ptr; if (min > val) min = val; if (max < val) max = val; } const char *indent = option[GLOBAL] ? "" : " "; printf ("%sstatic %s%s lookup[] =\n" "%s {", indent, const_readonly_array, smallest_integral_type (min, max), indent); int field_width; /* Calculate maximum number of digits required for MIN..MAX. */ { field_width = 2; for (int trunc = max; (trunc /= 10) > 0;) field_width++; } if (min < 0) { int neg_field_width = 2; for (int trunc = -min; (trunc /= 10) > 0;) neg_field_width++; neg_field_width++; /* account for the minus sign */ if (field_width < neg_field_width) field_width = neg_field_width; } const int columns = 42 / field_width; int column; column = 0; for (int i = 0; i < lookup_array_size; i++) { if (i > 0) printf (","); if ((column++ % columns) == 0) printf("\n%s ", indent); printf ("%*d", field_width, lookup_array[i]); } printf ("\n%s };\n\n", indent); delete[] duplicates; delete[] lookup_array; } } /* ------------------------------------------------------------------------- */ /* Generate all pools needed for the lookup function. */ void Output::output_lookup_pools () const { if (option[SWITCH]) { if (option[TYPE] || (option[DUP] && _total_duplicates > 0)) output_string_pool (); } else { output_string_pool (); } } /* Generate all the tables needed for the lookup function. */ void Output::output_lookup_tables () const { if (option[SWITCH]) { /* Use the switch in place of lookup table. */ if (option[LENTABLE] && (option[DUP] && _total_duplicates > 0)) output_keylength_table (); if (option[TYPE] || (option[DUP] && _total_duplicates > 0)) output_keyword_table (); } else { /* Use the lookup table, in place of switch. */ if (option[LENTABLE]) output_keylength_table (); output_keyword_table (); output_lookup_array (); } } /* ------------------------------------------------------------------------- */ /* Output a single switch case (including duplicates). Advance list. */ static KeywordExt_List * output_switch_case (KeywordExt_List *list, int indent, int *jumps_away) { if (option[DEBUG]) printf ("%*s/* hash value = %4d, keyword = \"%.*s\" */\n", indent, "", list->first()->_hash_value, list->first()->_allchars_length, list->first()->_allchars); if (option[DUP] && list->first()->_duplicate_link) { if (option[LENTABLE]) printf ("%*slengthptr = &%s[%d];\n", indent, "", option.get_lengthtable_name (), list->first()->_final_index); printf ("%*swordptr = &%s[%d];\n", indent, "", option.get_wordlist_name (), list->first()->_final_index); int count = 0; for (KeywordExt *links = list->first(); links; links = links->_duplicate_link) count++; printf ("%*swordendptr = wordptr + %d;\n" "%*sgoto multicompare;\n", indent, "", count, indent, ""); *jumps_away = 1; } else { if (option[LENTABLE]) { printf ("%*sif (len == %d)\n" "%*s {\n", indent, "", list->first()->_allchars_length, indent, ""); indent += 4; } printf ("%*sresword = ", indent, ""); if (option[TYPE]) printf ("&%s[%d]", option.get_wordlist_name (), list->first()->_final_index); else output_string (list->first()->_allchars, list->first()->_allchars_length); printf (";\n"); printf ("%*sgoto compare;\n", indent, ""); if (option[LENTABLE]) { indent -= 4; printf ("%*s }\n", indent, ""); } else *jumps_away = 1; } return list->rest(); } /* Output a total of size cases, grouped into num_switches switch statements, where 0 < num_switches <= size. */ static void output_switches (KeywordExt_List *list, int num_switches, int size, int min_hash_value, int max_hash_value, int indent) { if (option[DEBUG]) printf ("%*s/* know %d <= key <= %d, contains %d cases */\n", indent, "", min_hash_value, max_hash_value, size); if (num_switches > 1) { int part1 = num_switches / 2; int part2 = num_switches - part1; int size1 = static_cast(static_cast(size) / static_cast(num_switches) * static_cast(part1) + 0.5); int size2 = size - size1; KeywordExt_List *temp = list; for (int count = size1; count > 0; count--) temp = temp->rest(); printf ("%*sif (key < %d)\n" "%*s {\n", indent, "", temp->first()->_hash_value, indent, ""); output_switches (list, part1, size1, min_hash_value, temp->first()->_hash_value-1, indent+4); printf ("%*s }\n" "%*selse\n" "%*s {\n", indent, "", indent, "", indent, ""); output_switches (temp, part2, size2, temp->first()->_hash_value, max_hash_value, indent+4); printf ("%*s }\n", indent, ""); } else { /* Output a single switch. */ int lowest_case_value = list->first()->_hash_value; if (size == 1) { int jumps_away = 0; assert (min_hash_value <= lowest_case_value); assert (lowest_case_value <= max_hash_value); if (min_hash_value == max_hash_value) output_switch_case (list, indent, &jumps_away); else { printf ("%*sif (key == %d)\n" "%*s {\n", indent, "", lowest_case_value, indent, ""); output_switch_case (list, indent+4, &jumps_away); printf ("%*s }\n", indent, ""); } } else { if (lowest_case_value == 0) printf ("%*sswitch (key)\n", indent, ""); else printf ("%*sswitch (key - %d)\n", indent, "", lowest_case_value); printf ("%*s {\n", indent, ""); for (; size > 0; size--) { int jumps_away = 0; printf ("%*s case %d:\n", indent, "", list->first()->_hash_value - lowest_case_value); list = output_switch_case (list, indent+6, &jumps_away); if (!jumps_away) printf ("%*s break;\n", indent, ""); } printf ("%*s }\n", indent, ""); } } } /* Generates C code to perform the keyword lookup. */ void Output::output_lookup_function_body (const Output_Compare& comparison) const { /* An expression equivalent to NULL, of type _return_type. We don't use plain "0", because that would trigger a gcc 15 warning if the warning option -Wzero-as-null-pointer-constant is in use. In C++, using "nullptr" if __cplusplus >= 201103L would be possible, but is not worth the trouble. */ char *null_expression = new char[17 + strlen (_return_type) + 1]; if (option[CPLUSPLUS]) sprintf (null_expression, "static_cast<%s> (0)", _return_type); else sprintf (null_expression, "(%s) 0", _return_type); printf (" if (len <= %sMAX_WORD_LENGTH && len >= %sMIN_WORD_LENGTH)\n" " {\n" " %sunsigned int key = %s (str, len);\n\n", option.get_constants_prefix (), option.get_constants_prefix (), register_scs, option.get_hash_name ()); if (option[SWITCH]) { int switch_size = num_hash_values (); int num_switches = option.get_total_switches (); if (num_switches > switch_size) num_switches = switch_size; printf (" if (key <= %sMAX_HASH_VALUE", option.get_constants_prefix ()); if (_min_hash_value > 0) printf (" && key >= %sMIN_HASH_VALUE", option.get_constants_prefix ()); printf (")\n" " {\n"); if (option[DUP] && _total_duplicates > 0) { if (option[LENTABLE]) printf (" %s%s%s *lengthptr;\n", register_scs, const_always, smallest_integral_type (_max_key_len)); printf (" %s", register_scs); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordptr;\n"); printf (" %s", register_scs); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordendptr;\n"); } if (option[TYPE]) { printf (" %s", register_scs); output_const_type (const_readonly_array, _struct_tag); printf ("*resword;\n\n"); } else printf (" %s%sresword;\n\n", register_scs, _struct_tag); output_switches (_head, num_switches, switch_size, _min_hash_value, _max_hash_value, 10); printf (" return %s;\n", null_expression); if (option[DUP] && _total_duplicates > 0) { int indent = 8; printf ("%*smulticompare:\n" "%*s while (wordptr < wordendptr)\n" "%*s {\n", indent, "", indent, "", indent, ""); if (option[LENTABLE]) { printf ("%*s if (len == *lengthptr)\n" "%*s {\n", indent, "", indent, ""); indent += 4; } printf ("%*s %s%schar *s = ", indent, "", register_scs, const_always); if (option[TYPE]) printf ("wordptr->%s", option.get_slot_name ()); else printf ("*wordptr"); if (option[SHAREDLIB]) printf (" + %s", option.get_stringpool_name ()); printf (";\n\n" "%*s if (", indent, ""); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); printf (")\n" "%*s return %s;\n", indent, "", option[TYPE] ? "wordptr" : "s"); if (option[LENTABLE]) { indent -= 4; printf ("%*s }\n", indent, ""); } if (option[LENTABLE]) printf ("%*s lengthptr++;\n", indent, ""); printf ("%*s wordptr++;\n" "%*s }\n" "%*s return %s;\n", indent, "", indent, "", indent, "", null_expression); } printf (" compare:\n"); if (option[TYPE]) { printf (" {\n" " %s%schar *s = resword->%s", register_scs, const_always, option.get_slot_name ()); if (option[SHAREDLIB]) printf (" + %s", option.get_stringpool_name ()); printf (";\n\n" " if ("); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); printf (")\n" " return resword;\n" " }\n"); } else { printf (" if ("); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("resword")); printf (")\n" " return resword;\n"); } printf (" }\n"); } else { printf (" if (key <= %sMAX_HASH_VALUE)\n", option.get_constants_prefix ()); if (option[DUP]) { int indent = 8; printf ("%*s{\n" "%*s %sint index = lookup[key];\n\n" "%*s if (index >= 0)\n", indent, "", indent, "", register_scs, indent, ""); if (option[LENTABLE]) { printf ("%*s {\n" "%*s if (len == %s[index])\n", indent, "", indent, "", option.get_lengthtable_name ()); indent += 4; } printf ("%*s {\n" "%*s %s%schar *s = %s[index]", indent, "", indent, "", register_scs, const_always, option.get_wordlist_name ()); if (option[TYPE]) printf (".%s", option.get_slot_name ()); if (option[SHAREDLIB]) printf (" + %s", option.get_stringpool_name ()); printf (";\n\n" "%*s if (", indent, ""); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); printf (")\n" "%*s return ", indent, ""); if (option[TYPE]) printf ("&%s[index]", option.get_wordlist_name ()); else printf ("s"); printf (";\n" "%*s }\n", indent, ""); if (option[LENTABLE]) { indent -= 4; printf ("%*s }\n", indent, ""); } if (_total_duplicates > 0) { printf ("%*s else if (index < -%sTOTAL_KEYWORDS)\n" "%*s {\n" "%*s %sint offset = - 1 - %sTOTAL_KEYWORDS - index;\n", indent, "", option.get_constants_prefix (), indent, "", indent, "", register_scs, option.get_constants_prefix ()); if (option[LENTABLE]) printf ("%*s %s%s%s *lengthptr = &%s[%sTOTAL_KEYWORDS + lookup[offset]];\n", indent, "", register_scs, const_always, smallest_integral_type (_max_key_len), option.get_lengthtable_name (), option.get_constants_prefix ()); printf ("%*s %s", indent, "", register_scs); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordptr = &%s[%sTOTAL_KEYWORDS + lookup[offset]];\n", option.get_wordlist_name (), option.get_constants_prefix ()); printf ("%*s %s", indent, "", register_scs); output_const_type (const_readonly_array, _wordlist_eltype); printf ("*wordendptr = wordptr + -lookup[offset + 1];\n\n"); printf ("%*s while (wordptr < wordendptr)\n" "%*s {\n", indent, "", indent, ""); if (option[LENTABLE]) { printf ("%*s if (len == *lengthptr)\n" "%*s {\n", indent, "", indent, ""); indent += 4; } printf ("%*s %s%schar *s = ", indent, "", register_scs, const_always); if (option[TYPE]) printf ("wordptr->%s", option.get_slot_name ()); else printf ("*wordptr"); if (option[SHAREDLIB]) printf (" + %s", option.get_stringpool_name ()); printf (";\n\n" "%*s if (", indent, ""); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); printf (")\n" "%*s return %s;\n", indent, "", option[TYPE] ? "wordptr" : "s"); if (option[LENTABLE]) { indent -= 4; printf ("%*s }\n", indent, ""); } if (option[LENTABLE]) printf ("%*s lengthptr++;\n", indent, ""); printf ("%*s wordptr++;\n" "%*s }\n" "%*s }\n", indent, "", indent, "", indent, ""); } printf ("%*s}\n", indent, ""); } else { int indent = 8; if (option[LENTABLE]) { printf ("%*sif (len == %s[key])\n", indent, "", option.get_lengthtable_name ()); indent += 2; } if (option[SHAREDLIB]) { if (!option[LENTABLE]) { printf ("%*s{\n" "%*s %sint o = %s[key]", indent, "", indent, "", register_scs, option.get_wordlist_name ()); if (option[TYPE]) printf (".%s", option.get_slot_name ()); printf (";\n" "%*s if (o >= 0)\n" "%*s {\n", indent, "", indent, ""); indent += 4; printf ("%*s %s%schar *s = o", indent, "", register_scs, const_always); } else { /* No need for the (o >= 0) test, because the (len == lengthtable[key]) test already guarantees that key points to nonempty table entry. */ printf ("%*s{\n" "%*s %s%schar *s = %s[key]", indent, "", indent, "", register_scs, const_always, option.get_wordlist_name ()); if (option[TYPE]) printf (".%s", option.get_slot_name ()); } printf (" + %s", option.get_stringpool_name ()); } else { printf ("%*s{\n" "%*s %s%schar *s = %s[key]", indent, "", indent, "", register_scs, const_always, option.get_wordlist_name ()); if (option[TYPE]) printf (".%s", option.get_slot_name ()); } printf (";\n\n" "%*s if (", indent, ""); if (!option[SHAREDLIB] && option[NULLSTRINGS]) printf ("s && "); comparison.output_comparison (Output_Expr1 ("str"), Output_Expr1 ("s")); printf (")\n" "%*s return ", indent, ""); if (option[TYPE]) printf ("&%s[key]", option.get_wordlist_name ()); else printf ("s"); printf (";\n"); if (option[SHAREDLIB] && !option[LENTABLE]) { indent -= 4; printf ("%*s }\n", indent, ""); } printf ("%*s}\n", indent, ""); } } printf (" }\n" " return %s;\n", null_expression); delete[] null_expression; } /* Generates C code for the lookup function. */ void Output::output_lookup_function () const { /* Output the function's head. */ /* We don't declare the lookup function 'static' because we cannot make assumptions about the compilation units of the user. Since we don't make it 'static', it makes no sense to declare it 'inline', because non-static inline functions must not reference static functions or variables, see ISO C 99 section 6.7.4.(3). */ printf ("%s%s\n", const_for_struct, _return_type); if (option[CPLUSPLUS]) printf ("%s::", option.get_class_name ()); printf ("%s ", option.get_function_name ()); printf (option[KRC] ? "(str, len)\n" " %schar *str;\n" " %ssize_t len;\n" : option[C] ? "(str, len)\n" " %sconst char *str;\n" " %ssize_t len;\n" : option[ANSIC] | option[CPLUSPLUS] ? "(%sconst char *str, %ssize_t len)\n" : "", register_scs, register_scs); /* Output the function's body. */ printf ("{\n"); if (option[ENUM] && !option[GLOBAL]) { Output_Enum style (" "); output_constants (style); } if (option[SHAREDLIB] && !(option[GLOBAL] || option[TYPE])) output_lookup_pools (); if (!option[GLOBAL]) output_lookup_tables (); if (option[LENTABLE]) output_lookup_function_body (Output_Compare_Memcmp ()); else { if (option[COMP]) output_lookup_function_body (Output_Compare_Strncmp ()); else output_lookup_function_body (Output_Compare_Strcmp ()); } printf ("}\n"); } /* ------------------------------------------------------------------------- */ /* Generates the hash function and the key word recognizer function based upon the user's Options. */ void Output::output () { compute_min_max (); if (option[CPLUSPLUS]) /* The 'register' keyword is removed from C++17. See http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4340 */ register_scs = ""; else register_scs = "register "; if (option[C] | option[ANSIC] | option[CPLUSPLUS]) { const_always = "const "; const_readonly_array = (option[CONST] ? "const " : ""); const_for_struct = ((option[CONST] && option[TYPE]) ? "const " : ""); } else { const_always = ""; const_readonly_array = ""; const_for_struct = ""; } if (!option[TYPE]) { _return_type = (const_always[0] ? "const char *" : "char *"); _struct_tag = (const_always[0] ? "const char *" : "char *"); } _wordlist_eltype = (option[SHAREDLIB] && !option[TYPE] ? "int" : _struct_tag); printf ("/* "); if (option[KRC]) printf ("KR-C"); else if (option[C]) printf ("C"); else if (option[ANSIC]) printf ("ANSI-C"); else if (option[CPLUSPLUS]) printf ("C++"); printf (" code produced by gperf version %s */\n", version_string); option.print_options (); printf ("\n"); if (!option[POSITIONS]) { printf ("/* Computed positions: -k'"); _key_positions.print(); printf ("' */\n"); } printf ("\n"); if (_charset_dependent && (_key_positions.get_size() > 0 || option[UPPERLOWER])) { /* The generated tables assume that the execution character set is based on ISO-646, not EBCDIC. */ printf ("#if !((' ' == 32) && ('!' == 33) && ('\"' == 34) && ('#' == 35) \\\n" " && ('%%' == 37) && ('&' == 38) && ('\\'' == 39) && ('(' == 40) \\\n" " && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \\\n" " && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \\\n" " && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \\\n" " && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \\\n" " && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \\\n" " && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \\\n" " && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \\\n" " && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \\\n" " && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \\\n" " && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \\\n" " && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \\\n" " && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \\\n" " && ('Z' == 90) && ('[' == 91) && ('\\\\' == 92) && (']' == 93) \\\n" " && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \\\n" " && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \\\n" " && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \\\n" " && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \\\n" " && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \\\n" " && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \\\n" " && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \\\n" " && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))\n" "/* The character set is not based on ISO-646. */\n"); printf ("%s \"gperf generated tables don't work with this execution character set. Please report a bug to .\"\n", option[KRC] || option[C] ? "error" : "#error"); printf ("#endif\n\n"); } if (_verbatim_declarations < _verbatim_declarations_end) { output_line_directive (_verbatim_declarations_lineno); fwrite (_verbatim_declarations, 1, _verbatim_declarations_end - _verbatim_declarations, stdout); } if (option[TYPE] && !option[NOTYPE]) /* Output type declaration now, reference it later on.... */ { output_line_directive (_struct_decl_lineno); printf ("%s\n", _struct_decl); } if (option[INCLUDE]) printf ("#include \n"); /* Declare strlen(), strcmp(), strncmp(). */ if (!option[ENUM]) { Output_Defines style; output_constants (style); } else if (option[GLOBAL]) { Output_Enum style (""); output_constants (style); } printf ("/* maximum key range = %d, duplicates = %d */\n\n", _max_hash_value - _min_hash_value + 1, _total_duplicates); if (option[UPPERLOWER]) { #if USE_DOWNCASE_TABLE output_upperlower_table (); #endif if (option[LENTABLE]) output_upperlower_memcmp (); else { if (option[COMP]) output_upperlower_strncmp (); else output_upperlower_strcmp (); } } if (option[CPLUSPLUS]) printf ("class %s\n" "{\n" "private:\n" " static inline unsigned int %s (const char *str, size_t len);\n" "public:\n" " static %s%s%s (const char *str, size_t len);\n" "};\n" "\n", option.get_class_name (), option.get_hash_name (), const_for_struct, _return_type, option.get_function_name ()); output_hash_function (); if (option[SHAREDLIB] && (option[GLOBAL] || option[TYPE])) output_lookup_pools (); if (option[GLOBAL]) output_lookup_tables (); output_lookup_function (); if (_verbatim_code < _verbatim_code_end) { output_line_directive (_verbatim_code_lineno); fwrite (_verbatim_code, 1, _verbatim_code_end - _verbatim_code, stdout); } fflush (stdout); } gperf-3.2.1/src/version.cc0000664000000000000000000000201014776760447011053 /* Current program version number. Copyright (C) 1989-1998, 2000, 2002-2003, 2005, 2007, 2009, 2022, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "version.h" /* Current release version. */ const char *version_string = "3.2.1"; gperf-3.2.1/src/keyword.icc0000664000000000000000000000300713347736260011217 /* Inline Functions for keyword.{h,cc}. Copyright (C) 1989-1998, 2000, 2002, 2017 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* ----------------------------- Keyword class ----------------------------- */ /* Constructor. */ INLINE Keyword::Keyword (const char *allchars, int allchars_length, const char *rest, unsigned int lineno) : _allchars (allchars), _allchars_length (allchars_length), _rest (rest), _lineno (lineno) { } /* --------------------------- KeywordExt class --------------------------- */ /* Constructor. */ INLINE KeywordExt::KeywordExt (const char *allchars, int allchars_length, const char *rest, unsigned int lineno) : Keyword (allchars, allchars_length, rest, lineno), _final_index (-1) { } gperf-3.2.1/src/positions.icc0000664000000000000000000001462113347736263011571 /* Inline Functions for positions.{h,cc}. Copyright (C) 1989-1998, 2000, 2002-2003 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // This needs: //#include /* ---------------------------- Class Positions ---------------------------- */ /* Constructors. */ INLINE Positions::Positions () : _useall (false), _size (0) { } INLINE Positions::Positions (int pos1) : _useall (false), _size (1) { _positions[0] = pos1; } INLINE Positions::Positions (int pos1, int pos2) : _useall (false), _size (2) { _positions[0] = pos1; _positions[1] = pos2; } /* Copy constructor. */ INLINE Positions::Positions (const Positions& src) : _useall (src._useall), _size (src._size) { memcpy (_positions, src._positions, _size * sizeof (_positions[0])); } /* Assignment operator. */ INLINE Positions& Positions::operator= (const Positions& src) { _useall = src._useall; _size = src._size; memcpy (_positions, src._positions, _size * sizeof (_positions[0])); return *this; } /* Accessors. */ INLINE bool Positions::is_useall () const { return _useall; } INLINE int Positions::operator[] (unsigned int index) const { return _positions[index]; } INLINE unsigned int Positions::get_size () const { return _size; } /* Write access. */ INLINE void Positions::set_useall (bool useall) { _useall = useall; if (useall) { /* The positions are 0, 1, ..., MAX_KEY_POS-1, in descending order. */ _size = MAX_KEY_POS; int *ptr = _positions; for (int i = MAX_KEY_POS - 1; i >= 0; i--) *ptr++ = i; } } INLINE int * Positions::pointer () { return _positions; } INLINE void Positions::set_size (unsigned int size) { _size = size; } /* Sorts the array in reverse order. Returns true if there are no duplicates, false otherwise. */ INLINE bool Positions::sort () { if (_useall) return true; /* Bubble sort. */ bool duplicate_free = true; int *base = _positions; unsigned int len = _size; for (unsigned int i = 1; i < len; i++) { unsigned int j; int tmp; for (j = i, tmp = base[j]; j > 0 && tmp >= base[j - 1]; j--) if ((base[j] = base[j - 1]) == tmp) /* oh no, a duplicate!!! */ duplicate_free = false; base[j] = tmp; } return duplicate_free; } /* Creates an iterator, returning the positions in descending order. */ INLINE PositionIterator Positions::iterator () const { return PositionIterator (*this); } /* Creates an iterator, returning the positions in descending order, that apply to strings of length <= maxlen. */ INLINE PositionIterator Positions::iterator (int maxlen) const { return PositionIterator (*this, maxlen); } /* Creates an iterator, returning the positions in ascending order. */ INLINE PositionReverseIterator Positions::reviterator () const { return PositionReverseIterator (*this); } /* Creates an iterator, returning the positions in ascending order, that apply to strings of length <= maxlen. */ INLINE PositionReverseIterator Positions::reviterator (int maxlen) const { return PositionReverseIterator (*this, maxlen); } /* ------------------------- Class PositionIterator ------------------------ */ /* Initializes an iterator through POSITIONS. */ INLINE PositionIterator::PositionIterator (Positions const& positions) : _set (positions), _index (0) { } /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ INLINE PositionIterator::PositionIterator (Positions const& positions, int maxlen) : _set (positions) { if (positions._useall) _index = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0); else { unsigned int index; for (index = 0; index < positions._size && positions._positions[index] >= maxlen; index++) ; _index = index; } } /* Retrieves the next position, or EOS past the end. */ INLINE int PositionIterator::next () { return (_index < _set._size ? _set._positions[_index++] : EOS); } /* Returns the number of remaining positions, i.e. how often next() will return a value != EOS. */ INLINE unsigned int PositionIterator::remaining () const { return _set._size - _index; } /* Copy constructor. */ INLINE PositionIterator::PositionIterator (const PositionIterator& src) : _set (src._set), _index (src._index) { } /* --------------------- Class PositionReverseIterator --------------------- */ /* Initializes an iterator through POSITIONS. */ INLINE PositionReverseIterator::PositionReverseIterator (Positions const& positions) : _set (positions), _index (_set._size), _minindex (0) { } /* Initializes an iterator through POSITIONS, ignoring positions >= maxlen. */ INLINE PositionReverseIterator::PositionReverseIterator (Positions const& positions, int maxlen) : _set (positions), _index (_set._size) { if (positions._useall) _minindex = (maxlen <= Positions::MAX_KEY_POS ? Positions::MAX_KEY_POS - maxlen : 0); else { unsigned int index; for (index = 0; index < positions._size && positions._positions[index] >= maxlen; index++) ; _minindex = index; } } /* Retrieves the next position, or EOS past the end. */ INLINE int PositionReverseIterator::next () { return (_index > _minindex ? _set._positions[--_index] : EOS); } /* Returns the number of remaining positions, i.e. how often next() will return a value != EOS. */ INLINE unsigned int PositionReverseIterator::remaining () const { return _index - _minindex; } /* Copy constructor. */ INLINE PositionReverseIterator::PositionReverseIterator (const PositionReverseIterator& src) : _set (src._set), _index (src._index), _minindex (src._minindex) { } gperf-3.2.1/src/input.cc0000664000000000000000000011157214774222356010531 /* Input routines. Copyright (C) 1989-1998, 2002-2004, 2011, 2017-2018, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "input.h" #include #include /* declares exit() */ #include /* declares strncpy(), strchr() */ #include /* defines UCHAR_MAX etc. */ #include "options.h" #include "getline.h" template Input::Input (FILE *stream, Keyword_Factory *keyword_factory) : _stream (stream), _factory (keyword_factory) { } /* Returns a pretty representation of the input file name, for error and warning messages. */ static const char * pretty_input_file_name () { if (option.get_input_file_name ()) return option.get_input_file_name (); else return "(standard input)"; } /* Returns true if the given line contains a "%DECL" declaration. */ static bool is_declaration (const char *line, const char *line_end, unsigned int lineno, const char *decl) { /* Skip '%'. */ line++; /* Skip DECL. */ for (const char *d = decl; *d; d++) { if (!(line < line_end)) return false; if (!(*line == *d || (*d == '-' && *line == '_'))) return false; line++; } if (line < line_end && ((*line >= 'A' && *line <= 'Z') || (*line >= 'a' && *line <= 'z') || *line == '-' || *line == '_')) return false; /* OK, found DECL. */ /* Skip whitespace. */ while (line < line_end && (*line == ' ' || *line == '\t')) line++; /* Expect end of line. */ if (line < line_end && *line != '\n') { fprintf (stderr, "%s:%u: junk after declaration\n", pretty_input_file_name (), lineno); exit (1); } return true; } /* Tests if the given line contains a "%DECL=ARG" declaration. If yes, it sets *ARGP to the argument, and returns true. Otherwise, it returns false. */ static bool is_declaration_with_arg (const char *line, const char *line_end, unsigned int lineno, const char *decl, char **argp) { /* Skip '%'. */ line++; /* Skip DECL. */ for (const char *d = decl; *d; d++) { if (!(line < line_end)) return false; if (!(*line == *d || (*d == '-' && *line == '_'))) return false; line++; } if (line < line_end && ((*line >= 'A' && *line <= 'Z') || (*line >= 'a' && *line <= 'z') || *line == '-' || *line == '_')) return false; /* OK, found DECL. */ /* Skip '='. */ if (!(line < line_end && *line == '=')) { fprintf (stderr, "%s:%u: missing argument in %%%s=ARG declaration.\n", pretty_input_file_name (), lineno, decl); exit (1); } line++; /* The next word is the argument. */ char *arg = new char[line_end - line + 1]; char *p = arg; while (line < line_end && !(*line == ' ' || *line == '\t' || *line == '\n')) *p++ = *line++; *p = '\0'; /* Skip whitespace. */ while (line < line_end && (*line == ' ' || *line == '\t')) line++; /* Expect end of line. */ if (line < line_end && *line != '\n') { fprintf (stderr, "%s:%u: junk after declaration\n", pretty_input_file_name (), lineno); exit (1); } *argp = arg; return true; } /* Tests if the given line contains a "%define DECL ARG" declaration. If yes, it sets *ARGP to the argument, and returns true. Otherwise, it returns false. */ static bool is_define_declaration (const char *line, const char *line_end, unsigned int lineno, const char *decl, char **argp) { /* Skip '%'. */ line++; /* Skip "define". */ { for (const char *d = "define"; *d; d++) { if (!(line < line_end)) return false; if (!(*line == *d)) return false; line++; } if (!(line < line_end && (*line == ' ' || *line == '\t'))) return false; } /* Skip whitespace. */ while (line < line_end && (*line == ' ' || *line == '\t')) line++; /* Skip DECL. */ for (const char *d = decl; *d; d++) { if (!(line < line_end)) return false; if (!(*line == *d || (*d == '-' && *line == '_'))) return false; line++; } if (line < line_end && ((*line >= 'A' && *line <= 'Z') || (*line >= 'a' && *line <= 'z') || *line == '-' || *line == '_')) return false; /* OK, found DECL. */ /* Skip whitespace. */ if (!(line < line_end && (*line == ' ' || *line == '\t'))) { fprintf (stderr, "%s:%u:" " missing argument in %%define %s ARG declaration.\n", pretty_input_file_name (), lineno, decl); exit (1); } do line++; while (line < line_end && (*line == ' ' || *line == '\t')); /* The next word is the argument. */ char *arg = new char[line_end - line + 1]; char *p = arg; while (line < line_end && !(*line == ' ' || *line == '\t' || *line == '\n')) *p++ = *line++; *p = '\0'; /* Skip whitespace. */ while (line < line_end && (*line == ' ' || *line == '\t')) line++; /* Expect end of line. */ if (line < line_end && *line != '\n') { fprintf (stderr, "%s:%u: junk after declaration\n", pretty_input_file_name (), lineno); exit (1); } *argp = arg; return true; } /* Reads the entire input file. */ template void Input::read_input () { /* The input file has the following structure: DECLARATIONS %% KEYWORDS %% ADDITIONAL_CODE Since the DECLARATIONS and the ADDITIONAL_CODE sections are optional, we have to read the entire file in the case there is only one %% separator line, in order to determine whether the structure is DECLARATIONS %% KEYWORDS or KEYWORDS %% ADDITIONAL_CODE When the option -t is given or when the first section contains declaration lines starting with %, we go for the first interpretation, otherwise for the second interpretation. */ char *input = NULL; size_t input_size = 0; int input_length = get_delim (&input, &input_size, EOF, _stream); if (input_length < 0) { if (ferror (_stream)) fprintf (stderr, "%s: error while reading input file\n", pretty_input_file_name ()); else fprintf (stderr, "%s: The input file is empty!\n", pretty_input_file_name ()); exit (1); } /* Convert CR/LF line terminators (Windows) to LF line terminators (Unix). GCC 3.3 and newer support CR/LF line terminators in C sources on Unix, so we do the same. The so-called "text mode" in stdio on Windows translates CR/LF to \n automatically, but here we also need this conversion on Unix. As a side effect, on Windows we also parse CR/CR/LF into a single \n, but this is not a problem. */ { char *p = input; char *p_end = input + input_length; /* Converting the initial segment without CRs is a no-op. */ while (p < p_end && *p != '\r') p++; /* Then start the conversion for real. */ char *q = p; while (p < p_end) { if (p[0] == '\r' && p + 1 < p_end && p[1] == '\n') p++; *q++ = *p++; } input_length = q - input; } /* We use input_end as a limit, in order to cope with NUL bytes in the input. But note that one trailing NUL byte has been added after input_end, for convenience. */ char *input_end = input + input_length; const char *declarations; const char *declarations_end; const char *keywords; const char *keywords_end; unsigned int keywords_lineno; /* Break up the input into the three sections. */ { const char *separator[2] = { NULL, NULL }; unsigned int separator_lineno[2] = { 0, 0 }; int separators = 0; { unsigned int lineno = 1; for (const char *p = input; p < input_end; ) { if (p[0] == '%' && p[1] == '%') { separator[separators] = p; separator_lineno[separators] = lineno; if (++separators == 2) break; } lineno++; p = (const char *) memchr (p, '\n', input_end - p); if (p != NULL) p++; else p = input_end; } } bool has_declarations; if (separators == 1) { if (option[TYPE]) has_declarations = true; else { has_declarations = false; for (const char *p = input; p < separator[0]; ) { if (p[0] == '%') { has_declarations = true; break; } p = (const char *) memchr (p, '\n', separator[0] - p); if (p != NULL) p++; else p = separator[0]; } } } else has_declarations = (separators > 0); if (has_declarations) { declarations = input; declarations_end = separator[0]; /* Give a warning if the separator line is nonempty. */ bool nonempty_line = false; const char *p; for (p = declarations_end + 2; p < input_end; ) { if (*p == '\n') { p++; break; } if (!(*p == ' ' || *p == '\t')) nonempty_line = true; p++; } if (nonempty_line) fprintf (stderr, "%s:%u: warning: junk after %%%% is ignored\n", pretty_input_file_name (), separator_lineno[0]); keywords = p; keywords_lineno = separator_lineno[0] + 1; } else { declarations = NULL; declarations_end = NULL; keywords = input; keywords_lineno = 1; } if (separators > (has_declarations ? 1 : 0)) { keywords_end = separator[separators-1]; _verbatim_code = separator[separators-1] + 2; _verbatim_code_end = input_end; _verbatim_code_lineno = separator_lineno[separators-1]; } else { keywords_end = input_end; _verbatim_code = NULL; _verbatim_code_end = NULL; _verbatim_code_lineno = 0; } } /* Parse the declarations section. */ _verbatim_declarations = NULL; _verbatim_declarations_end = NULL; _verbatim_declarations_lineno = 0; _struct_decl = NULL; _struct_decl_lineno = 0; _return_type = NULL; _struct_tag = NULL; { unsigned int lineno = 1; char *struct_decl = NULL; unsigned int *struct_decl_linenos = NULL; unsigned int struct_decl_linecount = 0; for (const char *line = declarations; line < declarations_end; ) { const char *line_end; line_end = (const char *) memchr (line, '\n', declarations_end - line); if (line_end != NULL) line_end++; else line_end = declarations_end; if (*line == '%') { if (line[1] == '{') { /* Handle %{. */ if (_verbatim_declarations != NULL) { fprintf (stderr, "%s:%u:\n%s:%u:" " only one %%{...%%} section is allowed\n", pretty_input_file_name (), _verbatim_declarations_lineno, pretty_input_file_name (), lineno); exit (1); } _verbatim_declarations = line + 2; _verbatim_declarations_lineno = lineno; } else if (line[1] == '}') { /* Handle %}. */ if (_verbatim_declarations == NULL) { fprintf (stderr, "%s:%u:" " %%} outside of %%{...%%} section\n", pretty_input_file_name (), lineno); exit (1); } if (_verbatim_declarations_end != NULL) { fprintf (stderr, "%s:%u:" " %%{...%%} section already closed\n", pretty_input_file_name (), lineno); exit (1); } _verbatim_declarations_end = line; /* Give a warning if the rest of the line is nonempty. */ bool nonempty_line = false; const char *q; for (q = line + 2; q < line_end; q++) { if (*q == '\n') { q++; break; } if (!(*q == ' ' || *q == '\t')) nonempty_line = true; } if (nonempty_line) fprintf (stderr, "%s:%u:" " warning: junk after %%} is ignored\n", pretty_input_file_name (), lineno); } else if (_verbatim_declarations != NULL && _verbatim_declarations_end == NULL) { fprintf (stderr, "%s:%u:" " warning: %% directives are ignored" " inside the %%{...%%} section\n", pretty_input_file_name (), lineno); } else { char *arg; if (is_declaration_with_arg (line, line_end, lineno, "delimiters", &arg)) option.set_delimiters (arg); else if (is_declaration (line, line_end, lineno, "struct-type")) option.set (TYPE); else if (is_declaration (line, line_end, lineno, "ignore-case")) option.set (UPPERLOWER); else if (is_declaration_with_arg (line, line_end, lineno, "language", &arg)) option.set_language (arg); else if (is_define_declaration (line, line_end, lineno, "slot-name", &arg)) option.set_slot_name (arg); else if (is_define_declaration (line, line_end, lineno, "initializer-suffix", &arg)) option.set_initializer_suffix (arg); else if (is_define_declaration (line, line_end, lineno, "hash-function-name", &arg)) option.set_hash_name (arg); else if (is_define_declaration (line, line_end, lineno, "lookup-function-name", &arg)) option.set_function_name (arg); else if (is_define_declaration (line, line_end, lineno, "class-name", &arg)) option.set_class_name (arg); else if (is_declaration (line, line_end, lineno, "7bit")) option.set (SEVENBIT); else if (is_declaration (line, line_end, lineno, "compare-lengths")) option.set (LENTABLE); else if (is_declaration (line, line_end, lineno, "compare-strncmp")) option.set (COMP); else if (is_declaration (line, line_end, lineno, "readonly-tables")) option.set (CONST); else if (is_declaration (line, line_end, lineno, "enum")) option.set (ENUM); else if (is_declaration (line, line_end, lineno, "includes")) option.set (INCLUDE); else if (is_declaration (line, line_end, lineno, "global-table")) option.set (GLOBAL); else if (is_declaration (line, line_end, lineno, "pic")) option.set (SHAREDLIB); else if (is_define_declaration (line, line_end, lineno, "string-pool-name", &arg)) option.set_stringpool_name (arg); else if (is_declaration (line, line_end, lineno, "null-strings")) option.set (NULLSTRINGS); else if (is_define_declaration (line, line_end, lineno, "constants-prefix", &arg)) option.set_constants_prefix (arg); else if (is_define_declaration (line, line_end, lineno, "word-array-name", &arg)) option.set_wordlist_name (arg); else if (is_define_declaration (line, line_end, lineno, "length-table-name", &arg)) option.set_lengthtable_name (arg); else if (is_declaration_with_arg (line, line_end, lineno, "switch", &arg)) { option.set_total_switches (atoi (arg)); if (option.get_total_switches () <= 0) { fprintf (stderr, "%s:%u: number of switches %s" " must be a positive number\n", pretty_input_file_name (), lineno, arg); exit (1); } } else if (is_declaration (line, line_end, lineno, "omit-struct-type")) option.set (NOTYPE); else { fprintf (stderr, "%s:%u: unrecognized %% directive\n", pretty_input_file_name (), lineno); exit (1); } } } else if (!(_verbatim_declarations != NULL && _verbatim_declarations_end == NULL)) { /* Append the line to struct_decl. */ size_t old_len = (struct_decl ? strlen (struct_decl) : 0); size_t line_len = line_end - line; size_t new_len = old_len + line_len + 1; char *new_struct_decl = new char[new_len]; if (old_len > 0) memcpy (new_struct_decl, struct_decl, old_len); memcpy (new_struct_decl + old_len, line, line_len); new_struct_decl[old_len + line_len] = '\0'; if (struct_decl) delete[] struct_decl; struct_decl = new_struct_decl; /* Append the lineno to struct_decl_linenos. */ unsigned int *new_struct_decl_linenos = new unsigned int[struct_decl_linecount + 1]; if (struct_decl_linecount > 0) memcpy (new_struct_decl_linenos, struct_decl_linenos, struct_decl_linecount * sizeof (unsigned int)); new_struct_decl_linenos[struct_decl_linecount] = lineno; if (struct_decl_linenos) delete[] struct_decl_linenos; struct_decl_linenos = new_struct_decl_linenos; /* Increment struct_decl_linecount. */ struct_decl_linecount++; } lineno++; line = line_end; } if (_verbatim_declarations != NULL && _verbatim_declarations_end == NULL) { fprintf (stderr, "%s:%u: unterminated %%{ section\n", pretty_input_file_name (), _verbatim_declarations_lineno); exit (1); } /* Determine _struct_decl, _return_type, _struct_tag. */ if (option[TYPE]) { if (struct_decl) { /* Drop leading whitespace and comments. */ { char *p = struct_decl; unsigned int *l = struct_decl_linenos; for (;;) { if (p[0] == ' ' || p[0] == '\t') { p++; continue; } if (p[0] == '\n') { l++; p++; continue; } if (p[0] == '/') { if (p[1] == '*') { /* Skip over ANSI C style comment. */ p += 2; while (p[0] != '\0') { if (p[0] == '*' && p[1] == '/') { p += 2; break; } if (p[0] == '\n') l++; p++; } continue; } if (p[1] == '/') { /* Skip over ISO C99 or C++ style comment. */ p += 2; while (p[0] != '\0' && p[0] != '\n') p++; if (p[0] == '\n') { l++; p++; } continue; } } break; } if (p != struct_decl) { size_t len = strlen (p); char *new_struct_decl = new char[len + 1]; memcpy (new_struct_decl, p, len + 1); delete[] struct_decl; struct_decl = new_struct_decl; } _struct_decl_lineno = *l; } /* Drop trailing whitespace. */ for (char *p = struct_decl + strlen (struct_decl); p > struct_decl;) if (p[-1] == '\n' || p[-1] == ' ' || p[-1] == '\t') *--p = '\0'; else break; } if (struct_decl == NULL || struct_decl[0] == '\0') { fprintf (stderr, "%s: missing struct declaration" " for option --struct-type\n", pretty_input_file_name ()); exit (1); } { /* Ensure trailing semicolon. */ size_t old_len = strlen (struct_decl); if (struct_decl[old_len - 1] != ';') { char *new_struct_decl = new char[old_len + 2]; memcpy (new_struct_decl, struct_decl, old_len); new_struct_decl[old_len] = ';'; new_struct_decl[old_len + 1] = '\0'; delete[] struct_decl; struct_decl = new_struct_decl; } } /* Set _struct_decl to the entire declaration. */ _struct_decl = struct_decl; /* Set _struct_tag to the naked "struct something". */ const char *p; for (p = struct_decl; *p && *p != '{' && *p != ';' && *p != '\n'; p++) ; for (; p > struct_decl;) if (p[-1] == '\n' || p[-1] == ' ' || p[-1] == '\t') --p; else break; size_t struct_tag_length = p - struct_decl; char *struct_tag = new char[struct_tag_length + 1]; memcpy (struct_tag, struct_decl, struct_tag_length); struct_tag[struct_tag_length] = '\0'; _struct_tag = struct_tag; /* The return type of the lookup function is "struct something *". No "const" here, because if !option[CONST], some user code might want to modify the structure. */ char *return_type = new char[struct_tag_length + 3]; memcpy (return_type, struct_decl, struct_tag_length); return_type[struct_tag_length] = ' '; return_type[struct_tag_length + 1] = '*'; return_type[struct_tag_length + 2] = '\0'; _return_type = return_type; } if (struct_decl_linenos) delete[] struct_decl_linenos; } /* Parse the keywords section. */ { Keyword_List **list_tail = &_head; const char *delimiters = option.get_delimiters (); unsigned int lineno = keywords_lineno; bool charset_dependent = false; for (const char *line = keywords; line < keywords_end; ) { const char *line_end; line_end = (const char *) memchr (line, '\n', keywords_end - line); if (line_end != NULL) line_end++; else line_end = keywords_end; if (line[0] == '#') ; /* Comment line. */ else if (line[0] == '%') { fprintf (stderr, "%s:%u:" " declarations are not allowed in the keywords section.\n" "To declare a keyword starting with %%, enclose it in" " double-quotes.\n", pretty_input_file_name (), lineno); exit (1); } else { /* An input line carrying a keyword. */ const char *keyword; size_t keyword_length; const char *rest; if (line[0] == '"') { /* Parse a string in ANSI C syntax. */ char *kp = new char[line_end-line]; keyword = kp; const char *lp = line + 1; for (;;) { if (lp == line_end) { fprintf (stderr, "%s:%u: unterminated string\n", pretty_input_file_name (), lineno); exit (1); } char c = *lp; if (c == '\\') { c = *++lp; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': { int code = 0; int count = 0; while (count < 3 && *lp >= '0' && *lp <= '7') { code = (code << 3) + (*lp - '0'); lp++; count++; } if (code > UCHAR_MAX) fprintf (stderr, "%s:%u: octal escape out of range\n", pretty_input_file_name (), lineno); *kp = static_cast(code); break; } case 'x': { int code = 0; int count = 0; lp++; while ((*lp >= '0' && *lp <= '9') || (*lp >= 'A' && *lp <= 'F') || (*lp >= 'a' && *lp <= 'f')) { code = (code << 4) + (*lp >= 'A' && *lp <= 'F' ? *lp - 'A' + 10 : *lp >= 'a' && *lp <= 'f' ? *lp - 'a' + 10 : *lp - '0'); lp++; count++; } if (count == 0) fprintf (stderr, "%s:%u: hexadecimal escape" " without any hex digits\n", pretty_input_file_name (), lineno); if (code > UCHAR_MAX) fprintf (stderr, "%s:%u: hexadecimal escape" " out of range\n", pretty_input_file_name (), lineno); *kp = static_cast(code); break; } case '\\': case '\'': case '"': *kp = c; lp++; charset_dependent = true; break; case 'n': *kp = '\n'; lp++; charset_dependent = true; break; case 't': *kp = '\t'; lp++; charset_dependent = true; break; case 'r': *kp = '\r'; lp++; charset_dependent = true; break; case 'f': *kp = '\f'; lp++; charset_dependent = true; break; case 'b': *kp = '\b'; lp++; charset_dependent = true; break; case 'a': *kp = '\a'; lp++; charset_dependent = true; break; case 'v': *kp = '\v'; lp++; charset_dependent = true; break; default: fprintf (stderr, "%s:%u: invalid escape sequence" " in string\n", pretty_input_file_name (), lineno); exit (1); } } else if (c == '"') break; else { *kp = c; lp++; charset_dependent = true; } kp++; } lp++; if (lp < line_end && *lp != '\n') { if (strchr (delimiters, *lp) == NULL) { fprintf (stderr, "%s:%u: string not followed" " by delimiter\n", pretty_input_file_name (), lineno); exit (1); } lp++; } keyword_length = kp - keyword; if (option[TYPE]) { char *line_rest = new char[line_end - lp + 1]; memcpy (line_rest, lp, line_end - lp); line_rest[line_end - lp - (line_end > lp && line_end[-1] == '\n' ? 1 : 0)] = '\0'; rest = line_rest; } else rest = empty_string; } else { /* Not a string. Look for the delimiter. */ const char *lp = line; for (;;) { if (!(lp < line_end && *lp != '\n')) { keyword = line; keyword_length = lp - line; rest = empty_string; break; } if (strchr (delimiters, *lp) != NULL) { keyword = line; keyword_length = lp - line; lp++; if (option[TYPE]) { char *line_rest = new char[line_end - lp + 1]; memcpy (line_rest, lp, line_end - lp); line_rest[line_end - lp - (line_end > lp && line_end[-1] == '\n' ? 1 : 0)] = '\0'; rest = line_rest; } else rest = empty_string; break; } lp++; } if (keyword_length > 0) charset_dependent = true; } /* Allocate Keyword and add it to the list. */ KT *new_kw = _factory->create_keyword (keyword, keyword_length, rest, lineno); *list_tail = new Keyword_List (new_kw); list_tail = &(*list_tail)->rest(); } lineno++; line = line_end; } *list_tail = NULL; if (_head == NULL) { fprintf (stderr, "%s: No keywords in input file!\n", pretty_input_file_name ()); exit (1); } _charset_dependent = charset_dependent; } /* To be freed in the destructor. */ _input = input; _input_end = input_end; } template Input::~Input () { /* Free allocated memory. */ delete[] const_cast(_return_type); delete[] const_cast(_struct_tag); delete[] const_cast(_struct_decl); delete[] _input; } /* ------------------------------------------------------------------------- */ /* Explicit template instantiations. Needed to avoid link-time errors. C++ is just misdesigned: The most important aspect in building large software packages is information hiding. (That's the point of having the implementation of a .h file in a .cc file, isn't it? And of having classes with private fields and methods, isn't it?) The fact that we need the instantiation of the Input class only for KT = KeywordExt comes from the code in main.cc. It is ugly that implementation details of main.cc have an influence into this file here. */ template class Input; /* ------------------------------------------------------------------------- */ gperf-3.2.1/src/keyword.cc0000664000000000000000000001301414774222356011046 /* Keyword data. Copyright (C) 1989-1998, 2000, 2002-2003, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "keyword.h" #include #include #include #include "positions.h" /* --------------------------- KeywordExt class --------------------------- */ /* Sort a small set of 'unsigned int', base[0..len-1], in place. */ static inline void sort_char_set (unsigned int *base, int len) { /* Bubble sort is sufficient here. */ for (int i = 1; i < len; i++) { int j; unsigned int tmp; for (j = i, tmp = base[j]; j > 0 && tmp < base[j - 1]; j--) base[j] = base[j - 1]; base[j] = tmp; } } /* Initializes selchars and selchars_length. General idea: The hash function will be computed as asso_values[allchars[key_pos[0]]] + asso_values[allchars[key_pos[1]]] + ... We compute selchars as the multiset { allchars[key_pos[0]], allchars[key_pos[1]], ... } so that the hash function becomes asso_values[selchars[0]] + asso_values[selchars[1]] + ... Furthermore we sort the selchars array, to ease detection of duplicates later. More in detail: The arguments alpha_unify (used for case-insensitive hash functions) and alpha_inc (used to disambiguate permutations) apply slight modifications. The hash function will be computed as sum (j=0,1,...: k = key_pos[j]: asso_values[alpha_unify[allchars[k]+alpha_inc[k]]]) + (allchars_length if !option[NOLENGTH], 0 otherwise). We compute selchars as the multiset { alpha_unify[allchars[k]+alpha_inc[k]] : j=0,1,..., k = key_pos[j] } so that the hash function becomes asso_values[selchars[0]] + asso_values[selchars[1]] + ... + (allchars_length if !option[NOLENGTH], 0 otherwise). */ unsigned int * KeywordExt::init_selchars_low (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) { /* Iterate through the list of positions, initializing selchars (via ptr). */ PositionIterator iter = positions.iterator(_allchars_length); unsigned int *key_set = new unsigned int[iter.remaining()]; unsigned int *ptr = key_set; for (int i; (i = iter.next ()) != PositionIterator::EOS; ) { unsigned int c; if (i == Positions::LASTCHAR) /* Special notation for last KEY position, i.e. '$'. */ c = static_cast(_allchars[_allchars_length - 1]); else if (i < _allchars_length) { /* Within range of KEY length, so we'll keep it. */ c = static_cast(_allchars[i]); if (alpha_inc) c += alpha_inc[i]; } else /* Out of range of KEY length, the iterator should not have produced this. */ abort (); if (alpha_unify) c = alpha_unify[c]; *ptr = c; ptr++; } _selchars = key_set; _selchars_length = ptr - key_set; return key_set; } void KeywordExt::init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify) { init_selchars_low (positions, alpha_unify, NULL); } void KeywordExt::init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) { unsigned int *selchars = init_selchars_low (positions, alpha_unify, alpha_inc); /* Sort the selchars elements alphabetically. */ sort_char_set (selchars, _selchars_length); } /* Deletes selchars. */ void KeywordExt::delete_selchars () { delete[] const_cast(_selchars); } /* ------------------------- Keyword_Factory class ------------------------- */ template Keyword_Factory::Keyword_Factory () { } template Keyword_Factory::~Keyword_Factory () { } /* ------------------------------------------------------------------------- */ char empty_string[1] = ""; #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "keyword.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ /* ------------------------------------------------------------------------- */ /* Explicit template instantiations. Needed to avoid link-time errors. C++ is just misdesigned: The most important aspect in building large software packages is information hiding. (That's the point of having the implementation of a .h file in a .cc file, isn't it? And of having classes with private fields and methods, isn't it?) The fact that we need the instantiation of the Keyword_Factory class only for KT = KeywordExt comes from the code in main.cc. It is ugly that implementation details of main.cc have an influence into this file here. */ template class Keyword_Factory; /* ------------------------------------------------------------------------- */ gperf-3.2.1/src/configure.ac0000664000000000000000000000422014630031131011314 dnl autoconf configuration for gperf/src dnl Copyright (C) 1998-2024 Free Software Foundation, Inc. dnl Written by Douglas C. Schmidt dnl and Bruno Haible . dnl dnl This file is part of GNU GPERF. dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_PREREQ([2.64]) AC_INIT AC_CONFIG_SRCDIR([main.cc]) AC_CONFIG_AUX_DIR([../build-aux]) AC_CONFIG_HEADERS([config.h]) AC_PROG_MAKE_SET dnl dnl checks for programs dnl AC_PROG_CC dnl sets variable CC AC_PROG_CPP dnl sets variable CPP AC_PROG_CXX dnl sets variable CXX AC_PROG_CXXCPP dnl sets variable CXXCPP AC_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl checks for compiler characteristics dnl AC_CACHE_CHECK([for stack-allocated variable-size arrays], [gp_cv_cxx_dynamic_array], [AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([[int func (int n) { int dynamic_array[n]; }]], [[]])], [gp_cv_cxx_dynamic_array=yes], [gp_cv_cxx_dynamic_array=no]) AC_LANG_POP([C++]) ]) if test $gp_cv_cxx_dynamic_array = yes; then AC_DEFINE([HAVE_DYNAMIC_ARRAY], [1], [Define if the C++ compiler supports stack-allocated variable-size arrays.]) fi dnl dnl checks for functions and declarations dnl dnl dnl checks for libraries dnl AC_CHECK_LIB([m], [rand], [GPERF_LIBM="-lm"], [GPERF_LIBM=""]) AC_SUBST([GPERF_LIBM]) dnl dnl That's it. dnl AC_CONFIG_FILES([Makefile]) AC_OUTPUT gperf-3.2.1/src/bool-array.icc0000664000000000000000000000456113347736274011615 /* Inline Functions for bool-array.{h,cc}. Copyright (C) 1989-1998, 2002 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ // This needs: //#include //#include //#include "options.h" /* Initializes the bit array with room for SIZE bits, numbered from 0 to SIZE-1. */ INLINE Bool_Array::Bool_Array (unsigned int size) : _size (size), _iteration_number (1), _storage_array (new unsigned int [size]) { memset (_storage_array, 0, size * sizeof (_storage_array[0])); if (option[DEBUG]) fprintf (stderr, "\nbool array size = %d, total bytes = %d\n", _size, static_cast (_size * sizeof (_storage_array[0]))); } /* Sets the specified bit to true. Returns its previous value (false or true). */ INLINE bool Bool_Array::set_bit (unsigned int index) { if (_storage_array[index] == _iteration_number) /* The bit was set since the last clear() call. */ return true; else { /* The last operation on this bit was clear(). Set it now. */ _storage_array[index] = _iteration_number; return false; } } /* Resets all bits to zero. */ INLINE void Bool_Array::clear () { /* If we wrap around it's time to zero things out again! However, this only occurs once about every 2^32 iterations, so it will not happen more frequently than once per second. */ if (++_iteration_number == 0) { _iteration_number = 1; memset (_storage_array, 0, _size * sizeof (_storage_array[0])); if (option[DEBUG]) { fprintf (stderr, "(re-initialized bool_array)\n"); fflush (stderr); } } } gperf-3.2.1/src/options.h0000664000000000000000000002275014475667373010740 /* This may look like C code, but it is really -*- C++ -*- */ /* Handles parsing the Options provided to the user. Copyright (C) 1989-1998, 2000, 2002-2004, 2011, 2023 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* This module provides a uniform interface to the various options available to a user of the gperf hash function generator. */ #ifndef options_h #define options_h 1 #include #include "positions.h" /* Enumeration of the possible boolean options. */ enum Option_Type { /* --- Input file interpretation --- */ /* Handle user-defined type structured keyword input. */ TYPE = 1 << 0, /* Ignore case of ASCII characters. */ UPPERLOWER = 1 << 1, /* --- Language for the output code --- */ /* Generate K&R C code: no prototypes, no const. */ KRC = 1 << 2, /* Generate C code: no prototypes, but const (user can #define it away). */ C = 1 << 3, /* Generate ISO/ANSI C code: prototypes and const, but no class. */ ANSIC = 1 << 4, /* Generate C++ code: prototypes, const, class, inline, enum. */ CPLUSPLUS = 1 << 5, /* --- Details in the output code --- */ /* Assume 7-bit, not 8-bit, characters. */ SEVENBIT = 1 << 6, /* Generate a length table for string comparison. */ LENTABLE = 1 << 7, /* Generate strncmp rather than strcmp. */ COMP = 1 << 8, /* Make the generated tables readonly (const). */ CONST = 1 << 9, /* Use enum for constants. */ ENUM = 1 << 10, /* Generate #include statements. */ INCLUDE = 1 << 11, /* Make the keyword table a global variable. */ GLOBAL = 1 << 12, /* Use NULL strings instead of empty strings for empty table entries. */ NULLSTRINGS = 1 << 13, /* Optimize for position-independent code. */ SHAREDLIB = 1 << 14, /* Generate switch output to save space. */ SWITCH = 1 << 15, /* Don't include user-defined type definition in output -- it's already defined elsewhere. */ NOTYPE = 1 << 16, /* --- Algorithm employed by gperf --- */ /* Use the given key positions. */ POSITIONS = 1 << 17, /* Handle duplicate hash values for keywords. */ DUP = 1 << 18, /* Don't include keyword length in hash computations. */ NOLENGTH = 1 << 19, /* Randomly initialize the associated values table. */ RANDOM = 1 << 20, /* --- Informative output --- */ /* Enable debugging (prints diagnostics to stderr). */ DEBUG = 1 << 21 }; /* Class manager for gperf program Options. */ class Options { public: /* Constructor. */ Options (); /* Destructor. */ ~Options (); /* Parses the options given in the command-line arguments. */ void parse_options (int argc, char *argv[]); /* Prints the given options. */ void print_options () const; /* Accessors. */ /* Tests a given boolean option. Returns true if set, false otherwise. */ bool operator[] (Option_Type option) const; /* Sets a given boolean option. */ void set (Option_Type option); /* Returns the input file name. */ const char * get_input_file_name () const; /* Returns the output file name. */ const char * get_output_file_name () const; /* Sets the output language, if not already set. */ void set_language (const char *language); /* Returns the jump value. */ int get_jump () const; /* Returns the initial associated character value. */ int get_initial_asso_value () const; /* Returns the number of iterations for finding good asso_values. */ int get_asso_iterations () const; /* Returns the total number of switch statements to generate. */ int get_total_switches () const; /* Sets the total number of switch statements, if not already set. */ void set_total_switches (int total_switches); /* Returns the factor by which to multiply the generated table's size. */ float get_size_multiple () const; /* Returns the generated function name. */ const char * get_function_name () const; /* Sets the generated function name, if not already set. */ void set_function_name (const char *name); /* Returns the keyword key name. */ const char * get_slot_name () const; /* Sets the keyword key name, if not already set. */ void set_slot_name (const char *name); /* Returns the struct initializer suffix. */ const char * get_initializer_suffix () const; /* Returns true if the struct initializer suffix has been set. */ bool has_initializer_suffix () const; /* Sets the struct initializer suffix, if not already set. */ void set_initializer_suffix (const char *initializers); /* Returns the generated class name. */ const char * get_class_name () const; /* Sets the generated class name, if not already set. */ void set_class_name (const char *name); /* Returns the hash function name. */ const char * get_hash_name () const; /* Sets the hash function name, if not already set. */ void set_hash_name (const char *name); /* Returns the hash table array name. */ const char * get_wordlist_name () const; /* Sets the hash table array name, if not already set. */ void set_wordlist_name (const char *name); /* Returns the length table array name. */ const char * get_lengthtable_name () const; /* Sets the length table array name, if not already set. */ void set_lengthtable_name (const char *name); /* Returns the string pool name. */ const char * get_stringpool_name () const; /* Sets the string pool name, if not already set. */ void set_stringpool_name (const char *name); /* Returns the prefix for the constants. */ const char * get_constants_prefix () const; /* Sets the prefix for the constants, if not already set. */ void set_constants_prefix (const char *prefix); /* Returns the string used to delimit keywords from other attributes. */ const char * get_delimiters () const; /* Sets the delimiters string, if not already set. */ void set_delimiters (const char *delimiters); /* Returns key positions. */ const Positions& get_key_positions () const; private: /* Prints program usage to given stream. */ static void short_usage (FILE * stream); /* Prints program usage to given stream. */ static void long_usage (FILE * stream); /* Records count of command-line arguments. */ int _argument_count; /* Stores a pointer to command-line argument vector. */ char ** _argument_vector; /* Holds the boolean options. */ int _option_word; /* Name of input file. */ char * _input_file_name; /* Name of output file. */ char * _output_file_name; /* The output language. */ const char * _language; /* Jump length when trying alternative values. */ int _jump; /* Initial value for asso_values table. */ int _initial_asso_value; /* Number of attempts at finding good asso_values. */ int _asso_iterations; /* Number of switch statements to generate. */ int _total_switches; /* Factor by which to multiply the generated table's size. */ float _size_multiple; /* Names used for generated lookup function. */ const char * _function_name; /* Name used for keyword key. */ const char * _slot_name; /* Suffix for empty struct initializers. */ const char * _initializer_suffix; /* Name used for generated C++ class. */ const char * _class_name; /* Name used for generated hash function. */ const char * _hash_name; /* Name used for hash table array. */ const char * _wordlist_name; /* Name used for length table array. */ const char * _lengthtable_name; /* Name used for the string pool. */ const char * _stringpool_name; /* Prefix for the constants. */ const char * _constants_prefix; /* Separates keywords from other attributes. */ const char * _delimiters; /* Contains user-specified key choices. */ Positions _key_positions; }; /* Global option coordinator for the entire program. */ extern Options option; #ifdef __OPTIMIZE__ #define INLINE inline #include "options.icc" #undef INLINE #endif #endif gperf-3.2.1/src/keyword-list.icc0000664000000000000000000000225614774201246012171 /* Inline Functions for keyword-list.{h,cc}. Copyright (C) 2002-2003, 2025 Free Software Foundation, Inc. Written by Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* ------------------------ Keyword_List class ------------------------- */ /* Access to first element of list. */ template INLINE KT * Keyword_List::first () const { return _car; } /* Access to next element of list. */ template INLINE Keyword_List *& Keyword_List::rest () { return _cdr; } gperf-3.2.1/src/bool-array.cc0000664000000000000000000000274413347736303011436 /* Fast lookup table abstraction implemented as an Iteration Number Array Copyright (C) 1989-1998, 2002-2003 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "bool-array.h" #include #include #include "options.h" /* Frees this object. */ Bool_Array::~Bool_Array () { /* Print out debugging diagnostics. */ if (option[DEBUG]) fprintf (stderr, "\ndumping boolean array information\n" "size = %d\niteration number = %d\nend of array dump\n", _size, _iteration_number); delete[] const_cast(_storage_array); } #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "bool-array.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ gperf-3.2.1/src/keyword.h0000664000000000000000000001002314774222644010705 /* This may look like C code, but it is really -*- C++ -*- */ /* Keyword data. Copyright (C) 1989-1998, 2000, 2002-2003, 2017, 2025 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef keyword_h #define keyword_h 1 /* Class defined in "positions.h". */ class Positions; /* An instance of this class is a keyword, as specified in the input file. */ struct Keyword { /* Constructor. */ Keyword (const char *allchars, int allchars_length, const char *rest, unsigned int lineno); /* Data members defined immediately by the input file. */ /* The keyword as a string, possibly containing NUL bytes. */ const char *const _allchars; int const _allchars_length; /* Additional stuff seen on the same line of the input file. */ const char *const _rest; /* Line number of this keyword in the input file. */ unsigned int _lineno; }; /* A keyword, in the context of a given keyposition list. */ struct KeywordExt : public Keyword { /* Constructor. */ KeywordExt (const char *allchars, int allchars_length, const char *rest, unsigned int lineno); /* Data members depending on the keyposition list. */ /* The selected characters that participate for the hash function, selected according to the keyposition list, as a canonically reordered multiset. */ const unsigned int * _selchars; int _selchars_length; /* Chained list of keywords having the same _selchars and - if !option[NOLENGTH] - also the same _allchars_length. Note that these duplicates are not members of the main keyword list. */ KeywordExt * _duplicate_link; /* Methods depending on the keyposition list. */ /* Initializes selchars and selchars_length, without reordering. */ void init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify); /* Initializes selchars and selchars_length, with reordering. */ void init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc); /* Deletes selchars. */ void delete_selchars (); /* Data members used by the algorithm. */ int _hash_value; /* Hash value for the keyword. */ /* Data members used by the output routines. */ int _final_index; private: unsigned int * init_selchars_low (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc); }; /* A factory for creating Keyword instances. This factory is used to make the Input class independent of the concrete class KeywordExt. */ template class Keyword_Factory { public: /* Constructor. */ Keyword_Factory (); /* Destructor. */ virtual ~Keyword_Factory (); /* Creates a new Keyword. */ virtual KT * create_keyword (const char *allchars, int allchars_length, const char *rest, unsigned int lineno); }; /* A statically allocated empty string. */ extern char empty_string[1]; #ifdef __OPTIMIZE__ #define INLINE inline #include "keyword.icc" #undef INLINE #endif #endif gperf-3.2.1/src/config.h.in0000664000000000000000000000121114774103074011065 /* config.h.in. Generated from configure.ac by autoheader. */ /* Define if the C++ compiler supports stack-allocated variable-size arrays. */ #undef HAVE_DYNAMIC_ARRAY /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION gperf-3.2.1/src/keyword-list.cc0000664000000000000000000001306414774222356012024 /* Keyword list. Copyright (C) 2002-2003, 2025 Free Software Foundation, Inc. Written by Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "keyword-list.h" #include /* ------------------------ Keyword_List class ------------------------- */ /* Constructor. */ template Keyword_List::Keyword_List (KT *car) : _cdr (NULL), _car (car) { } /* ---------------------- Keyword_List functions ----------------------- */ /* Copies a linear list, sharing the list elements. */ template Keyword_List * copy_list (Keyword_List *list) { Keyword_List *result; Keyword_List **lastp = &result; while (list != NULL) { Keyword_List *new_cons = new Keyword_List (list->first()); *lastp = new_cons; lastp = &new_cons->rest(); list = list->rest(); } *lastp = NULL; return result; } /* Deletes a linear list, keeping the list elements in memory. */ template void delete_list (Keyword_List *list) { while (list != NULL) { Keyword_List *rest = list->rest(); delete list; list = rest; } } /* Type of a comparison function. */ #if 0 /* wishful thinking */ template typedef bool (*Keyword_Comparison) (KT *keyword1, KT *keyword2); #endif /* Merges two sorted lists together to form one sorted list. */ template static Keyword_List * merge (Keyword_List *list1, Keyword_List *list2, bool (*less) (KT *keyword1, KT *keyword2)) { Keyword_List *result; Keyword_List **resultp = &result; for (;;) { if (!list1) { *resultp = list2; break; } if (!list2) { *resultp = list1; break; } if (less (list2->first(), list1->first())) { *resultp = list2; resultp = &list2->rest(); /* We would have a stable sorting if the next line would read: list2 = *resultp; */ list2 = list1; list1 = *resultp; } else { *resultp = list1; resultp = &list1->rest(); list1 = *resultp; } } return result; } /* Sorts a linear list, given a comparison function. Note: This uses a variant of mergesort that is *not* a stable sorting algorithm. */ template Keyword_List * mergesort_list (Keyword_List *list, bool (*less) (KT *keyword1, KT *keyword2)) { if (list == NULL || list->rest() == NULL) /* List of length 0 or 1. Nothing to do. */ return list; else { /* Determine a list node in the middle. */ Keyword_List *middle = list; for (Keyword_List *temp = list->rest();;) { temp = temp->rest(); if (temp == NULL) break; temp = temp->rest(); middle = middle->rest(); if (temp == NULL) break; } /* Cut the list into two halves. If the list has n elements, the left half has ceiling(n/2) elements and the right half has floor(n/2) elements. */ Keyword_List *right_half = middle->rest(); middle->rest() = NULL; /* Sort the two halves, then merge them. */ return merge (mergesort_list (list, less), mergesort_list (right_half, less), less); } } #ifndef __OPTIMIZE__ #define INLINE /* not inline */ #include "keyword-list.icc" #undef INLINE #endif /* not defined __OPTIMIZE__ */ /* ------------------------------------------------------------------------- */ /* Explicit template instantiations. Needed to avoid link-time errors. C++ is just misdesigned: The most important aspect in building large software packages is information hiding. (That's the point of having the implementation of a .h file in a .cc file, isn't it? And of having classes with private fields and methods, isn't it?) The fact that we need the instantiation of the Keyword_List class and associate functions only for KT = KeywordExt comes from the code in main.cc. It is ugly that implementation details of main.cc have an influence into this file here. */ template class Keyword_List; template Keyword_List * copy_list (Keyword_List *list); template void delete_list (Keyword_List *list); template Keyword_List * mergesort_list (Keyword_List *list, bool (*less) (KeywordExt *keyword1, KeywordExt *keyword2)); /* ------------------------------------------------------------------------- */ gperf-3.2.1/src/search.cc0000664000000000000000000016565213347736313010645 /* Search algorithm. Copyright (C) 1989-1998, 2000, 2002-2003, 2009, 2016 Free Software Foundation, Inc. Written by Douglas C. Schmidt and Bruno Haible . This file is part of GNU GPERF. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Specification. */ #include "search.h" #include #include /* declares exit(), rand(), srand() */ #include /* declares memset(), memcmp() */ #include /* declares time() */ #include /* declares exp() */ #include /* defines INT_MIN, INT_MAX, UINT_MAX */ #include "options.h" #include "hash-table.h" #include "config.h" /* ============================== Portability ============================== */ /* Assume ISO C++ 'for' scoping rule. */ #define for if (0) ; else for /* Dynamically allocated array with dynamic extent: Example: DYNAMIC_ARRAY (my_array, int, n); ... FREE_DYNAMIC_ARRAY (my_array); Attention: depending on your implementation my_array is either the array itself or a pointer to the array! Always use my_array only as expression! */ #if HAVE_DYNAMIC_ARRAY #define DYNAMIC_ARRAY(var,eltype,size) eltype var[size] #define FREE_DYNAMIC_ARRAY(var) #else #define DYNAMIC_ARRAY(var,eltype,size) eltype *var = new eltype[size] #define FREE_DYNAMIC_ARRAY(var) delete[] var #endif /* ================================ Theory ================================= */ /* The general form of the hash function is hash (keyword) = sum (asso_values[keyword[i] + alpha_inc[i]] : i in Pos) + len (keyword) where Pos is a set of byte positions, each alpha_inc[i] is a nonnegative integer, each asso_values[c] is a nonnegative integer, len (keyword) is the keyword's length if _hash_includes_len, or 0 otherwise. Theorem 1: If all keywords are different, there is a set Pos such that all tuples (keyword[i] : i in Pos) are different. Theorem 2: If all tuples (keyword[i] : i in Pos) are different, there are nonnegative integers alpha_inc[i] such that all multisets {keyword[i] + alpha_inc[i] : i in Pos} are different. Define selchars[keyword] := {keyword[i] + alpha_inc[i] : i in Pos}. Theorem 3: If all multisets selchars[keyword] are different, there are nonnegative integers asso_values[c] such that all hash values sum (asso_values[c] : c in selchars[keyword]) are different. Based on these three facts, we find the hash function in three steps: Step 1 (Finding good byte positions): Find a set Pos, as small as possible, such that all tuples (keyword[i] : i in Pos) are different. Step 2 (Finding good alpha increments): Find nonnegative integers alpha_inc[i], as many of them as possible being zero, and the others being as small as possible, such that all multisets {keyword[i] + alpha_inc[i] : i in Pos} are different. Step 3 (Finding good asso_values): Find asso_values[c] such that all hash (keyword) are different. In other words, each step finds a projection that is injective on the given finite set: proj1 : String --> Map (Pos --> N) proj2 : Map (Pos --> N) --> Map (Pos --> N) / S(Pos) proj3 : Map (Pos --> N) / S(Pos) --> N where N denotes the set of nonnegative integers, Map (A --> B) := Hom_Set (A, B) is the set of maps from A to B, and S(Pos) is the symmetric group over Pos. This was the theory for !_hash_includes_len; if _hash_includes_len, slight modifications apply: proj1 : String --> Map (Pos --> N) x N proj2 : Map (Pos --> N) x N --> Map (Pos --> N) / S(Pos) x N proj3 : Map (Pos --> N) / S(Pos) x N --> N For a case-insensitive hash function, the general form is hash (keyword) = sum (asso_values[alpha_unify[keyword[i] + alpha_inc[i]]] : i in Pos) + len (keyword) where alpha_unify[c] is chosen so that an upper/lower case change in keyword[i] doesn't change alpha_unify[keyword[i] + alpha_inc[i]]. */ /* ==================== Initialization and Preparation ===================== */ Search::Search (KeywordExt_List *list) : _head (list) { } void Search::prepare () { /* Compute the total number of keywords. */ _total_keys = 0; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) _total_keys++; /* Compute the minimum and maximum keyword length. */ _max_key_len = INT_MIN; _min_key_len = INT_MAX; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); if (_max_key_len < keyword->_allchars_length) _max_key_len = keyword->_allchars_length; if (_min_key_len > keyword->_allchars_length) _min_key_len = keyword->_allchars_length; } /* Exit program if an empty string is used as keyword, since the comparison expressions don't work correctly for looking up an empty string. */ if (_min_key_len == 0) { fprintf (stderr, "Empty input keyword is not allowed.\n" "To recognize an empty input keyword, your code should check for\n" "len == 0 before calling the gperf generated lookup function.\n"); exit (1); } /* Exit program if the characters in the keywords are not in the required range. */ if (option[SEVENBIT]) { for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); const char *k = keyword->_allchars; for (int i = keyword->_allchars_length; i > 0; k++, i--) if (!(static_cast(*k) < 128)) { fprintf (stderr, "Option --seven-bit has been specified,\n" "but keyword \"%.*s\" contains non-ASCII characters.\n" "Try removing option --seven-bit.\n", keyword->_allchars_length, keyword->_allchars); exit (1); } } } /* Determine whether the hash function shall include the length. */ _hash_includes_len = !(option[NOLENGTH] || (_min_key_len == _max_key_len)); } /* ====================== Finding good byte positions ====================== */ /* Computes the upper bound on the indices passed to asso_values[], assuming no alpha_increments. */ unsigned int Search::compute_alpha_size () const { return (option[SEVENBIT] ? 128 : 256); } /* Computes the unification rules between different asso_values[c], assuming no alpha_increments. */ unsigned int * Search::compute_alpha_unify () const { if (option[UPPERLOWER]) { /* Uppercase to lowercase mapping. */ unsigned int alpha_size = compute_alpha_size(); unsigned int *alpha_unify = new unsigned int[alpha_size]; for (unsigned int c = 0; c < alpha_size; c++) alpha_unify[c] = c; for (unsigned int c = 'A'; c <= 'Z'; c++) alpha_unify[c] = c + ('a'-'A'); return alpha_unify; } else /* Identity mapping. */ return NULL; } /* Initializes each keyword's _selchars array. */ void Search::init_selchars_tuple (const Positions& positions, const unsigned int *alpha_unify) const { for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) temp->first()->init_selchars_tuple(positions, alpha_unify); } /* Deletes each keyword's _selchars array. */ void Search::delete_selchars () const { for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) temp->first()->delete_selchars(); } /* Count the duplicate keywords that occur with a given set of positions. In other words, it returns the difference # K - # proj1 (K) where K is the multiset of given keywords. */ unsigned int Search::count_duplicates_tuple (const Positions& positions, const unsigned int *alpha_unify) const { /* Run through the keyword list and count the duplicates incrementally. The result does not depend on the order of the keyword list, thanks to the formula above. */ init_selchars_tuple (positions, alpha_unify); unsigned int count = 0; { Hash_Table representatives (_total_keys, !_hash_includes_len); for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); if (representatives.insert (keyword)) count++; } } delete_selchars (); return count; } /* Find good key positions. */ void Search::find_positions () { /* If the user gave the key positions, we use them. */ if (option[POSITIONS]) { _key_positions = option.get_key_positions(); return; } /* Compute preliminary alpha_unify table. */ unsigned int *alpha_unify = compute_alpha_unify (); /* 1. Find positions that must occur in order to distinguish duplicates. */ Positions mandatory; if (!option[DUP]) { for (KeywordExt_List *l1 = _head; l1 && l1->rest(); l1 = l1->rest()) { KeywordExt *keyword1 = l1->first(); for (KeywordExt_List *l2 = l1->rest(); l2; l2 = l2->rest()) { KeywordExt *keyword2 = l2->first(); /* If keyword1 and keyword2 have the same length and differ in just one position, and it is not the last character, this position is mandatory. */ if (keyword1->_allchars_length == keyword2->_allchars_length) { int n = keyword1->_allchars_length; int i; for (i = 0; i < n - 1; i++) { unsigned char c1 = keyword1->_allchars[i]; unsigned char c2 = keyword2->_allchars[i]; if (option[UPPERLOWER]) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) break; } if (i < n - 1) { int j; for (j = i + 1; j < n; j++) { unsigned char c1 = keyword1->_allchars[j]; unsigned char c2 = keyword2->_allchars[j]; if (option[UPPERLOWER]) { if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; } if (c1 != c2) break; } if (j >= n) { /* Position i is mandatory. */ if (!mandatory.contains (i)) mandatory.add (i); } } } } } } /* 2. Add positions, as long as this decreases the duplicates count. */ int imax = (_max_key_len - 1 < Positions::MAX_KEY_POS - 1 ? _max_key_len - 1 : Positions::MAX_KEY_POS - 1); Positions current = mandatory; unsigned int current_duplicates_count = count_duplicates_tuple (current, alpha_unify); for (;;) { Positions best; unsigned int best_duplicates_count = UINT_MAX; for (int i = imax; i >= -1; i--) if (!current.contains (i)) { Positions tryal = current; tryal.add (i); unsigned int try_duplicates_count = count_duplicates_tuple (tryal, alpha_unify); /* We prefer 'try' to 'best' if it produces less duplicates, or if it produces the same number of duplicates but with a more efficient hash function. */ if (try_duplicates_count < best_duplicates_count || (try_duplicates_count == best_duplicates_count && i >= 0)) { best = tryal; best_duplicates_count = try_duplicates_count; } } /* Stop adding positions when it gives no improvement. */ if (best_duplicates_count >= current_duplicates_count) break; current = best; current_duplicates_count = best_duplicates_count; } /* 3. Remove positions, as long as this doesn't increase the duplicates count. */ for (;;) { Positions best; unsigned int best_duplicates_count = UINT_MAX; for (int i = imax; i >= -1; i--) if (current.contains (i) && !mandatory.contains (i)) { Positions tryal = current; tryal.remove (i); unsigned int try_duplicates_count = count_duplicates_tuple (tryal, alpha_unify); /* We prefer 'try' to 'best' if it produces less duplicates, or if it produces the same number of duplicates but with a more efficient hash function. */ if (try_duplicates_count < best_duplicates_count || (try_duplicates_count == best_duplicates_count && i == -1)) { best = tryal; best_duplicates_count = try_duplicates_count; } } /* Stop removing positions when it gives no improvement. */ if (best_duplicates_count > current_duplicates_count) break; current = best; current_duplicates_count = best_duplicates_count; } /* 4. Replace two positions by one, as long as this doesn't increase the duplicates count. */ for (;;) { Positions best; unsigned int best_duplicates_count = UINT_MAX; /* Loop over all pairs { i1, i2 } of currently selected positions. W.l.o.g. we can assume i1 > i2. */ for (int i1 = imax; i1 >= -1; i1--) if (current.contains (i1) && !mandatory.contains (i1)) { for (int i2 = i1 - 1; i2 >= -1; i2--) if (current.contains (i2) && !mandatory.contains (i2)) { for (int i3 = imax; i3 >= -1; i3--) if (!current.contains (i3)) { Positions tryal = current; tryal.remove (i1); tryal.remove (i2); tryal.add (i3); unsigned int try_duplicates_count = count_duplicates_tuple (tryal, alpha_unify); /* We prefer 'try' to 'best' if it produces less duplicates, or if it produces the same number of duplicates but with a more efficient hash function. */ if (try_duplicates_count < best_duplicates_count || (try_duplicates_count == best_duplicates_count && (i1 == -1 || i2 == -1) && i3 >= 0)) { best = tryal; best_duplicates_count = try_duplicates_count; } } } } /* Stop removing positions when it gives no improvement. */ if (best_duplicates_count > current_duplicates_count) break; current = best; current_duplicates_count = best_duplicates_count; } /* That's it. Hope it's good enough. */ _key_positions = current; if (option[DEBUG]) { /* Print the result. */ fprintf (stderr, "\nComputed positions: "); PositionReverseIterator iter = _key_positions.reviterator(); bool seen_lastchar = false; bool first = true; for (int i; (i = iter.next ()) != PositionReverseIterator::EOS; ) { if (!first) fprintf (stderr, ", "); if (i == Positions::LASTCHAR) seen_lastchar = true; else { fprintf (stderr, "%d", i + 1); first = false; } } if (seen_lastchar) { if (!first) fprintf (stderr, ", "); fprintf (stderr, "$"); } fprintf (stderr, "\n"); } /* Free preliminary alpha_unify table. */ delete[] alpha_unify; } /* Count the duplicate keywords that occur with the found set of positions. In other words, it returns the difference # K - # proj1 (K) where K is the multiset of given keywords. */ unsigned int Search::count_duplicates_tuple () const { unsigned int *alpha_unify = compute_alpha_unify (); unsigned int count = count_duplicates_tuple (_key_positions, alpha_unify); delete[] alpha_unify; return count; } /* ===================== Finding good alpha increments ===================== */ /* Computes the upper bound on the indices passed to asso_values[]. */ unsigned int Search::compute_alpha_size (const unsigned int *alpha_inc) const { unsigned int max_alpha_inc = 0; for (int i = 0; i < _max_key_len; i++) if (max_alpha_inc < alpha_inc[i]) max_alpha_inc = alpha_inc[i]; return (option[SEVENBIT] ? 128 : 256) + max_alpha_inc; } /* Computes the unification rules between different asso_values[c]. */ unsigned int * Search::compute_alpha_unify (const Positions& positions, const unsigned int *alpha_inc) const { if (option[UPPERLOWER]) { /* Without alpha increments, we would simply unify 'A' -> 'a', ..., 'Z' -> 'z'. But when a keyword contains at position i a character c, we have the constraint asso_values[tolower(c) + alpha_inc[i]] == asso_values[toupper(c) + alpha_inc[i]]. This introduces a unification toupper(c) + alpha_inc[i] -> tolower(c) + alpha_inc[i]. Note that this unification can extend outside the range of ASCII letters! But still every unified character pair is at a distance of 'a'-'A' = 32, or (after chained unification) at a multiple of 32. So in the end the alpha_unify vector has the form c -> c + 32 * f(c) where f(c) is a nonnegative integer. */ unsigned int alpha_size = compute_alpha_size (alpha_inc); unsigned int *alpha_unify = new unsigned int[alpha_size]; for (unsigned int c = 0; c < alpha_size; c++) alpha_unify[c] = c; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* Iterate through the selected character positions. */ PositionIterator iter = positions.iterator(keyword->_allchars_length); for (int i; (i = iter.next ()) != PositionIterator::EOS; ) { unsigned int c; if (i == Positions::LASTCHAR) c = static_cast(keyword->_allchars[keyword->_allchars_length - 1]); else if (i < keyword->_allchars_length) c = static_cast(keyword->_allchars[i]); else abort (); if (c >= 'A' && c <= 'Z') c += 'a' - 'A'; if (c >= 'a' && c <= 'z') { if (i != Positions::LASTCHAR) c += alpha_inc[i]; /* Unify c with c - ('a'-'A'). */ unsigned int d = alpha_unify[c]; unsigned int b = c - ('a'-'A'); for (int a = b; a >= 0 && alpha_unify[a] == b; a -= ('a'-'A')) alpha_unify[a] = d; } } } return alpha_unify; } else /* Identity mapping. */ return NULL; } /* Initializes each keyword's _selchars array. */ void Search::init_selchars_multiset (const Positions& positions, const unsigned int *alpha_unify, const unsigned int *alpha_inc) const { for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) temp->first()->init_selchars_multiset(positions, alpha_unify, alpha_inc); } /* Count the duplicate keywords that occur with the given set of positions and a given alpha_inc[] array. In other words, it returns the difference # K - # proj2 (proj1 (K)) where K is the multiset of given keywords. */ unsigned int Search::count_duplicates_multiset (const unsigned int *alpha_inc) const { /* Run through the keyword list and count the duplicates incrementally. The result does not depend on the order of the keyword list, thanks to the formula above. */ unsigned int *alpha_unify = compute_alpha_unify (_key_positions, alpha_inc); init_selchars_multiset (_key_positions, alpha_unify, alpha_inc); unsigned int count = 0; { Hash_Table representatives (_total_keys, !_hash_includes_len); for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); if (representatives.insert (keyword)) count++; } } delete_selchars (); delete[] alpha_unify; return count; } /* Find good _alpha_inc[]. */ void Search::find_alpha_inc () { /* The goal is to choose _alpha_inc[] such that it doesn't introduce artificial duplicates. In other words, the goal is # proj2 (proj1 (K)) = # proj1 (K). */ unsigned int duplicates_goal = count_duplicates_tuple (); /* Start with zero increments. This is sufficient in most cases. */ unsigned int *current = new unsigned int [_max_key_len]; for (int i = 0; i < _max_key_len; i++) current[i] = 0; unsigned int current_duplicates_count = count_duplicates_multiset (current); if (current_duplicates_count > duplicates_goal) { /* Look which _alpha_inc[i] we are free to increment. */ unsigned int nindices; { nindices = 0; PositionIterator iter = _key_positions.iterator(_max_key_len); for (;;) { int key_pos = iter.next (); if (key_pos == PositionIterator::EOS) break; if (key_pos != Positions::LASTCHAR) nindices++; } } DYNAMIC_ARRAY (indices, unsigned int, nindices); { unsigned int j = 0; PositionIterator iter = _key_positions.iterator(_max_key_len); for (;;) { int key_pos = iter.next (); if (key_pos == PositionIterator::EOS) break; if (key_pos != Positions::LASTCHAR) indices[j++] = key_pos; } if (!(j == nindices)) abort (); } /* Perform several rounds of searching for a good alpha increment. Each round reduces the number of artificial collisions by adding an increment in a single key position. */ DYNAMIC_ARRAY (best, unsigned int, _max_key_len); DYNAMIC_ARRAY (tryal, unsigned int, _max_key_len); do { /* An increment of 1 is not always enough. Try higher increments also. */ for (unsigned int inc = 1; ; inc++) { unsigned int best_duplicates_count = UINT_MAX; for (unsigned int j = 0; j < nindices; j++) { memcpy (tryal, current, _max_key_len * sizeof (unsigned int)); tryal[indices[j]] += inc; unsigned int try_duplicates_count = count_duplicates_multiset (tryal); /* We prefer 'try' to 'best' if it produces less duplicates. */ if (try_duplicates_count < best_duplicates_count) { memcpy (best, tryal, _max_key_len * sizeof (unsigned int)); best_duplicates_count = try_duplicates_count; } } /* Stop this round when we got an improvement. */ if (best_duplicates_count < current_duplicates_count) { memcpy (current, best, _max_key_len * sizeof (unsigned int)); current_duplicates_count = best_duplicates_count; break; } } } while (current_duplicates_count > duplicates_goal); FREE_DYNAMIC_ARRAY (tryal); FREE_DYNAMIC_ARRAY (best); if (option[DEBUG]) { /* Print the result. */ fprintf (stderr, "\nComputed alpha increments: "); bool first = true; for (unsigned int j = nindices; j-- > 0; ) if (current[indices[j]] != 0) { if (!first) fprintf (stderr, ", "); fprintf (stderr, "%u:+%u", indices[j] + 1, current[indices[j]]); first = false; } fprintf (stderr, "\n"); } FREE_DYNAMIC_ARRAY (indices); } _alpha_inc = current; _alpha_size = compute_alpha_size (_alpha_inc); _alpha_unify = compute_alpha_unify (_key_positions, _alpha_inc); } /* ======================= Finding good asso_values ======================== */ /* Initializes the asso_values[] related parameters. */ void Search::prepare_asso_values () { KeywordExt_List *temp; /* Initialize each keyword's _selchars array. */ init_selchars_multiset(_key_positions, _alpha_unify, _alpha_inc); /* Compute the maximum _selchars_length over all keywords. */ _max_selchars_length = _key_positions.iterator(_max_key_len).remaining(); /* Check for duplicates, i.e. keywords with the same _selchars array (and - if _hash_includes_len - also the same length). We deal with these by building an equivalence class, so that only 1 keyword is representative of the entire collection. Only this representative remains in the keyword list; the others are accessible through the _duplicate_link chain, starting at the representative. This *greatly* simplifies processing during later stages of the program. Set _total_duplicates and _list_len = _total_keys - _total_duplicates. */ { _list_len = _total_keys; _total_duplicates = 0; /* Make hash table for efficiency. */ Hash_Table representatives (_list_len, !_hash_includes_len); KeywordExt_List *prev = NULL; /* list node before temp */ for (temp = _head; temp; ) { KeywordExt *keyword = temp->first(); KeywordExt *other_keyword = representatives.insert (keyword); KeywordExt_List *garbage = NULL; if (other_keyword) { _total_duplicates++; _list_len--; /* Remove keyword from the main list. */ prev->rest() = temp->rest(); garbage = temp; /* And insert it on other_keyword's duplicate list. */ keyword->_duplicate_link = other_keyword->_duplicate_link; other_keyword->_duplicate_link = keyword; /* Complain if user hasn't enabled the duplicate option. */ if (!option[DUP] || option[DEBUG]) { fprintf (stderr, "Key link: \"%.*s\" = \"%.*s\", with key set \"", keyword->_allchars_length, keyword->_allchars, other_keyword->_allchars_length, other_keyword->_allchars); for (int j = 0; j < keyword->_selchars_length; j++) putc (keyword->_selchars[j], stderr); fprintf (stderr, "\".\n"); } } else { keyword->_duplicate_link = NULL; prev = temp; } temp = temp->rest(); if (garbage) delete garbage; } if (option[DEBUG]) representatives.dump(); } /* Exit program if duplicates exists and option[DUP] not set, since we don't want to continue in this case. (We don't want to turn on option[DUP] implicitly, because the generated code is usually much slower. */ if (_total_duplicates) { if (option[DUP]) fprintf (stderr, "%d input keys have identical hash values, examine output carefully...\n", _total_duplicates); else { fprintf (stderr, "%d input keys have identical hash values,\n", _total_duplicates); if (option[POSITIONS]) fprintf (stderr, "try different key positions or use option -D.\n"); else fprintf (stderr, "use option -D.\n"); exit (1); } } /* Compute the occurrences of each character in the alphabet. */ _occurrences = new int[_alpha_size]; memset (_occurrences, 0, _alpha_size * sizeof (_occurrences[0])); for (temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); const unsigned int *ptr = keyword->_selchars; for (int count = keyword->_selchars_length; count > 0; ptr++, count--) _occurrences[*ptr]++; } /* Memory allocation. */ _asso_values = new int[_alpha_size]; int non_linked_length = _list_len; unsigned int asso_value_max; asso_value_max = static_cast(non_linked_length * option.get_size_multiple()); /* Round up to the next power of two. This makes it easy to ensure an _asso_value[c] is >= 0 and < asso_value_max. Also, the jump value being odd, it guarantees that Search::try_asso_value() will iterate through different values for _asso_value[c]. */ if (asso_value_max == 0) asso_value_max = 1; asso_value_max |= asso_value_max >> 1; asso_value_max |= asso_value_max >> 2; asso_value_max |= asso_value_max >> 4; asso_value_max |= asso_value_max >> 8; asso_value_max |= asso_value_max >> 16; asso_value_max++; _asso_value_max = asso_value_max; /* Given the bound for _asso_values[c], we have a bound for the possible hash values, as computed in compute_hash(). */ _max_hash_value = (_hash_includes_len ? _max_key_len : 0) + (_asso_value_max - 1) * _max_selchars_length; /* Allocate a sparse bit vector for detection of collisions of hash values. */ _collision_detector = new Bool_Array (_max_hash_value + 1); if (option[DEBUG]) { fprintf (stderr, "total non-linked keys = %d\nmaximum associated value is %d" "\nmaximum size of generated hash table is %d\n", non_linked_length, asso_value_max, _max_hash_value); int field_width; field_width = 0; { for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); if (field_width < keyword->_selchars_length) field_width = keyword->_selchars_length; } } fprintf (stderr, "\ndumping the keyword list without duplicates\n"); fprintf (stderr, "keyword #, %*s, keyword\n", field_width, "keysig"); int i = 0; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); fprintf (stderr, "%9d, ", ++i); if (field_width > keyword->_selchars_length) fprintf (stderr, "%*s", field_width - keyword->_selchars_length, ""); for (int j = 0; j < keyword->_selchars_length; j++) putc (keyword->_selchars[j], stderr); fprintf (stderr, ", %.*s\n", keyword->_allchars_length, keyword->_allchars); } fprintf (stderr, "\nend of keyword list\n\n"); } if (option[RANDOM] || option.get_jump () == 0) /* We will use rand(), so initialize the random number generator. */ srand (static_cast(time (0))); _initial_asso_value = (option[RANDOM] ? -1 : option.get_initial_asso_value ()); _jump = option.get_jump (); } /* Finds some _asso_values[] that fit. */ /* The idea is to choose the _asso_values[] one by one, in a way that a choice that has been made never needs to be undone later. This means that we split the work into several steps. Each step chooses one or more _asso_values[c]. The result of choosing one or more _asso_values[c] is that the partitioning of the keyword set gets broader. Look at this partitioning: After every step, the _asso_values[] of a certain set C of characters are undetermined. (At the beginning, C is the set of characters c with _occurrences[c] > 0. At the end, C is empty.) To each keyword K, we associate the multiset of _selchars for which the _asso_values[] are undetermined: K --> K->_selchars intersect C. Consider two keywords equivalent if their value under this mapping is the same. This introduces an equivalence relation on the set of keywords. The equivalence classes partition the keyword set. (At the beginning, the partition is the finest possible: each K is an equivalence class by itself, because all K have a different _selchars. At the end, all K have been merged into a single equivalence class.) The partition before a step is always a refinement of the partition after the step. We choose the steps in such a way that the partition really becomes broader at each step. (A step that only chooses an _asso_values[c] without changing the partition is better merged with the previous step, to avoid useless backtracking.) */ struct EquivalenceClass { /* The keywords in this equivalence class. */ KeywordExt_List * _keywords; KeywordExt_List * _keywords_last; /* The number of keywords in this equivalence class. */ unsigned int _cardinality; /* The undetermined selected characters for the keywords in this equivalence class, as a canonically reordered multiset. */ unsigned int * _undetermined_chars; unsigned int _undetermined_chars_length; EquivalenceClass * _next; }; struct Step { /* The characters whose values are being determined in this step. */ unsigned int _changing_count; unsigned int * _changing; /* Exclusive upper bound for the _asso_values[c] of this step. A power of 2. */ unsigned int _asso_value_max; /* The characters whose values will be determined after this step. */ bool * _undetermined; /* The keyword set partition after this step. */ EquivalenceClass * _partition; /* The expected number of iterations in this step. */ double _expected_lower; double _expected_upper; Step * _next; }; static inline bool equals (const unsigned int *ptr1, const unsigned int *ptr2, unsigned int len) { while (len > 0) { if (*ptr1 != *ptr2) return false; ptr1++; ptr2++; len--; } return true; } EquivalenceClass * Search::compute_partition (bool *undetermined) const { EquivalenceClass *partition = NULL; EquivalenceClass *partition_last = NULL; for (KeywordExt_List *temp = _head; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); /* Compute the undetermined characters for this keyword. */ unsigned int *undetermined_chars = new unsigned int[keyword->_selchars_length]; unsigned int undetermined_chars_length = 0; for (int i = 0; i < keyword->_selchars_length; i++) if (undetermined[keyword->_selchars[i]]) undetermined_chars[undetermined_chars_length++] = keyword->_selchars[i]; /* Look up the equivalence class to which this keyword belongs. */ EquivalenceClass *equclass; for (equclass = partition; equclass; equclass = equclass->_next) if (equclass->_undetermined_chars_length == undetermined_chars_length && equals (equclass->_undetermined_chars, undetermined_chars, undetermined_chars_length)) break; if (equclass == NULL) { equclass = new EquivalenceClass(); equclass->_keywords = NULL; equclass->_keywords_last = NULL; equclass->_cardinality = 0; equclass->_undetermined_chars = undetermined_chars; equclass->_undetermined_chars_length = undetermined_chars_length; equclass->_next = NULL; if (partition) partition_last->_next = equclass; else partition = equclass; partition_last = equclass; } else delete[] undetermined_chars; /* Add the keyword to the equivalence class. */ KeywordExt_List *cons = new KeywordExt_List(keyword); if (equclass->_keywords) equclass->_keywords_last->rest() = cons; else equclass->_keywords = cons; equclass->_keywords_last = cons; equclass->_cardinality++; } /* Free some of the allocated memory. The caller doesn't need it. */ for (EquivalenceClass *cls = partition; cls; cls = cls->_next) delete[] cls->_undetermined_chars; return partition; } static void delete_partition (EquivalenceClass *partition) { while (partition != NULL) { EquivalenceClass *equclass = partition; partition = equclass->_next; delete_list (equclass->_keywords); //delete[] equclass->_undetermined_chars; // already freed above delete equclass; } } /* Compute the possible number of collisions when _asso_values[c] is chosen, leading to the given partition. */ unsigned int Search::count_possible_collisions (EquivalenceClass *partition, unsigned int c) const { /* Every equivalence class p is split according to the frequency of occurrence of c, leading to equivalence classes p1, p2, ... This leads to (|p|^2 - |p1|^2 - |p2|^2 - ...)/2 possible collisions. Return the sum of this expression over all equivalence classes. */ unsigned int sum = 0; unsigned int m = _max_selchars_length; DYNAMIC_ARRAY (split_cardinalities, unsigned int, m + 1); for (EquivalenceClass *cls = partition; cls; cls = cls->_next) { for (unsigned int i = 0; i <= m; i++) split_cardinalities[i] = 0; for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); unsigned int count = 0; for (int i = 0; i < keyword->_selchars_length; i++) if (keyword->_selchars[i] == c) count++; split_cardinalities[count]++; } sum += cls->_cardinality * cls->_cardinality; for (unsigned int i = 0; i <= m; i++) sum -= split_cardinalities[i] * split_cardinalities[i]; } FREE_DYNAMIC_ARRAY (split_cardinalities); return sum; } /* Test whether adding c to the undetermined characters changes the given partition. */ bool Search::unchanged_partition (EquivalenceClass *partition, unsigned int c) const { for (EquivalenceClass *cls = partition; cls; cls = cls->_next) { unsigned int first_count = UINT_MAX; for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); unsigned int count = 0; for (int i = 0; i < keyword->_selchars_length; i++) if (keyword->_selchars[i] == c) count++; if (temp == cls->_keywords) first_count = count; else if (count != first_count) /* c would split this equivalence class. */ return false; } } return true; } void Search::find_asso_values () { Step *steps; /* Determine the steps, starting with the last one. */ { bool *undetermined; bool *determined; steps = NULL; undetermined = new bool[_alpha_size]; for (unsigned int c = 0; c < _alpha_size; c++) undetermined[c] = false; determined = new bool[_alpha_size]; for (unsigned int c = 0; c < _alpha_size; c++) determined[c] = true; for (;;) { /* Compute the partition that needs to be refined. */ EquivalenceClass *partition = compute_partition (undetermined); /* Determine the main character to be chosen in this step. Choosing such a character c has the effect of splitting every equivalence class (according the the frequency of occurrence of c). We choose the c with the minimum number of possible collisions, so that characters which lead to a large number of collisions get handled early during the search. */ unsigned int chosen_c; unsigned int chosen_possible_collisions; { unsigned int best_c = 0; unsigned int best_possible_collisions = UINT_MAX; for (unsigned int c = 0; c < _alpha_size; c++) if (_occurrences[c] > 0 && determined[c]) { unsigned int possible_collisions = count_possible_collisions (partition, c); if (possible_collisions < best_possible_collisions) { best_c = c; best_possible_collisions = possible_collisions; } } if (best_possible_collisions == UINT_MAX) { /* All c with _occurrences[c] > 0 are undetermined. We are are the starting situation and don't need any more step. */ delete_partition (partition); break; } chosen_c = best_c; chosen_possible_collisions = best_possible_collisions; } /* We need one more step. */ Step *step = new Step(); step->_undetermined = new bool[_alpha_size]; memcpy (step->_undetermined, undetermined, _alpha_size*sizeof(bool)); step->_partition = partition; /* Now determine how the equivalence classes will be before this step. */ undetermined[chosen_c] = true; partition = compute_partition (undetermined); /* Now determine which other characters should be determined in this step, because they will not change the equivalence classes at this point. It is the set of all c which, for all equivalence classes, have the same frequency of occurrence in every keyword of the equivalence class. */ for (unsigned int c = 0; c < _alpha_size; c++) if (_occurrences[c] > 0 && determined[c] && unchanged_partition (partition, c)) { undetermined[c] = true; determined[c] = false; } /* main_c must be one of these. */ if (determined[chosen_c]) abort (); /* Now the set of changing characters of this step. */ unsigned int changing_count; changing_count = 0; for (unsigned int c = 0; c < _alpha_size; c++) if (undetermined[c] && !step->_undetermined[c]) changing_count++; unsigned int *changing = new unsigned int[changing_count]; changing_count = 0; for (unsigned int c = 0; c < _alpha_size; c++) if (undetermined[c] && !step->_undetermined[c]) changing[changing_count++] = c; step->_changing = changing; step->_changing_count = changing_count; step->_asso_value_max = _asso_value_max; step->_expected_lower = exp (static_cast(chosen_possible_collisions) / static_cast(_max_hash_value)); step->_expected_upper = exp (static_cast(chosen_possible_collisions) / static_cast(_asso_value_max)); delete_partition (partition); step->_next = steps; steps = step; } delete[] determined; delete[] undetermined; } if (option[DEBUG]) { unsigned int stepno = 0; for (Step *step = steps; step; step = step->_next) { stepno++; fprintf (stderr, "Step %u chooses _asso_values[", stepno); for (unsigned int i = 0; i < step->_changing_count; i++) { if (i > 0) fprintf (stderr, ","); fprintf (stderr, "'%c'", step->_changing[i]); } fprintf (stderr, "], expected number of iterations between %g and %g.\n", step->_expected_lower, step->_expected_upper); fprintf (stderr, "Keyword equivalence classes:\n"); for (EquivalenceClass *cls = step->_partition; cls; cls = cls->_next) { fprintf (stderr, "\n"); for (KeywordExt_List *temp = cls->_keywords; temp; temp = temp->rest()) { KeywordExt *keyword = temp->first(); fprintf (stderr, " %.*s\n", keyword->_allchars_length, keyword->_allchars); } } fprintf (stderr, "\n"); } } /* Initialize _asso_values[]. (The value given here matters only for those c which occur in all keywords with equal multiplicity.) */ for (unsigned int c = 0; c < _alpha_size; c++) _asso_values[c] = 0; unsigned int stepno = 0; for (Step *step = steps; step; step = step->_next) { stepno++; /* Initialize the asso_values[]. */ unsigned int k = step->_changing_count; for (unsigned int i = 0; i < k; i++) { unsigned int c = step->_changing[i]; _asso_values[c] = (_initial_asso_value < 0 ? rand () : _initial_asso_value) & (step->_asso_value_max - 1); } unsigned int iterations = 0; DYNAMIC_ARRAY (iter, unsigned int, k); for (unsigned int i = 0; i < k; i++) iter[i] = 0; unsigned int ii = (_jump != 0 ? k - 1 : 0); for (;;) { /* Test whether these asso_values[] lead to collisions among the equivalence classes that should be collision-free. */ bool has_collision = false; for (EquivalenceClass *cls = step->_partition; cls; cls = cls->_next) { /* Iteration Number array is a win, O(1) initialization time! */ _collision_detector->clear (); for (KeywordExt_List *ptr = cls->_keywords; ptr; ptr = ptr->rest()) { KeywordExt *keyword = ptr->first(); /* Compute the new hash code for the keyword, leaving apart the yet undetermined asso_values[]. */ int hashcode; { int sum = _hash_includes_len ? keyword->_allchars_length : 0; const unsigned int *p = keyword->_selchars; int i = keyword->_selchars_length; for (; i > 0; p++, i--) if (!step->_undetermined[*p]) sum += _asso_values[*p]; hashcode = sum; } /* See whether it collides with another keyword's hash code, from the same equivalence class. */ if (_collision_detector->set_bit (hashcode)) { has_collision = true; break; } } /* Don't need to continue looking at the other equivalence classes if we already have found a collision. */ if (has_collision) break; } iterations++; if (!has_collision) break; /* Try other asso_values[]. */ if (_jump != 0) { /* The way we try various values for asso_values[step->_changing[0],...step->_changing[k-1]] is like this: for (bound = 0,1,...) for (ii = 0,...,k-1) iter[ii] := bound iter[0..ii-1] := values <= bound iter[ii+1..k-1] := values < bound and asso_values[step->_changing[i]] = _initial_asso_value + iter[i] * _jump. This makes it more likely to find small asso_values[]. */ unsigned int bound = iter[ii]; unsigned int i = 0; while (i < ii) { unsigned int c = step->_changing[i]; iter[i]++; _asso_values[c] = (_asso_values[c] + _jump) & (step->_asso_value_max - 1); if (iter[i] <= bound) goto found_next; _asso_values[c] = (_asso_values[c] - iter[i] * _jump) & (step->_asso_value_max - 1); iter[i] = 0; i++; } i = ii + 1; while (i < k) { unsigned int c = step->_changing[i]; iter[i]++; _asso_values[c] = (_asso_values[c] + _jump) & (step->_asso_value_max - 1); if (iter[i] < bound) goto found_next; _asso_values[c] = (_asso_values[c] - iter[i] * _jump) & (step->_asso_value_max - 1); iter[i] = 0; i++; } /* Switch from one ii to the next. */ { unsigned int c = step->_changing[ii]; _asso_values[c] = (_asso_values[c] - bound * _jump) & (step->_asso_value_max - 1); iter[ii] = 0; } /* Here all iter[i] == 0. */ ii++; if (ii == k) { ii = 0; bound++; if (bound == step->_asso_value_max) { /* Out of search space! We can either backtrack, or increase the available search space of this step. It seems simpler to choose the latter solution. */ step->_asso_value_max = 2 * step->_asso_value_max; if (step->_asso_value_max > _asso_value_max) { _asso_value_max = step->_asso_value_max; /* Reinitialize _max_hash_value. */ _max_hash_value = (_hash_includes_len ? _max_key_len : 0) + (_asso_value_max - 1) * _max_selchars_length; /* Reinitialize _collision_detector. */ delete _collision_detector; _collision_detector = new Bool_Array (_max_hash_value + 1); } } } { unsigned int c = step->_changing[ii]; iter[ii] = bound; _asso_values[c] = (_asso_values[c] + bound * _jump) & (step->_asso_value_max - 1); } found_next: ; } else { /* Random. */ unsigned int c = step->_changing[ii]; _asso_values[c] = (_asso_values[c] + rand ()) & (step->_asso_value_max - 1); /* Next time, change the next c. */ ii++; if (ii == k) ii = 0; } } FREE_DYNAMIC_ARRAY (iter); if (option[DEBUG]) { fprintf (stderr, "Step %u chose _asso_values[", stepno); for (unsigned int i = 0; i < step->_changing_count; i++) { if (i > 0) fprintf (stderr, ","); fprintf (stderr, "'%c'", step->_changing[i]); } fprintf (stderr, "] in %u iterations.\n", iterations); } } /* Free allocated memory. */ while (steps != NULL) { Step *step = steps; steps = step->_next; delete[] step->_changing; delete[] step->_undetermined; delete_partition (step->_partition); delete step; } } /* Computes a keyword's hash value, relative to the current _asso_values[], and stores it in keyword->_hash_value. */ inline int Search::compute_hash (KeywordExt *keyword) const { int sum = _hash_includes_len ? keyword->_allchars_length : 0; const unsigned int *p = keyword->_selchars; int i = keyword->_selchars_length; for (; i > 0; p++, i--) sum += _asso_values[*p]; return keyword->_hash_value = sum; } /* Finds good _asso_values[]. */ void Search::find_good_asso_values () { prepare_asso_values (); /* Search for good _asso_values[]. */ int asso_iteration; if ((asso_iteration = option.get_asso_iterations ()) == 0) /* Try only the given _initial_asso_value and _jump. */ find_asso_values (); else { /* Try different pairs of _initial_asso_value and _jump, in the following order: (0, 1) (1, 1) (2, 1) (0, 3) (3, 1) (1, 3) (4, 1) (2, 3) (0, 5) (5, 1) (3, 3) (1, 5) ..... */ KeywordExt_List *saved_head = _head; int best_initial_asso_value = 0; int best_jump = 1; int *best_asso_values = new int[_alpha_size]; int best_collisions = INT_MAX; int best_max_hash_value = INT_MAX; _initial_asso_value = 0; _jump = 1; for (;;) { /* Restore the keyword list in its original order. */ _head = copy_list (saved_head); /* Find good _asso_values[]. */ find_asso_values (); /* Test whether it is the best solution so far. */ int collisions = 0; int max_hash_value = INT_MIN; _collision_detector->clear (); for (KeywordExt_List *ptr = _head; ptr; ptr = ptr->rest()) { KeywordExt *keyword = ptr->first(); int hashcode = compute_hash (keyword); if (max_hash_value < hashcode) max_hash_value = hashcode; if (_collision_detector->set_bit (hashcode)) collisions++; } if (collisions < best_collisions || (collisions == best_collisions && max_hash_value < best_max_hash_value)) { memcpy (best_asso_values, _asso_values, _alpha_size * sizeof (_asso_values[0])); best_collisions = collisions; best_max_hash_value = max_hash_value; } /* Delete the copied keyword list. */ delete_list (_head); if (--asso_iteration == 0) break; /* Prepare for next iteration. */ if (_initial_asso_value >= 2) _initial_asso_value -= 2, _jump += 2; else _initial_asso_value += _jump, _jump = 1; } _head = saved_head; /* Install the best found asso_values. */ _initial_asso_value = best_initial_asso_value; _jump = best_jump; memcpy (_asso_values, best_asso_values, _alpha_size * sizeof (_asso_values[0])); delete[] best_asso_values; /* The keywords' _hash_value fields are recomputed below. */ } } /* ========================================================================= */ /* Comparison function for sorting by increasing _hash_value. */ static bool less_by_hash_value (KeywordExt *keyword1, KeywordExt *keyword2) { return keyword1->_hash_value < keyword2->_hash_value; } /* Sorts the keyword list by hash value. */ void Search::sort () { _head = mergesort_list (_head, less_by_hash_value); } void Search::optimize () { /* Preparations. */ prepare (); /* Step 1: Finding good byte positions. */ find_positions (); /* Step 2: Finding good alpha increments. */ find_alpha_inc (); /* Step 3: Finding good asso_values. */ find_good_asso_values (); /* Make one final check, just to make sure nothing weird happened.... */ _collision_detector->clear (); for (KeywordExt_List *curr_ptr = _head; curr_ptr; curr_ptr = curr_ptr->rest()) { KeywordExt *curr = curr_ptr->first(); unsigned int hashcode = compute_hash (curr); if (_collision_detector->set_bit (hashcode)) { /* This shouldn't happen. proj1, proj2, proj3 must have been computed to be injective on the given keyword set. */ fprintf (stderr, "\nInternal error, unexpected duplicate hash code\n"); if (option[POSITIONS]) fprintf (stderr, "try options -m or -r, or use new key positions.\n\n"); else fprintf (stderr, "try options -m or -r.\n\n"); exit (1); } } /* Sorts the keyword list by hash value. */ sort (); /* Set unused asso_values[c] to max_hash_value + 1. This is not absolutely necessary, but speeds up the lookup function in many cases of lookup failure: no string comparison is needed once the hash value of a string is larger than the hash value of any keyword. */ int max_hash_value; { KeywordExt_List *temp; for (temp = _head; temp->rest(); temp = temp->rest()) ; max_hash_value = temp->first()->_hash_value; } for (unsigned int c = 0; c < _alpha_size; c++) if (_occurrences[c] == 0) _asso_values[c] = max_hash_value + 1; /* Propagate unified asso_values. */ if (_alpha_unify) { for (unsigned int c = 0; c < _alpha_size; c++) if (_alpha_unify[c] != c) _asso_values[c] = _asso_values[_alpha_unify[c]]; } } /* Prints out some diagnostics upon completion. */ Search::~Search () { delete _collision_detector; if (option[DEBUG]) { fprintf (stderr, "\ndumping occurrence and associated values tables\n"); for (unsigned int i = 0; i < _alpha_size; i++) if (_occurrences[i]) fprintf (stderr, "asso_values[%c] = %6d, occurrences[%c] = %6d\n", i, _asso_values[i], i, _occurrences[i]); fprintf (stderr, "end table dumping\n"); fprintf (stderr, "\nDumping key list information:\ntotal non-static linked keywords = %d" "\ntotal keywords = %d\ntotal duplicates = %d\nmaximum key length = %d\n", _list_len, _total_keys, _total_duplicates, _max_key_len); int field_width = _max_selchars_length; fprintf (stderr, "\nList contents are:\n(hash value, key length, index, %*s, keyword):\n", field_width, "selchars"); for (KeywordExt_List *ptr = _head; ptr; ptr = ptr->rest()) { fprintf (stderr, "%11d,%11d,%6d, ", ptr->first()->_hash_value, ptr->first()->_allchars_length, ptr->first()->_final_index); if (field_width > ptr->first()->_selchars_length) fprintf (stderr, "%*s", field_width - ptr->first()->_selchars_length, ""); for (int j = 0; j < ptr->first()->_selchars_length; j++) putc (ptr->first()->_selchars[j], stderr); fprintf (stderr, ", %.*s\n", ptr->first()->_allchars_length, ptr->first()->_allchars); } fprintf (stderr, "End dumping list.\n\n"); } delete[] _asso_values; delete[] _occurrences; delete[] _alpha_unify; delete[] _alpha_inc; } gperf-3.2.1/NEWS0000664000000000000000000001056514776760542007001 New in 3.2.1: * The generated code avoids -Wundef warnings in C++ mode. New in 3.2: * The input file may now use Windows line terminators (CR/LF) instead of Unix line terminators (LF). Note: This is an incompatible change. If you want to use a keyword that ends in a CR byte, such as xyz, write it as "xyz\r". * The generated code avoids several types of warnings: - "implicit fallthrough" warnings in 'switch' statements. - "unused parameter" warnings regarding 'str' or 'len'. - "missing initializer for field ..." warnings. - "zero as null pointer constant" warnings. New in 3.1: * The generated C code is now in ANSI-C by default. If you want to support pre-ANSI-C compilers, you need to provide the option --language=C on the command line or %language=C in the source file. * The 'len' parameter of the hash function and of the lookup function is now of type 'size_t' instead of 'unsigned int'. This makes it safe to call these functions with strings of length > 4 GB, on 64-bit machines. * Added option --constants-prefix. * Added declaration %define constants-prefix. New in 3.0.4: * gperf is now licensed under the GPL version 3 or newer. * The generated C code gives less warnings with gcc-4.2.x in c99 or gnu99 mode. New in 3.0.3: * The generated C code is compatible with gcc-4.3.x in c99 or gnu99 mode. New in 3.0.2: * Compiles with g++-4.0.x. * Added option --length-table-name. * Added declaration %define length-table-name. * Fixed #line directives for filenames containing backslashes. New in 3.0.1: * Bug fix. New in 3.0: * Added option --output that allows to specify the output file name. * Some options have been renamed: --hash-fn-name=NAME --> --hash-function-name=NAME --lookup-fn-name=NAME --> --lookup-function-name=NAME --compare-strlen --> --compare-lengths --global --> --global-table The older variants are still supported for backward compatibility. * The following options can now be specified inside the input file: %delimiters=DELIMITER-LIST %struct-type %ignore-case %language=LANGUAGE-NAME %define slot-name NAME %define initializer-suffix INITIALIZERS %define hash-function-name NAME %define lookup-function-name NAME %define class-name NAME %7bit %compare-lengths %compare-strncmp %readonly-tables %enum %includes %global-table %pic %define string-pool-name NAME %null-strings %define word-array-name NAME %switch=COUNT %omit-struct-type * When the option -k is not given, the default key positions are now computed depending on the set of keywords. * If the input file is given by name, the output file will now contain #line directives referring to the input file. * Some keyword sets containing permutations, like { "xy", "yx", "xz", "zx" } or { "abc", "acb", "bca", "cab" }, are now handled by gperf without requiring the option -D. * The generated table is usually much smaller than it was with earlier versions of gperf. * Added option -m/--multiple-iterations that allows to further reduce the size of the generated table. * When the search for a good hash function is not immediately successful, the table's size will grow as needed. Earlier versions of gperf bailed out with an "Internal error, duplicate hash code value". * The options -f/--fast and -o/--occurrence-sort have no effect any more. * Added options -P/--pic and --null-strings that optimize the generated code for use in shared libraries. -P/--pic does a perfect optimization but may require some small code changes (see the documentation for details), whereas --null-strings does only a half-hearted optimization but works without needing any change to surrounding code. * Added option --ignore-case that produces a case independent lookup function. * Bug fixes. New in 2.7.2: * Keywords may now be enclosed in double quotes; this permits the use of '#', ',', space or NUL inside keywords. * Bug fixes. New in 2.7.1: * Added option "-F" for gcc. New in 2.7: * gperf is now a stand-alone package, untied from libg++. * Autoconfiguring. * Removed the "-a" and "-g" options, extended the "-L" option instead. * Removed the "-p" option, it is the default. * Added long options ("--help", "--version" etc.). * 8-bit cleanliness is now the default; use "-7" to get the old behaviour. * Compiles with any C++ compiler. * Numerous small improvements. gperf-3.2.1/README0000664000000000000000000000246714242503347007146 This is GNU gperf. It is a program that generates perfect hash functions for sets of key words. A perfect hash function is: A hash function and a data structure that allows recognition of a key word in a set of words using exactly 1 probe into the data structure. The doc/gperf.html file explains how the program works, the form of the input, what options are available, and hints on choosing the best options for particular key words set. See the file NEWS for a list of major changes in the current release. See the file INSTALL for compilation and installation instructions. See the file JOIN-GNU to read how you can join the GNU project. Output from the GPERF program is used to recognize reserved words in the GNU C, GNU C++, and GNU Pascal compilers, as well as with the GNU indent program. For general documentation on the coding and usage standards this distribution follows, see the GNU standards document https://www.gnu.org/prep/standards/standards.html, especially the sections 'Makefile Conventions', 'How Configuration Should Work', and 'Standards for Interfaces Generally'. Mail suggestions and bug reports to . When reporting bugs, please include in the subject line the package name and version (output of 'gperf --version') for which you found a problem. gperf-3.2.1/JOIN-GNU0000664000000000000000000000123414242502766007372 Join the GNU Project ==================== GNU gperf is part of the GNU Operating System, developed by the GNU Project. If you are the author of an awesome program and want to join us in writing Free (libre) Software, please consider making it an official GNU program and become a GNU Maintainer. Instructions on how to do this are here: https://www.gnu.org/help/evaluation We are looking forward to hacking with you! Don't have a program to contribute? Look at all the other ways to help: https://www.gnu.org/help/help.html And to learn more about Free (libre) Software in general, please read and share this page: https://gnu.org/philosophy/free-sw.html gperf-3.2.1/configure.ac0000664000000000000000000000252613736447042010556 dnl autoconf configuration for gperf dnl Copyright (C) 1998-2020 Free Software Foundation, Inc. dnl Written by Douglas C. Schmidt dnl and Bruno Haible . dnl dnl This file is part of GNU GPERF. dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_PREREQ([2.64]) AC_INIT AC_CONFIG_SRCDIR([doc/gperf.texi]) AC_CONFIG_AUX_DIR([build-aux]) AC_PROG_MAKE_SET AC_OBJEXT AC_EXEEXT AC_CONFIG_FILES([Makefile]) AC_CONFIG_SUBDIRS([lib src tests doc]) dnl This piece of sed script replaces every line containing '@subdir@' dnl by several consecutive lines, each referencing one subdir. extrasub="$extrasub"' /@subdir@/{ h g s/@subdir@/lib/ p g s/@subdir@/src/ p g s/@subdir@/tests/ p g s/@subdir@/doc/ p d } ' AC_OUTPUT gperf-3.2.1/INSTALL.windows0000664000000000000000000002551414447301217011005 Installation on Microsoft Windows: There are three ways to create binaries of this package for Microsoft Windows: 1) Native binaries, built using the mingw tool chain. 2) Native binaries, built using the MS Visual C/C++ tool chain. 3) Binaries for the Cygwin environment. =============================================================================== 1) Native binaries, built using the mingw tool chain. I recommend to use the Cygwin environment as the development environment (*) and mingw only as the target (runtime, deployment) environment. For this, you need to install * Cygwin (from https://cygwin.com/), * some packages available from the Cygwin package installer: make * the mingw cross-compilation tools and runtime package, available from the Cygwin package installer (setup-x86_64.exe): - for creating 32-bit binaries: packages mingw64-i686-gcc-core, mingw64-i686-gcc-g++, mingw64-i686-headers, mingw64-i686-runtime - for creating 64-bit binaries: packages mingw64-x86_64-gcc-core, mingw64-x86_64-gcc-g++, mingw64-x86_64-headers, mingw64-x86_64-runtime Building 32-bit binaries for mingw is achieved through the following preparation, configure, and build commands: PATH=/usr/local/mingw32/bin:/usr/i686-w64-mingw32/sys-root/mingw/bin:$PATH export PATH ./configure --host=i686-w64-mingw32 --prefix=/usr/local/mingw32 \ CC=i686-w64-mingw32-gcc \ CXX=i686-w64-mingw32-g++ \ CPPFLAGS="-I/usr/local/mingw32/include -Wall" \ LDFLAGS="-L/usr/local/mingw32/lib" make make check Building 64-bit binaries for mingw is achieved through the following preparation, configure, and build commands: PATH=/usr/local/mingw64/bin:/usr/x86_64-w64-mingw32/sys-root/mingw/bin:$PATH export PATH ./configure --host=x86_64-w64-mingw32 --prefix=/usr/local/mingw64 \ CC=x86_64-w64-mingw32-gcc \ CXX=x86_64-w64-mingw32-g++ \ CPPFLAGS="-I/usr/local/mingw64/include -Wall" \ LDFLAGS="-L/usr/local/mingw64/lib" make make check Installation: make install (*) Note: The MSYS2 environment as a development environment is *not* supported. This environment contains an ignoble and ignominious hack: In a program invocation, the program *by default* receives different arguments than the ones that the caller has passed. See . All program invocations in this environment are therefore unreliable. =============================================================================== 2) Native binaries, built using the MS Visual C/C++ tool chain. Note that binaries created with MSVC have a distribution constraint: They depend on a closed-source library ('msvcr90.dll' for MSVC 9.0, 'vcruntime140.dll' for MSVC 14.0, and so on) which is not normally part of a Windows installation. You cannot distribute 'vcruntime*.dll' with the binaries - this would be a violation of the GPL and of the Microsoft EULA. You can distribute the binaries without including 'vcruntime*.dll'. Users who don't have this library on their system will require to pull some files (api-ms-win*.dll) through the Windows Update mechanism, see https://support.microsoft.com/en-us/kb/2999226 . This recipe requires MS Visual C/C++ 9.0 or newer. You don't need the Visual Studio IDE, just the C/C++ tool chain. As of 2016, you can install the MS Visual C/C++ 14.0 tool chain from http://landinghub.visualstudio.com/visual-cpp-build-tools (it's the file visualcppbuildtools_full.exe). This recipe requires also a Cygwin environment (with 'bash', the common POSIX commands, and 'make') as a build environment. Building with 'nmake' is not supported. For this, you need to install * Cygwin (from https://cygwin.com/), * some packages available from the Cygwin package installer: make You also need the scripts 'ar-lib' and 'compile' from https://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/ar-lib;hb=HEAD https://git.savannah.gnu.org/gitweb/?p=automake.git;a=blob_plain;f=lib/compile;hb=HEAD respectively. They may also be included in this package, in directory 'build-aux/'. Save them; the instructions below assume that you stored them in $HOME/msvc/. Make them executable: chmod a+x ar-lib compile Start a bash (from Cygwin). Make sure that the MSVC tools ("cl" etc.) are found in PATH and the environment variables INCLUDE and LIB are set appropriately. In a typical MSVC 9.0 installation, it can be achieved by running C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat In a typical MSVC 14.0 installation on Windows 10, it can be achieved - for creating 32-bit binaries: through the following bash commands: # Set environment variables for using MSVC 14, # for creating native 32-bit Windows executables. # Windows C library headers and libraries. WindowsCrtIncludeDir='C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt' WindowsCrtLibDir='C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\' INCLUDE="${WindowsCrtIncludeDir};$INCLUDE" LIB="${WindowsCrtLibDir}x86;$LIB" # Windows API headers and libraries. WindowsSdkIncludeDir='C:\Program Files (x86)\Windows Kits\8.1\Include\' WindowsSdkLibDir='C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\' INCLUDE="${WindowsSdkIncludeDir}um;${WindowsSdkIncludeDir}shared;$INCLUDE" LIB="${WindowsSdkLibDir}x86;$LIB" # Visual C++ tools, headers and libraries. VSINSTALLDIR='C:\Program Files (x86)\Microsoft Visual Studio 14.0' VCINSTALLDIR="${VSINSTALLDIR}"'\VC' PATH=`cygpath -u "${VCINSTALLDIR}"`/bin:"$PATH" INCLUDE="${VCINSTALLDIR}"'\include;'"${INCLUDE}" LIB="${VCINSTALLDIR}"'\lib;'"${LIB}" export INCLUDE LIB - for creating 64-bit binaries: through the following bash commands: # Set environment variables for using MSVC 14, # for creating native 64-bit Windows executables. # Windows C library headers and libraries. WindowsCrtIncludeDir='C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt' WindowsCrtLibDir='C:\Program Files (x86)\Windows Kits\10\Lib\10.0.10240.0\ucrt\' INCLUDE="${WindowsCrtIncludeDir};$INCLUDE" LIB="${WindowsCrtLibDir}x64;$LIB" # Windows API headers and libraries. WindowsSdkIncludeDir='C:\Program Files (x86)\Windows Kits\8.1\Include\' WindowsSdkLibDir='C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\' INCLUDE="${WindowsSdkIncludeDir}um;${WindowsSdkIncludeDir}shared;$INCLUDE" LIB="${WindowsSdkLibDir}x64;$LIB" # Visual C++ tools, headers and libraries. VSINSTALLDIR='C:\Program Files (x86)\Microsoft Visual Studio 14.0' VCINSTALLDIR="${VSINSTALLDIR}"'\VC' PATH=`cygpath -u "${VCINSTALLDIR}"`/bin/amd64:"$PATH" INCLUDE="${VCINSTALLDIR}"'\include;'"${INCLUDE}" LIB="${VCINSTALLDIR}"'\lib\amd64;'"${LIB}" export INCLUDE LIB Building 32-bit binaries with MSVC is achieved through the following preparation, configure, and build commands: PATH=/usr/local/msvc32/bin:$PATH export PATH win32_target=_WIN32_WINNT_WINXP # for MSVC 9.0 win32_target=_WIN32_WINNT_VISTA # possibly for MSVC >= 10.0 win32_target=_WIN32_WINNT_WIN7 # possibly for MSVC >= 10.0 win32_target=_WIN32_WINNT_WIN8 # possibly for MSVC >= 10.0 ./configure --host=i686-w64-mingw32 --prefix=/usr/local/msvc32 \ CC="$HOME/msvc/compile cl -nologo" \ CFLAGS="-MD" \ CXX="$HOME/msvc/compile cl -nologo" \ CXXFLAGS="-MD" \ CPPFLAGS="-D_WIN32_WINNT=$win32_target -I/usr/local/msvc32/include" \ LDFLAGS="-L/usr/local/msvc32/lib" \ LD="link" \ NM="dumpbin -symbols" \ STRIP=":" \ AR="$HOME/msvc/ar-lib lib" \ RANLIB=":" make make check Building 64-bit binaries with MSVC is achieved through the following preparation, configure, and build commands: PATH=/usr/local/msvc64/bin:$PATH export PATH win32_target=_WIN32_WINNT_WINXP # for MSVC 9.0 win32_target=_WIN32_WINNT_VISTA # possibly for MSVC >= 10.0 win32_target=_WIN32_WINNT_WIN7 # possibly for MSVC >= 10.0 win32_target=_WIN32_WINNT_WIN8 # possibly for MSVC >= 10.0 ./configure --host=x86_64-w64-mingw32 --prefix=/usr/local/msvc64 \ CC="$HOME/msvc/compile cl -nologo" \ CFLAGS="-MD" \ CXX="$HOME/msvc/compile cl -nologo" \ CXXFLAGS="-MD" \ CPPFLAGS="-D_WIN32_WINNT=$win32_target -I/usr/local/msvc64/include" \ LDFLAGS="-L/usr/local/msvc64/lib" \ LD="link" \ NM="dumpbin -symbols" \ STRIP=":" \ AR="$HOME/msvc/ar-lib lib" \ RANLIB=":" make make check Installation: make install =============================================================================== 3) Binaries for the Cygwin environment. The generic instructions in the INSTALL file apply. But here are more specific ones. You need to install * Cygwin (from https://cygwin.com/), * some packages available from the Cygwin package installer: make * the Cygwin [cross-]compilation tools package, available from the Cygwin package installer (setup-x86_64.exe): - for creating 32-bit binaries: packages cygwin32-gcc-core, cygwin32-gcc-g++, cygwin32 - for creating 64-bit binaries: packages gcc-core, gcc-g++ Building 32-bit binaries for Cygwin is achieved through the following preparation, configure, and build commands: PATH=/usr/local/cygwin32/bin:/usr/i686-pc-cygwin/sys-root/usr/bin:$PATH export PATH ./configure --host=i686-pc-cygwin --prefix=/usr/local/cygwin32 \ CC=i686-pc-cygwin-gcc \ CXX=i686-pc-cygwin-g++ \ CPPFLAGS="-I/usr/local/cygwin32/include -Wall" \ LDFLAGS="-L/usr/local/cygwin32/lib" make make check Building 64-bit binaries for Cygwin is achieved through the following preparation, configure, and build commands: PATH=/usr/local/cygwin64/bin:$PATH export PATH ./configure --host=x86_64-pc-cygwin --prefix=/usr/local/cygwin64 \ CC=x86_64-pc-cygwin-gcc \ CXX=x86_64-pc-cygwin-g++ \ CPPFLAGS="-I/usr/local/cygwin64/include -Wall" \ LDFLAGS="-L/usr/local/cygwin64/lib" make make check Installation: make install =============================================================================== gperf-3.2.1/AUTHORS0000664000000000000000000000012013074402054007311 Douglas C. Schmidt Bruno Haible gperf-3.2.1/autogen.sh0000775000000000000000000000224514543756740010274 #!/bin/sh # Convenience script for regenerating all autogeneratable files that are # omitted from the version control repository. In particular, this script # also regenerates all config.h.in, configure files with new versions of # autoconf. # # This script requires autoconf-2.64..2.72 in the PATH. # Copyright (C) 2003-2023 Free Software Foundation, Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # Prerequisite (if not used from a released tarball): ./autopull.sh # Usage: ./autogen.sh make -f Makefile.devel totally-clean all || exit $? echo "$0: done. Now you can run './configure'." gperf-3.2.1/lib/0000775000000000000000000000000014776761171007120 5gperf-3.2.1/lib/filename.h0000664000000000000000000001110614774103067010760 /* Basic filename support macros. Copyright (C) 2001-2025 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see . */ /* From Paul Eggert and Jim Meyering. */ #ifndef _FILENAME_H #define _FILENAME_H #include #ifdef __cplusplus extern "C" { #endif /* Filename support. ISSLASH(C) tests whether C is a directory separator character. HAS_DEVICE(Filename) tests whether Filename contains a device specification. FILE_SYSTEM_PREFIX_LEN(Filename) length of the device specification at the beginning of Filename, index of the part consisting of alternating components and slashes. FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 when a non-empty device specification can be followed by an empty or relative part, 0 when a non-empty device specification must be followed by a slash, 0 when device specification don't exist. IS_ABSOLUTE_FILE_NAME(Filename) tests whether Filename is independent of any notion of "current directory". IS_RELATIVE_FILE_NAME(Filename) tests whether Filename may be concatenated to a directory filename. Note: On native Windows, OS/2, DOS, "c:" is neither an absolute nor a relative file name! IS_FILE_NAME_WITH_DIR(Filename) tests whether Filename contains a device or directory specification. */ #if defined _WIN32 || defined __CYGWIN__ \ || defined __EMX__ || defined __MSDOS__ || defined __DJGPP__ /* Native Windows, Cygwin, OS/2, DOS */ # define ISSLASH(C) ((C) == '/' || (C) == '\\') /* Internal macro: Tests whether a character is a drive letter. */ # define _IS_DRIVE_LETTER(C) \ (((C) >= 'A' && (C) <= 'Z') || ((C) >= 'a' && (C) <= 'z')) /* Help the compiler optimizing it. This assumes ASCII. */ # undef _IS_DRIVE_LETTER # define _IS_DRIVE_LETTER(C) \ (((unsigned int) (C) | ('a' - 'A')) - 'a' <= 'z' - 'a') # define HAS_DEVICE(Filename) \ (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':') # define FILE_SYSTEM_PREFIX_LEN(Filename) (HAS_DEVICE (Filename) ? 2 : 0) # ifdef __CYGWIN__ # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 # else /* On native Windows, OS/2, DOS, the system has the notion of a "current directory" on each drive. */ # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 1 # endif # if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE # define IS_ABSOLUTE_FILE_NAME(Filename) \ ISSLASH ((Filename)[FILE_SYSTEM_PREFIX_LEN (Filename)]) # else # define IS_ABSOLUTE_FILE_NAME(Filename) \ (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename)) # endif # define IS_RELATIVE_FILE_NAME(Filename) \ (! (ISSLASH ((Filename)[0]) || HAS_DEVICE (Filename))) # define IS_FILE_NAME_WITH_DIR(Filename) \ (strchr ((Filename), '/') != NULL || strchr ((Filename), '\\') != NULL \ || HAS_DEVICE (Filename)) #else /* Unix */ # define ISSLASH(C) ((C) == '/') # define HAS_DEVICE(Filename) ((void) (Filename), 0) # define FILE_SYSTEM_PREFIX_LEN(Filename) ((void) (Filename), 0) # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0 # define IS_ABSOLUTE_FILE_NAME(Filename) ISSLASH ((Filename)[0]) # define IS_RELATIVE_FILE_NAME(Filename) (! ISSLASH ((Filename)[0])) # define IS_FILE_NAME_WITH_DIR(Filename) (strchr ((Filename), '/') != NULL) #endif /* Deprecated macros. For backward compatibility with old users of the 'filename' module. */ #define IS_ABSOLUTE_PATH IS_ABSOLUTE_FILE_NAME #define IS_PATH_WITH_DIR IS_FILE_NAME_WITH_DIR #ifdef __cplusplus } #endif #endif /* _FILENAME_H */ gperf-3.2.1/lib/getline.h0000664000000000000000000000335513347736327010644 /* Copyright (C) 1995, 2000-2003 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef GETLINE_H_ # define GETLINE_H_ 1 # include # include /* Like the glibc functions get_line and get_delim, except that the result must be freed using delete[], not free(). */ /* Reads up to (and including) a newline from STREAM into *LINEPTR (and null-terminate it). *LINEPTR is a pointer returned from new [] (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or immediate EOF. */ extern int get_line (char **lineptr, size_t *n, FILE *stream); /* Reads up to (and including) a DELIMITER from STREAM into *LINEPTR (and null-terminate it). *LINEPTR is a pointer returned from new [] (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or immediate EOF. */ extern int get_delim (char **lineptr, size_t *n, int delimiter, FILE *stream); #endif /* not GETLINE_H_ */ gperf-3.2.1/lib/configure0000775000000000000000000047360014774103073010746 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='' PACKAGE_TARNAME='' PACKAGE_VERSION='' PACKAGE_STRING='' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="hash.cc" ac_subst_vars='LTLIBOBJS LIBOBJS INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM RANLIB AR CXXCPP ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC SET_MAKE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Auxiliary files required by this configure script. ac_aux_files="install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/../build-aux" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP ;; esac fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="${ac_tool_prefix}ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="ar" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AR" = x; then AR="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi else AR="$ac_cv_prog_AR" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gperf-3.2.1/lib/hash.cc0000664000000000000000000000111013074402054010241 /* Copyright (C) 1990, 2000, 2002 Free Software Foundation written by Doug Lea */ #include /* Some useful hash function. It's not a particularly good hash function (<< 5 would be better than << 4), but people believe in it because it comes from Dragon book. */ unsigned int hashpjw (const unsigned char *x, unsigned int len) // From Dragon book, p436 { unsigned int h = 0; unsigned int g; for (; len > 0; len--) { h = (h << 4) + *x++; if ((g = h & 0xf0000000) != 0) h = (h ^ (g >> 24)) ^ g; } return h; } gperf-3.2.1/lib/Makefile.in0000664000000000000000000000643513347736331011106 # Makefile for gperf/lib # Copyright (C) 1989, 1992-1993, 1998, 2002, 2006, 2009, 2012, 2016 Free Software Foundation, Inc. # Written by Douglas C. Schmidt # and Bruno Haible . # # This file is part of GNU GPERF. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #### Start of system configuration section. #### # Directories used by "make": srcdir = @srcdir@ # Directories used by "make install": prefix = @prefix@ local_prefix = /usr/local exec_prefix = @exec_prefix@ # Programs used by "make": # C compiler CC = @CC@ CFLAGS = @CFLAGS@ CPP = @CPP@ # C++ compiler CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ CXXCPP = @CXXCPP@ # Both C and C++ compiler OBJEXT = @OBJEXT@ # Other AR = @AR@ AR_FLAGS = rc RANLIB = @RANLIB@ MV = mv LN = ln RM = rm -f @SET_MAKE@ # Programs used by "make install": INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) OBJECTS = getopt.$(OBJEXT) getopt1.$(OBJEXT) getline.$(OBJEXT) hash.$(OBJEXT) CPPFLAGS = @CPPFLAGS@ -I$(srcdir) TARGETLIB = libgp.a all : $(TARGETLIB) $(TARGETLIB): $(OBJECTS) $(RM) $@ $(AR) $(AR_FLAGS) $@ $(OBJECTS) $(RANLIB) $@ # Don't use implicit rules, since AIX "make" and OSF/1 "make" don't always # expand $< correctly in this context. # #%.o : %.c # $(CC) $(CFLAGS) $(CPPFLAGS) -c $< # #%.o : %.cc # $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $< getopt.$(OBJEXT) : getopt.c getopt.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt.c getopt1.$(OBJEXT) : getopt1.c getopt.h $(CC) $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/getopt1.c getline.$(OBJEXT) : getline.cc getline.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/getline.cc hash.$(OBJEXT) : hash.cc hash.h $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(srcdir)/hash.cc install : all installdirs : uninstall : check : all mostlyclean : clean clean : force $(RM) *~ *.s *.$(OBJEXT) *.a $(TARGETLIB) core distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean # List of source files. SOURCE_FILES = \ configure.ac Makefile.in \ getline.h getline.cc \ hash.h hash.cc \ getopt.h getopt.c getopt1.c # List of distributed files imported from other packages. IMPORTED_FILES = # List of distributed files generated by autotools or Makefile.devel. GENERATED_FILES = \ configure # List of distributed files generated by "make". DISTRIBUTED_BUILT_FILES = # List of distributed files. DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES) distdir : $(DISTFILES) for file in $(DISTFILES); do \ if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \ cp -p $$dir/$$file '$(distdir)'/$$file || exit 1; \ done force : gperf-3.2.1/lib/getline.cc0000664000000000000000000000657713722700276011002 /* getline.c -- Replacement for GNU C library function getline Copyright (C) 1993, 1996, 2001-2003, 2020 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* Written by Jan Brittenson, bson@gnu.ai.mit.edu. */ /* Specification. */ #include "getline.h" #include #include #include #include /* Always add at least this many bytes when extending the buffer. */ #define MIN_CHUNK 64 /* Reads up to (and including) a TERMINATOR from STREAM into *LINEPTR + OFFSET (and null-terminate it). *LINEPTR is a pointer returned from new [] (or NULL), pointing to *N characters of space. It is realloc'd as necessary. Returns the number of characters read (not including the null terminator), or -1 on error or immediate EOF. NOTE: There is another getstr() function declared in . */ static int getstr (char **lineptr, size_t *n, FILE *stream, char terminator, size_t offset) { size_t nchars_avail; /* Allocated but unused chars in *LINEPTR. */ char *read_pos; /* Where we're reading into *LINEPTR. */ if (!lineptr || !n || !stream) return -1; if (!*lineptr) { *n = MIN_CHUNK; *lineptr = new char[*n]; } nchars_avail = *n - offset; read_pos = *lineptr + offset; for (;;) { int c = getc (stream); /* We always want at least one char left in the buffer, since we always (unless we get an error while reading the first char) NUL-terminate the line buffer. */ assert (*n - nchars_avail == (size_t) (read_pos - *lineptr)); if (nchars_avail < 2) { if (*n > MIN_CHUNK) *n *= 2; else *n += MIN_CHUNK; nchars_avail = *n + *lineptr - read_pos; char *new_line = new char[*n]; if (*lineptr) { memcpy (new_line, *lineptr, read_pos - *lineptr); delete[] *lineptr; } *lineptr = new_line; read_pos = *n - nchars_avail + *lineptr; assert (*n - nchars_avail == (size_t) (read_pos - *lineptr)); } if (c == EOF || ferror (stream)) { /* Return partial line, if any. */ if (read_pos == *lineptr) return -1; else break; } *read_pos++ = c; nchars_avail--; if (c == terminator) /* Return the line. */ break; } /* Done - NUL terminate and return the number of chars read. */ *read_pos = '\0'; return read_pos - (*lineptr + offset); } int get_line (char **lineptr, size_t *n, FILE *stream) { return getstr (lineptr, n, stream, '\n', 0); } int get_delim (char **lineptr, size_t *n, int delimiter, FILE *stream) { return getstr (lineptr, n, stream, delimiter, 0); } gperf-3.2.1/lib/configure.ac0000664000000000000000000000304614630031131011300 dnl autoconf configuration for gperf/lib dnl Copyright (C) 1998-2024 Free Software Foundation, Inc. dnl Written by Douglas C. Schmidt dnl and Bruno Haible . dnl dnl This file is part of GNU GPERF. dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_PREREQ([2.64]) AC_INIT AC_CONFIG_SRCDIR([hash.cc]) AC_CONFIG_AUX_DIR([../build-aux]) AC_PROG_MAKE_SET dnl dnl checks for programs dnl AC_PROG_CC dnl sets variable CC AC_PROG_CPP dnl sets variable CPP AC_PROG_CXX dnl sets variable CXX AC_PROG_CXXCPP dnl sets variable CXXCPP AC_CHECK_TOOL([AR], [ar]) dnl sets variable AR AC_PROG_RANLIB dnl sets variable RANLIB AC_PROG_INSTALL dnl sets variables INSTALL, INSTALL_DATA, INSTALL_PROGRAM dnl dnl That's it. dnl AC_CONFIG_FILES([Makefile]) AC_OUTPUT gperf-3.2.1/lib/hash.h0000664000000000000000000000061613074402054010115 // This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988, 1992, 2000, 2002 Free Software Foundation written by Doug Lea */ #ifndef _hash_h #define _hash_h 1 /* a hash function for char[] arrays using the method described in Aho, Sethi, & Ullman, p 436. */ extern unsigned int hashpjw (const unsigned char *string, unsigned int len); #endif gperf-3.2.1/lib/getopt1.c0000664000000000000000000000773113347736341010571 /* getopt_long and getopt_long_only entry points for GNU getopt. Copyright (C) 1987-1998, 2016 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifdef HAVE_CONFIG_H #include #endif #include "getopt.h" #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ #include #endif int getopt_long (int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } /* Like getopt_long, but '-' as well as '--' can indicate a long option. If an option that starts with '-' (not '--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. */ int getopt_long_only (int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 1); } #endif /* Not ELIDE_CODE. */ #ifdef TEST #include int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 0, 0, 0}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:0123456789", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf ("\n"); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case 'd': printf ("option d with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ gperf-3.2.1/lib/getopt.h0000664000000000000000000001066513347736343010517 /* Declarations for getopt. Copyright (C) 1989-1998, 2000, 2016 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { const char *name; /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 #ifdef __cplusplus /* SunOS4 declares getopt with the following prototype: extern int getopt (int argc, const char *const *argv, const char *shortopts); We cannot redeclare it when compiling C++ code. */ #define getopt(x,y,z) getopt_long(x, y, z, (const struct option *) 0, (int *) 0) #else /* not __cplusplus */ #ifdef __GNU_LIBRARY__ /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #else /* not __GNU_LIBRARY__ */ extern int getopt (); #endif /* __GNU_LIBRARY__ */ #endif /* __cplusplus */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); #ifdef __cplusplus } #endif #endif /* getopt.h */ gperf-3.2.1/lib/getopt.c0000664000000000000000000007033514306253213010474 /* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to drepper@gnu.org before changing it! Copyright (C) 1987-1998, 2009, 2016, 2022 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* This tells Alpha OSF/1 not to define a getopt prototype in . Ditto for AIX 3.2 and . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #ifdef HAVE_CONFIG_H #include #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #define GETOPT_INTERFACE_VERSION 2 #if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 #include #if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION #define ELIDE_CODE #endif #endif #ifndef ELIDE_CODE /* Get size_t. */ #include /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #include #endif /* GNU C library. */ #ifdef VMS #include #if HAVE_STRING_H - 0 #include #endif #endif #ifndef _ /* This is for other GNU distributions with internationalized messages. When compiling libc, the _ macro is predefined. */ #ifdef HAVE_LIBINTL_H # include # define _(msgid) gettext (msgid) #else # define _(msgid) (msgid) #endif #endif /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = NULL; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns -1, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* 1003.2 says this must be 1 before any call. */ int optind = 1; /* Formerly, initialization of getopt depended on optind==0, which causes problems with re-calling getopt as programs generally don't know that. */ int __getopt_initialized = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ int optopt = '?'; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return -1 with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; /* Value of POSIXLY_CORRECT environment variable. */ static char *posixly_correct; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #else /* Avoid depending on library functions or files whose names are inconsistent. */ extern char *getenv (); static char * my_index (const char *str, int chr) { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } extern int strcmp (const char *, const char *); extern int strncmp (const char *, const char *, size_t); extern size_t strlen (const char *); #endif /* not __GNU_LIBRARY__ */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; #ifdef _LIBC /* Bash 2.0 gives us an environment variable containing flags indicating ARGV elements that should not be considered arguments. */ /* Defined in getopt_init.c */ extern char *__getopt_nonoption_flags; static int nonoption_flags_max_len; static int nonoption_flags_len; static int original_argc; static char *const *original_argv; /* Make sure the environment variable bash 2.0 puts in the environment is valid for the getopt call we must make sure that the ARGV passed to getopt is that one passed to the process. */ static void __attribute__ ((unused)) store_args_and_env (int argc, char *const *argv) { /* XXX This is no good solution. We should rather copy the args so that we can compare them later. But we must not use malloc(3). */ original_argc = argc; original_argv = argv; } # ifdef text_set_element text_set_element (__libc_subinit, store_args_and_env); # endif /* text_set_element */ # define SWAP_FLAGS(ch1, ch2) \ if (nonoption_flags_len > 0) \ { \ char __tmp = __getopt_nonoption_flags[ch1]; \ __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ __getopt_nonoption_flags[ch2] = __tmp; \ } #else /* !_LIBC */ # define SWAP_FLAGS(ch1, ch2) #endif /* _LIBC */ /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. */ static void exchange (char **argv) { int bottom = first_nonopt; int middle = last_nonopt; int top = optind; char *tem; /* Exchange the shorter segment with the far end of the longer segment. That puts the shorter segment into the right place. It leaves the longer segment in the right place overall, but it consists of two parts that need to be swapped next. */ #ifdef _LIBC /* First make sure the handling of the `__getopt_nonoption_flags' string can work normally. Our top argument must be in the range of the string. */ if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) { /* We must extend the array. The user plays games with us and presents new arguments. */ char *new_str = malloc (top + 1); if (new_str == NULL) nonoption_flags_len = nonoption_flags_max_len = 0; else { memset (__mempcpy (new_str, __getopt_nonoption_flags, nonoption_flags_max_len), '\0', top + 1 - nonoption_flags_max_len); nonoption_flags_max_len = top + 1; __getopt_nonoption_flags = new_str; } } #endif while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { /* Bottom segment is the short one. */ int len = middle - bottom; register int i; /* Swap it with the top part of the top segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); } /* Exclude the moved bottom segment from further swapping. */ top -= len; } else { /* Top segment is the short one. */ int len = top - middle; register int i; /* Swap it with the bottom part of the bottom segment. */ for (i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; SWAP_FLAGS (bottom + i, middle + i); } /* Exclude the moved top segment from further swapping. */ bottom += len; } } /* Update records for the slots the non-options now occupy. */ first_nonopt += (optind - last_nonopt); last_nonopt = optind; } /* Initialize the internal data when the first call is made. */ static const char * _getopt_initialize (int argc, char *const *argv, const char *optstring) { /* Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ first_nonopt = last_nonopt = optind; nextchar = NULL; posixly_correct = getenv ("POSIXLY_CORRECT"); /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (posixly_correct != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; #ifdef _LIBC if (posixly_correct == NULL && argc == original_argc && argv == original_argv) { if (nonoption_flags_max_len == 0) { if (__getopt_nonoption_flags == NULL || __getopt_nonoption_flags[0] == '\0') nonoption_flags_max_len = -1; else { const char *orig_str = __getopt_nonoption_flags; int len = nonoption_flags_max_len = strlen (orig_str); if (nonoption_flags_max_len < argc) nonoption_flags_max_len = argc; __getopt_nonoption_flags = (char *) malloc (nonoption_flags_max_len); if (__getopt_nonoption_flags == NULL) nonoption_flags_max_len = -1; else memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), '\0', nonoption_flags_max_len - len); } } nonoption_flags_len = nonoption_flags_max_len; } else nonoption_flags_len = 0; #endif return optstring; } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns -1. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return '?' after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return '?'. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (int argc, char *const *argv, const char *optstring, const struct option *longopts, int *longind, int long_only) { optarg = NULL; if (optind == 0 || !__getopt_initialized) { if (optind == 0) optind = 1; /* Don't scan ARGV[0], the program name. */ optstring = _getopt_initialize (argc, argv, optstring); __getopt_initialized = 1; } /* Test whether ARGV[optind] points to a non-option argument. Either it does not have option syntax, or there is an environment flag from the shell indicating it is not an option. The later information is only used when the used in the GNU libc. */ #ifdef _LIBC #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ || (optind < nonoption_flags_len \ && __getopt_nonoption_flags[optind] == '1')) #else #define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') #endif if (nextchar == NULL || *nextchar == '\0') { /* Advance to the next ARGV-element. */ /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been moved back by the user (who may also have changed the arguments). */ if (last_nonopt > optind) last_nonopt = optind; if (first_nonopt > optind) first_nonopt = optind; if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && NONOPTION_P) optind++; last_nonopt = optind; } /* The special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return -1; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if (NONOPTION_P) { if (ordering == REQUIRE_ORDER) return -1; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Skip the initial punctuation. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } /* Decode the current option-ARGV-element. */ /* Check whether the ARGV-element is a long option. If long_only and the ARGV-element has the form "-f", where f is a valid short option, don't consider it an abbreviated form of a long option that starts with f. Otherwise there would be no way to give the -f short option. On the other hand, if there's a long option "fubar" and the ARGV-element is "-fu", do consider that an abbreviation of the long option, just like "--fu", and not "-f" with arg "u". This distinction seems to be the most useful approach. */ if (longopts != NULL && (argv[optind][1] == '-' || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = -1; int option_index; for (nameend = nextchar; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == (unsigned int) strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `%s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; optind++; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, _("%s: option `--%s' doesn't allow an argument\n"), argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, _("%s: option `%c%s' doesn't allow an argument\n"), argv[0], argv[optind - 1][0], pfound->name); } nextchar += strlen (nextchar); optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, _("%s: unrecognized option `--%s'\n"), argv[0], nextchar); else /* +option or -option */ fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; optopt = 0; return '?'; } } /* Look at and handle the next short option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { if (posixly_correct) /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); else fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); } optopt = c; return '?'; } /* Convenience. Treat POSIX -W foo same as long option --foo */ if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option *p; const struct option *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; /* optarg is now the argument, see if it's in the table of longopts. */ for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) /* Do nothing. */ ; /* Test all long options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, nameend - nextchar)) { if ((unsigned int) (nameend - nextchar) == strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second or later nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), argv[0], argv[optind]); nextchar += strlen (nextchar); optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = nameend + 1; else { if (opterr) fprintf (stderr, _("\ %s: option `-W %s' doesn't allow an argument\n"), argv[0], pfound->name); nextchar += strlen (nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, _("%s: option `%s' requires an argument\n"), argv[0], argv[optind - 1]); nextchar += strlen (nextchar); return optstring[0] == ':' ? ':' : '?'; } } nextchar += strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } nextchar = NULL; return 'W'; /* Let the application handle it. */ } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = NULL; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { /* 1003.2 specifies the format of this message. */ fprintf (stderr, _("%s: option requires an argument -- %c\n"), argv[0], c); } optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } #endif /* Not ELIDE_CODE. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == -1) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ gperf-3.2.1/aclocal.m40000664000000000000000000000002214603523055010106 AC_PREREQ([2.64]) gperf-3.2.1/tests/0000775000000000000000000000000014776761171007514 5gperf-3.2.1/tests/incomplete.gperf0000664000000000000000000000041513074402054012576 struct month; %% january, 1, 31, 31 february, 2, 28, 29 march, 3, 31, 31 april, 4, 30, 30 may, 5, 31, 31 june, 6, 30, 30 july, 7, 31, 31 august, 8, 31, 31 september, 9, 30, 30 october, 10, 31, 31 november, 11, 30, 30 december, 12, 31, 31 gperf-3.2.1/tests/charsets.gperf0000664000000000000000000003253313347737027012277 %{ /* Generated from IANA charset data from https://www.iana.org/assignments/character-sets by charsets.awk */ /* last updated 2002-06-14 */ /* process with: gperf -CDEGTlot -H charset_hash -K name -L ANSI-C -N charset_entry */ %} struct charset { const char *name; /* name or alias */ int mib; /* MIBenum for name, -1 * MIBenum for alias */ }; %% 437, -2011 850, -2009 851, -2045 852, -2010 855, -2046 857, -2047 860, -2048 861, -2049 862, -2013 863, -2050 865, -2052 866, -2086 869, -2054 904, -2060 adobe-standard-encoding, 2005 adobe-symbol-encoding, 2020 ansi_x3.110-1983, 74 ansi_x3.4-1968, 3 ansi_x3.4-1986, -3 arabic, -9 arabic7, -65 ascii, -3 asmo-708, -9 asmo_449, 65 big5, 2026 big5-hkscs, 2101 bs_4730, 20 bs_viewdata, 50 ca, -78 ccsid00858, -2089 ccsid00924, -2090 ccsid01140, -2091 ccsid01141, -2092 ccsid01142, -2093 ccsid01143, -2094 ccsid01144, -2095 ccsid01145, -2096 ccsid01146, -2097 ccsid01147, -2098 ccsid01148, -2099 ccsid01149, -2100 cesu-8, 1016 chinese, -57 cn, -56 cp-ar, -2053 cp-gr, -2054 cp-is, -2049 cp00858, -2089 cp00924, -2090 cp01140, -2091 cp01141, -2092 cp01142, -2093 cp01143, -2094 cp01144, -2095 cp01145, -2096 cp01146, -2097 cp01147, -2098 cp01148, -2099 cp01149, -2100 cp037, -2028 cp038, -2029 cp1026, -2063 cp273, -2030 cp274, -2031 cp275, -2032 cp278, -2034 cp280, -2035 cp281, -2036 cp284, -2037 cp285, -2038 cp290, -2039 cp297, -2040 cp367, -3 cp420, -2041 cp423, -2042 cp424, -2043 cp437, -2011 cp500, -2044 cp775, -2087 cp819, -4 cp850, -2009 cp851, -2045 cp852, -2010 cp855, -2046 cp857, -2047 cp860, -2048 cp861, -2049 cp862, -2013 cp863, -2050 cp864, -2051 cp865, -2052 cp866, -2086 cp868, -2053 cp869, -2054 cp870, -2055 cp871, -2056 cp880, -2057 cp891, -2058 cp903, -2059 cp904, -2060 cp905, -2061 cp918, -2062 cp936, -113 csa7-1, -78 csa7-2, -79 csa_t500-1983, -74 csa_z243.4-1985-1, 78 csa_z243.4-1985-2, 79 csa_z243.4-1985-gr, 80 csadobestandardencoding, -2005 csascii, -3 csbig5, -2026 cscesu-8, -1016 csdecmcs, -2008 csdkus, -101 csebcdicatdea, -2065 csebcdiccafr, -2066 csebcdicdkno, -2067 csebcdicdknoa, -2068 csebcdices, -2074 csebcdicesa, -2075 csebcdicess, -2076 csebcdicfise, -2069 csebcdicfisea, -2070 csebcdicfr, -2071 csebcdicit, -2072 csebcdicpt, -2073 csebcdicuk, -2077 csebcdicus, -2078 cseucfixwidjapanese, -19 cseuckr, -38 cseucpkdfmtjapanese, -18 csgb2312, -2025 cshalfwidthkatakana, -15 cshpdesktop, -2021 cshplegal, -2017 cshpmath8, -2019 cshppifont, -2018 cshppsmath, -2020 cshproman8, -2004 csibbm904, -2060 csibm037, -2028 csibm038, -2029 csibm1026, -2063 csibm273, -2030 csibm274, -2031 csibm275, -2032 csibm277, -2033 csibm278, -2034 csibm280, -2035 csibm281, -2036 csibm284, -2037 csibm285, -2038 csibm290, -2039 csibm297, -2040 csibm420, -2041 csibm423, -2042 csibm424, -2043 csibm500, -2044 csibm851, -2045 csibm855, -2046 csibm857, -2047 csibm860, -2048 csibm861, -2049 csibm863, -2050 csibm864, -2051 csibm865, -2052 csibm866, -2086 csibm868, -2053 csibm869, -2054 csibm870, -2055 csibm871, -2056 csibm880, -2057 csibm891, -2058 csibm903, -2059 csibm905, -2061 csibm918, -2062 csibmebcdicatde, -2064 csibmsymbols, -2015 csibmthai, -2016 csinvariant, -29 csiso102t617bit, -75 csiso10367box, -96 csiso103t618bit, -76 csiso10646utf1, -27 csiso10swedish, -35 csiso111ecmacyrillic, -77 csiso11swedishfornames, -21 csiso121canadian1, -78 csiso122canadian2, -79 csiso123csaz24341985gr, -80 csiso128t101g2, -83 csiso139csn369103, -86 csiso13jisc6220jp, -41 csiso141jusib1002, -87 csiso143iecp271, -88 csiso146serbian, -89 csiso147macedonian, -90 csiso14jisc6220ro, -42 csiso150, -91 csiso150greekccitt, -91 csiso151cuba, -92 csiso153gost1976874, -94 csiso158lap, -97 csiso159jisx02121990, -98 csiso15italian, -22 csiso16portuguese, -43 csiso17spanish, -23 csiso18greek7old, -44 csiso19latingreek, -45 csiso2022jp, -39 csiso2022jp2, -40 csiso2022kr, -37 csiso2033, -73 csiso21german, -24 csiso25french, -46 csiso27latingreek1, -47 csiso2intlrefversion, -30 csiso42jisc62261978, -49 csiso47bsviewdata, -50 csiso49inis, -51 csiso4unitedkingdom, -20 csiso50inis8, -52 csiso51iniscyrillic, -53 csiso5427cyrillic, -48 csiso5428greek, -55 csiso57gb1988, -56 csiso58gb231280, -57 csiso60danishnorwegian, -25 csiso60norwegian1, -25 csiso61norwegian2, -58 csiso646basic1983, -28 csiso646danish, -99 csiso6937add, -93 csiso69french, -26 csiso70videotexsupp1, -59 csiso84portuguese2, -60 csiso85spanish2, -61 csiso86hungarian, -62 csiso87jisx0208, -63 csiso88596e, -81 csiso88596i, -82 csiso88598e, -84 csiso88598i, -85 csiso8859supp, -95 csiso88greek7, -64 csiso89asmo449, -65 csiso90, -66 csiso91jisc62291984a, -67 csiso92jisc62991984b, -68 csiso93jis62291984badd, -69 csiso94jis62291984hand, -70 csiso95jis62291984handadd, -71 csiso96jisc62291984kana, -72 csiso99naplps, -74 csisolatin1, -4 csisolatin2, -5 csisolatin3, -6 csisolatin4, -7 csisolatin5, -12 csisolatin6, -13 csisolatinarabic, -9 csisolatincyrillic, -8 csisolatingreek, -10 csisolatinhebrew, -11 csisotextcomm, -14 csjisencoding, -16 cskoi8r, -2084 csksc56011987, -36 csksc5636, -102 csmacintosh, -2027 csmicrosoftpublishing, -2023 csmnem, -2081 csmnemonic, -2080 csn_369103, 86 csnatsdano, -33 csnatsdanoadd, -34 csnatssefi, -31 csnatssefiadd, -32 cspc775baltic, -2087 cspc850multilingual, -2009 cspc862latinhebrew, -2013 cspc8codepage437, -2011 cspc8danishnorwegian, -2012 cspc8turkish, -2014 cspcp852, -2010 csshiftjis, -17 csucs4, -1001 csunicode, -1000 csunicode11, -1010 csunicode11utf7, -103 csunicodeascii, -1002 csunicodeibm1261, -1005 csunicodeibm1264, -1008 csunicodeibm1265, -1009 csunicodeibm1268, -1006 csunicodeibm1276, -1007 csunicodelatin1, -1003 csunknown8bit, -2079 csusdk, -100 csventurainternational, -2007 csventuramath, -2022 csventuraus, -2006 csviqr, -2083 csviscii, -2082 cswindows30latin1, -2000 cswindows31j, -2024 cswindows31latin1, -2001 cswindows31latin2, -2002 cswindows31latin5, -2003 cuba, -92 cyrillic, -8 de, -24 dec, -2008 dec-mcs, 2008 din_66003, 24 dk, -99 dk-us, 101 ds2089, -99 ds_2089, 99 e13b, -73 ebcdic-at-de, 2064 ebcdic-at-de-a, 2065 ebcdic-be, -2031 ebcdic-br, -2032 ebcdic-ca-fr, 2066 ebcdic-cp-ar1, -2041 ebcdic-cp-ar2, -2062 ebcdic-cp-be, -2044 ebcdic-cp-ca, -2028 ebcdic-cp-ch, -2044 ebcdic-cp-dk, -2033 ebcdic-cp-es, -2037 ebcdic-cp-fi, -2034 ebcdic-cp-fr, -2040 ebcdic-cp-gb, -2038 ebcdic-cp-gr, -2042 ebcdic-cp-he, -2043 ebcdic-cp-is, -2056 ebcdic-cp-it, -2035 ebcdic-cp-nl, -2028 ebcdic-cp-no, -2033 ebcdic-cp-roece, -2055 ebcdic-cp-se, -2034 ebcdic-cp-tr, -2061 ebcdic-cp-us, -2028 ebcdic-cp-wt, -2028 ebcdic-cp-yu, -2055 ebcdic-cyrillic, -2057 ebcdic-de-273+euro, -2092 ebcdic-dk-277+euro, -2093 ebcdic-dk-no, 2067 ebcdic-dk-no-a, 2068 ebcdic-es, 2074 ebcdic-es-284+euro, -2096 ebcdic-es-a, 2075 ebcdic-es-s, 2076 ebcdic-fi-278+euro, -2094 ebcdic-fi-se, 2069 ebcdic-fi-se-a, 2070 ebcdic-fr, 2071 ebcdic-fr-297+euro, -2098 ebcdic-gb-285+euro, -2097 ebcdic-int, -2029 ebcdic-international-500+euro, -2099 ebcdic-is-871+euro, -2100 ebcdic-it, 2072 ebcdic-it-280+euro, -2095 ebcdic-jp-e, -2036 ebcdic-jp-kana, -2039 ebcdic-latin9--euro, -2090 ebcdic-no-277+euro, -2093 ebcdic-pt, 2073 ebcdic-se-278+euro, -2094 ebcdic-uk, 2077 ebcdic-us, 2078 ebcdic-us-37+euro, -2091 ecma-114, -9 ecma-118, -10 ecma-cyrillic, 77 elot_928, -10 es, 23 es2, 61 euc-jp, -18 euc-kr, 38 extended_unix_code_fixed_width_for_japanese, 19 extended_unix_code_packed_format_for_japanese, 18 fi, -35 fr, -26 gb, -20 gb18030, 114 gb2312, 2025 gb_1988-80, 56 gb_2312-80, 57 gbk, 113 gost_19768-74, 94 greek, -10 greek-ccitt, 91 greek7, 64 greek7-old, 44 greek8, -10 hebrew, -11 hp-desktop, 2021 hp-legal, 2017 hp-math8, 2019 hp-pi-font, 2018 hp-roman8, 2004 hu, -62 hz-gb-2312, 2085 ibm-symbols, 2015 ibm-thai, 2016 ibm00858, 2089 ibm00924, 2090 ibm01140, 2091 ibm01141, 2092 ibm01142, 2093 ibm01143, 2094 ibm01144, 2095 ibm01145, 2096 ibm01146, 2097 ibm01147, 2098 ibm01148, 2099 ibm01149, 2100 ibm037, 2028 ibm038, 2029 ibm1026, 2063 ibm273, 2030 ibm274, 2031 ibm275, 2032 ibm277, 2033 ibm278, 2034 ibm280, 2035 ibm281, 2036 ibm284, 2037 ibm285, 2038 ibm290, 2039 ibm297, 2040 ibm367, -3 ibm420, 2041 ibm423, 2042 ibm424, 2043 ibm437, 2011 ibm500, 2044 ibm775, 2087 ibm819, -4 ibm850, 2009 ibm851, 2045 ibm852, 2010 ibm855, 2046 ibm857, 2047 ibm860, 2048 ibm861, 2049 ibm862, 2013 ibm863, 2050 ibm864, 2051 ibm865, 2052 ibm866, 2086 ibm868, 2053 ibm869, 2054 ibm870, 2055 ibm871, 2056 ibm880, 2057 ibm891, 2058 ibm903, 2059 ibm904, 2060 ibm905, 2061 ibm918, 2062 iec_p27-1, 88 inis, 51 inis-8, 52 inis-cyrillic, 53 invariant, 29 irv, -30 iso-10646, -1003 iso-10646-j-1, 0 iso-10646-ucs-2, 1000 iso-10646-ucs-4, 1001 iso-10646-ucs-basic, 1002 iso-10646-unicode-latin1, 1003 iso-10646-utf-1, 27 iso-2022-cn, 104 iso-2022-cn-ext, 105 iso-2022-jp, 39 iso-2022-jp-2, 40 iso-2022-kr, 37 iso-8859-1, -4 iso-8859-1-windows-3.0-latin-1, 2000 iso-8859-1-windows-3.1-latin-1, 2001 iso-8859-10, 13 iso-8859-13, 109 iso-8859-14, 110 iso-8859-15, 111 iso-8859-16, 112 iso-8859-2, -5 iso-8859-2-windows-latin-2, 2002 iso-8859-3, -6 iso-8859-4, -7 iso-8859-5, -8 iso-8859-6, -9 iso-8859-6-e, -81 iso-8859-6-i, -82 iso-8859-7, -10 iso-8859-8, -11 iso-8859-8-e, -84 iso-8859-8-i, -85 iso-8859-9, -12 iso-8859-9-windows-latin-5, 2003 iso-celtic, -110 iso-ir-10, -35 iso-ir-100, -4 iso-ir-101, -5 iso-ir-102, -75 iso-ir-103, -76 iso-ir-109, -6 iso-ir-11, -21 iso-ir-110, -7 iso-ir-111, -77 iso-ir-121, -78 iso-ir-122, -79 iso-ir-123, -80 iso-ir-126, -10 iso-ir-127, -9 iso-ir-128, -83 iso-ir-13, -41 iso-ir-138, -11 iso-ir-139, -86 iso-ir-14, -42 iso-ir-141, -87 iso-ir-142, -14 iso-ir-143, -88 iso-ir-144, -8 iso-ir-146, -89 iso-ir-147, -90 iso-ir-148, -12 iso-ir-149, -36 iso-ir-15, -22 iso-ir-150, -91 iso-ir-151, -92 iso-ir-152, -93 iso-ir-153, -94 iso-ir-154, -95 iso-ir-155, -96 iso-ir-157, -13 iso-ir-158, -97 iso-ir-159, -98 iso-ir-16, -43 iso-ir-17, -23 iso-ir-18, -44 iso-ir-19, -45 iso-ir-199, -110 iso-ir-2, -30 iso-ir-21, -24 iso-ir-25, -46 iso-ir-27, -47 iso-ir-37, -48 iso-ir-4, -20 iso-ir-42, -49 iso-ir-47, -50 iso-ir-49, -51 iso-ir-50, -52 iso-ir-51, -53 iso-ir-54, -54 iso-ir-55, -55 iso-ir-57, -56 iso-ir-58, -57 iso-ir-6, -3 iso-ir-60, -25 iso-ir-61, -58 iso-ir-69, -26 iso-ir-70, -59 iso-ir-8-1, -31 iso-ir-8-2, -32 iso-ir-84, -60 iso-ir-85, -61 iso-ir-86, -62 iso-ir-87, -63 iso-ir-88, -64 iso-ir-89, -65 iso-ir-9-1, -33 iso-ir-9-2, -34 iso-ir-90, 66 iso-ir-91, -67 iso-ir-92, -68 iso-ir-93, -69 iso-ir-94, -70 iso-ir-95, -71 iso-ir-96, -72 iso-ir-98, -73 iso-ir-99, -74 iso-unicode-ibm-1261, 1005 iso-unicode-ibm-1264, 1008 iso-unicode-ibm-1265, 1009 iso-unicode-ibm-1268, 1006 iso-unicode-ibm-1276, 1007 iso5427cyrillic1981, -54 iso646-ca, -78 iso646-ca2, -79 iso646-cn, -56 iso646-cu, -92 iso646-de, -24 iso646-dk, -99 iso646-es, -23 iso646-es2, -61 iso646-fi, -35 iso646-fr, -26 iso646-fr1, -46 iso646-gb, -20 iso646-hu, -62 iso646-it, -22 iso646-jp, -42 iso646-jp-ocr-b, -68 iso646-kr, -102 iso646-no, -25 iso646-no2, -58 iso646-pt, -43 iso646-pt2, -60 iso646-se, -35 iso646-se2, -21 iso646-us, -3 iso646-yu, -87 iso_10367-box, 96 iso_2033-1983, 73 iso_5427, 48 iso_5427:1981, 54 iso_5428:1980, 55 iso_646.basic:1983, 28 iso_646.irv:1983, 30 iso_646.irv:1991, -3 iso_6937-2-25, 93 iso_6937-2-add, 14 iso_8859-1, -4 iso_8859-10:1992, -13 iso_8859-14, -110 iso_8859-14:1998, -110 iso_8859-15, -111 iso_8859-1:1987, 4 iso_8859-2, -5 iso_8859-2:1987, 5 iso_8859-3, -6 iso_8859-3:1988, 6 iso_8859-4, -7 iso_8859-4:1988, 7 iso_8859-5, -8 iso_8859-5:1988, 8 iso_8859-6, -9 iso_8859-6-e, 81 iso_8859-6-i, 82 iso_8859-6:1987, 9 iso_8859-7, -10 iso_8859-7:1987, 10 iso_8859-8, -11 iso_8859-8-e, 84 iso_8859-8-i, 85 iso_8859-8:1988, 11 iso_8859-9, -12 iso_8859-9:1989, 12 iso_8859-supp, 95 iso_9036, -65 it, 22 jis_c6220-1969, -41 jis_c6220-1969-jp, 41 jis_c6220-1969-ro, 42 jis_c6226-1978, 49 jis_c6226-1983, 63 jis_c6229-1984-a, 67 jis_c6229-1984-b, 68 jis_c6229-1984-b-add, 69 jis_c6229-1984-hand, 70 jis_c6229-1984-hand-add, 71 jis_c6229-1984-kana, 72 jis_encoding, 16 jis_x0201, 15 jis_x0208-1983, -63 jis_x0212-1990, 98 jp, -42 jp-ocr-a, -67 jp-ocr-b, -68 jp-ocr-b-add, -69 jp-ocr-hand, -70 jp-ocr-hand-add, -71 js, -87 jus_i.b1.002, 87 jus_i.b1.003-mac, 90 jus_i.b1.003-serb, 89 katakana, -41 koi8-r, 2084 koi8-u, 2088 korean, -36 ks_c_5601-1987, 36 ks_c_5601-1989, -36 ksc5636, 102 ksc_5601, -36 l1, -4 l2, -5 l3, -6 l4, -7 l5, -12 l6, -13 l8, -110 lap, -97 latin-greek, 45 latin-greek-1, 47 latin-lap, 97 latin1, -4 latin1-2-5, -95 latin2, -5 latin3, -6 latin4, -7 latin5, -12 latin6, -13 latin8, -110 mac, -2027 macedonian, -90 macintosh, 2027 microsoft-publishing, 2023 mnem, 2081 mnemonic, 2080 ms936, -113 ms_kanji, -17 msz_7795.3, 62 naplps, -74 nats-dano, 33 nats-dano-add, 34 nats-sefi, 31 nats-sefi-add, 32 nc_nc00-10:81, 92 nf_z_62-010, 26 nf_z_62-010_(1973), 46 no, -25 no2, -58 ns_4551-1, 25 ns_4551-2, 58 pc-multilingual-850+euro, -2089 pc8-danish-norwegian, 2012 pc8-turkish, 2014 pt, 43 pt2, 60 r8, -2004 ref, -28 roman8, -2004 scsu, 1011 se, -35 se2, -21 sen_850200_b, 35 sen_850200_c, 21 serbian, -89 shift_jis, 17 st_sev_358-88, -94 t.101-g2, 83 t.61, -76 t.61-7bit, 75 t.61-8bit, 76 tis-620, 2259 uk, -20 unicode-1-1, 1010 unicode-1-1-utf-7, 103 unknown-8bit, 2079 us, -3 us-ascii, -3 us-dk, 100 utf-16, 1015 utf-16be, 1013 utf-16le, 1014 utf-32, 1017 utf-32be, 1018 utf-32le, 1019 utf-7, 1012 utf-8, 106 ventura-international, 2007 ventura-math, 2022 ventura-us, 2006 videotex-suppl, 59 viqr, 2083 viscii, 2082 windows-1250, 2250 windows-1251, 2251 windows-1252, 2252 windows-1253, 2253 windows-1254, 2254 windows-1255, 2255 windows-1256, 2256 windows-1257, 2257 windows-1258, 2258 windows-31j, 2024 windows-936, -113 x0201, -15 x0201-7, -41 x0208, -63 x0212, -98 yu, -87 %% gperf-3.2.1/tests/permut3.gperf0000664000000000000000000000002013074402054012026 abc acb bca cab gperf-3.2.1/tests/makeinfo.gperf0000664000000000000000000000570113074402054012233 COMMAND; %% !, cm_force_sentence_end, false ', insert_self, false *, cm_asterisk, false ., cm_force_sentence_end, false :, cm_force_abbreviated_whitespace, false ?, cm_force_sentence_end, false @, insert_self, false TeX, cm_TeX, true `, insert_self, false appendix, cm_appendix, false appendixsec, cm_appendixsec, false appendixsubsec, cm_appendixsubsec, false asis, cm_asis, true b, cm_bold, true br, cm_br, false bullet, cm_bullet, true bye, cm_bye, false c, cm_comment, false center, cm_center, false chapter, cm_chapter, false cindex, cm_cindex, false cite, cm_cite, true code, cm_code, true comment, cm_comment, false contents, do_nothing, false copyright, cm_copyright, true ctrl, cm_ctrl, true defcodeindex, cm_defindex, false defindex, cm_defindex, false dfn, cm_dfn, true display, cm_display, false dots, cm_dots, true emph, cm_emph, true end, cm_end, false enumerate, cm_enumerate, false equiv, cm_equiv, true error, cm_error, true example, cm_example, false exdent, cm_exdent, false expansion, cm_expansion, true file, cm_file, true findex, cm_findex, false format, cm_format, false group, cm_group, false i, cm_italic, true iappendix, cm_appendix, false iappendixsec, cm_appendixsec, false iappendixsubsec, cm_appendixsubsec, false ichapter, cm_chapter, false ifinfo, cm_ifinfo, false iftex, cm_iftex, false ignore, cm_ignore, false include, cm_include, false inforef, cm_inforef, true input, cm_include, false isection, cm_section, false isubsection, cm_subsection, false isubsubsection, cm_subsubsection, false item, cm_item, false itemize, cm_itemize, false itemx, cm_itemx, false iunnumbered, cm_unnumbered, false iunnumberedsec, cm_unnumberedsec, false iunnumberedsubsec, cm_unnumberedsubsec, false kbd, cm_kbd, true key, cm_key, true kindex, cm_kindex, false lisp, cm_lisp, false menu, cm_menu minus, cm_minus, true need, cm_need, false node, cm_node, false noindent, cm_noindent, false page, do_nothing, false pindex, cm_pindex, false point, cm_point, true print, cm_print, true printindex, cm_printindex, false pxref, cm_pxref, true quotation, cm_quotation, false r, cm_roman, true ref, cm_xref, true refill, cm_refill, false result, cm_result, true samp, cm_samp, true sc, cm_sc, true section, cm_section, false setchapternewpage, cm_setchapternewpage, false setfilename, cm_setfilename, false settitle, cm_settitle, false smallexample, cm_smallexample, false sp, cm_sp, false strong, cm_strong, true subsection, cm_subsection, false subsubsection, cm_subsubsection, false summarycontents, do_nothing, false syncodeindex, cm_synindex, false synindex, cm_synindex, false t, cm_title, true table, cm_table, false tex, cm_tex, false tindex, cm_tindex, false titlepage, cm_titlepage, false unnumbered, cm_unnumbered, false unnumberedsec, cm_unnumberedsec, false unnumberedsubsec, cm_unnumberedsubsec, false var, cm_var, true vindex, cm_vindex, false w, cm_w, true xref, cm_xref, true {, insert_self, false }, insert_self, false infoinclude, cm_infoinclude, false footnote, cm_footnote, false gperf-3.2.1/tests/jstest3.gperf0000664000000000000000000000352213074402054012040 struct js_keyword { const char * name; int token; } %% abstract, 1 boolean, 2 break, 3 byte, 4 case, 5 catch, 6 char, 7 class, 8 const, 9 continue, 10 default, 11 do, 12 double, 13 else, 14 extends, 15 false, 16 final, 17 finally, 18 float, 19 for, 20 function, 21 goto, 22 if, 23 implements, 24 import, 25 in, 26 instanceof, 27 int, 28 interface, 29 long, 30 native, 31 new, 32 null, 33 package, 34 private, 35 protected, 36 public, 37 return, 38 short, 39 static, 40 super, 41 switch, 42 synchronized, 43 this, 44 throw, 45 throws, 46 transient, 47 true, 48 try, 49 var, 50 void, 51 while, 52 with, 53 %% #include #include static const char* testdata[] = { "bogus", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "var", "void", "while", "with" }; int main () { int i; for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++) { #ifdef CPLUSPLUS_TEST const struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i])); #else const struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i])); #endif if (i > 0) { if (!resword) exit (1); if (strcmp(testdata[i],resword->name)) exit (1); } else { if (resword) exit (1); } } return 0; } gperf-3.2.1/tests/test-7.exp0000664000000000000000000000124613074402054011256 in word set if in word set do NOT in word set int in word set for in word set case NOT in word set char NOT in word set auto in word set goto in word set else NOT in word set long NOT in word set void NOT in word set enum NOT in word set float NOT in word set short NOT in word set union NOT in word set break in word set while NOT in word set const NOT in word set double NOT in word set static NOT in word set extern NOT in word set struct in word set return NOT in word set sizeof NOT in word set switch NOT in word set signed NOT in word set typedef NOT in word set default NOT in word set unsigned NOT in word set continue NOT in word set register NOT in word set volatile gperf-3.2.1/tests/cplusplus.exp0000664000000000000000000002500614776761016012205 /* C code produced by gperf version 3.2.1 */ /* Command-line: gperf -L C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k'1,4,7,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf */ struct resword { const char *name; short token; enum rid rid;}; #define TOTAL_KEYWORDS 106 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 16 #define MIN_HASH_VALUE 4 #define MAX_HASH_VALUE 163 /* maximum key range = 160, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (str, len) register const char *str; register size_t len; { static unsigned char asso_values[] = { 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 0, 164, 44, 58, 15, 55, 0, 24, 23, 25, 2, 164, 4, 26, 75, 36, 11, 40, 74, 14, 23, 1, 45, 45, 90, 50, 50, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[6]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 6: case 5: case 4: hval += asso_values[(unsigned char)str[3]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 3: case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct resword * is_reserved_word (str, len) register const char *str; register size_t len; { static struct resword wordlist[] = { {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"else", ELSE, NORID,}, {"true", CXX_TRUE, NORID,}, {"int", TYPESPEC, RID_INT,}, {"", 0, 0}, {"__real__", REALPART, NORID}, {"", 0, 0}, {"inline", SCSPEC, RID_INLINE,}, {"", 0, 0}, {"__signed__", TYPESPEC, RID_SIGNED}, {"", 0, 0}, {"__attribute", ATTRIBUTE, NORID}, {"", 0, 0}, {"__attribute__", ATTRIBUTE, NORID}, {"", 0, 0}, {"export", SCSPEC, RID_EXPORT,}, {"case", CASE, NORID,}, {"__const", CV_QUALIFIER, RID_CONST}, {"__const__", CV_QUALIFIER, RID_CONST}, {"__volatile", CV_QUALIFIER, RID_VOLATILE}, {"", 0, 0}, {"__volatile__", CV_QUALIFIER, RID_VOLATILE}, {"__restrict", CV_QUALIFIER, RID_RESTRICT}, {"__restrict__", CV_QUALIFIER, RID_RESTRICT}, {"or", OROR, NORID,}, {"if", IF, NORID,}, {"", 0, 0}, {"__asm__", ASM_KEYWORD, NORID}, {"typeof", TYPEOF, NORID,}, {"__real", REALPART, NORID}, {"", 0, 0}, {"", 0, 0}, {"__sigof__", SIGOF, NORID /* Extension */,}, {"static_cast", STATIC_CAST, NORID,}, {"explicit", SCSPEC, RID_EXPLICIT,}, {"register", SCSPEC, RID_REGISTER,}, {"__wchar_t", TYPESPEC, RID_WCHAR /* Unique to ANSI C++ */,}, {"not", '!', NORID,}, {"for", FOR, NORID,}, {"extern", SCSPEC, RID_EXTERN,}, {"short", TYPESPEC, RID_SHORT,}, {"const", CV_QUALIFIER, RID_CONST,}, {"static", SCSPEC, RID_STATIC,}, {"", 0, 0}, {"char", TYPESPEC, RID_CHAR,}, {"__complex__", TYPESPEC, RID_COMPLEX}, {"goto", GOTO, NORID,}, {"template", TEMPLATE, RID_TEMPLATE,}, {"this", THIS, NORID,}, {"false", CXX_FALSE, NORID,}, {"sizeof", SIZEOF, NORID,}, {"try", TRY, NORID,}, {"switch", SWITCH, NORID,}, {"typedef", SCSPEC, RID_TYPEDEF,}, {"", 0, 0}, {"operator", OPERATOR, NORID,}, {"__signature__", AGGR, RID_SIGNATURE /* Extension */,}, {"catch", CATCH, NORID,}, {"delete", DELETE, NORID,}, {"typeid", TYPEID, NORID,}, {"sigof", SIGOF, NORID /* Extension */,}, {"const_cast", CONST_CAST, NORID,}, {"__signed", TYPESPEC, RID_SIGNED}, {"class", AGGR, RID_CLASS,}, {"xor", '^', NORID,}, {"do", DO, NORID,}, {"continue", CONTINUE, NORID,}, {"auto", SCSPEC, RID_AUTO,}, {"__typeof__", TYPEOF, NORID}, {"", 0, 0}, {"__alignof__", ALIGNOF, NORID}, {"float", TYPESPEC, RID_FLOAT,}, {"struct", AGGR, RID_RECORD,}, {"long", TYPESPEC, RID_LONG,}, {"__null", CONSTANT, RID_NULL}, {"", 0, 0}, {"__label__", LABEL, NORID}, {"__inline", SCSPEC, RID_INLINE}, {"reinterpret_cast", REINTERPRET_CAST, NORID,}, {"__inline__", SCSPEC, RID_INLINE}, {"__imag__", IMAGPART, NORID}, {"typename", TYPENAME_KEYWORD, NORID,}, {"friend", SCSPEC, RID_FRIEND,}, {"compl", '~', NORID,}, {"public", VISSPEC, RID_PUBLIC,}, {"bitor", '|', NORID,}, {"namespace", NAMESPACE, NORID,}, {"or_eq", ASSIGN, NORID,}, {"", 0, 0}, {"private", VISSPEC, RID_PRIVATE,}, {"__typeof", TYPEOF, NORID}, {"", 0, 0}, {"__alignof", ALIGNOF, NORID}, {"__complex", TYPESPEC, RID_COMPLEX}, {"union", AGGR, RID_UNION,}, {"", 0, 0}, {"__extension__", EXTENSION, NORID}, {"", 0, 0}, {"return", RETURN_KEYWORD, NORID,}, {"and", ANDAND, NORID,}, {"__asm", ASM_KEYWORD, NORID}, {"__imag", IMAGPART, NORID}, {"virtual", SCSPEC, RID_VIRTUAL,}, {"protected", VISSPEC, RID_PROTECTED,}, {"throw", THROW, NORID,}, {"default", DEFAULT, NORID,}, {"using", USING, NORID,}, {"unsigned", TYPESPEC, RID_UNSIGNED,}, {"break", BREAK, NORID,}, {"", 0, 0}, {"signature", AGGR, RID_SIGNATURE /* Extension */,}, {"bool", TYPESPEC, RID_BOOL,}, {"", 0, 0}, {"not_eq", EQCOMPARE, NORID,}, {"", 0, 0}, {"", 0, 0}, {"double", TYPESPEC, RID_DOUBLE,}, {"signed", TYPESPEC, RID_SIGNED,}, {"while", WHILE, NORID,}, {"asm", ASM_KEYWORD, NORID,}, {"volatile", CV_QUALIFIER, RID_VOLATILE,}, {"and_eq", ASSIGN, NORID,}, {"", 0, 0}, {"mutable", SCSPEC, RID_MUTABLE,}, {"dynamic_cast", DYNAMIC_CAST, NORID,}, {"", 0, 0}, {"new", NEW, NORID,}, {"xor_eq", ASSIGN, NORID,}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"enum", ENUM, NORID,}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"void", TYPESPEC, RID_VOID,}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"bitand", '&', NORID,} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct resword *) 0; } gperf-3.2.1/tests/modula3.gperf0000664000000000000000000000114013074402054011777 AND ARRAY BEGIN BITS BY CASE CONST DIV DO ELSE ELSIF END EVAL EXCEPT EXCEPTION EXIT EXPORTS FINALLY FOR FROM IF IMPORT INTERFACE IN INLINE LOCK METHODS MOD MODULE NOT OBJECT OF OR PROCEDURE RAISES READONLY RECORD REF REPEAT RETURN SET THEN TO TRY TYPE TYPECASE UNSAFE UNTIL UNTRACED VALUE VAR WHILE WITH and array begin bits by case const div do else elsif end eval except exception exit exports finally for from if import interface in inline lock methods mod module not object of or procedure raises readonly record ref repeat return set then to try type typecase unsafe until untraced value var while with gperf-3.2.1/tests/test.c0000664000000000000000000000143013074402054010533 /* Tests the generated perfect hash function. The -v option prints diagnostics as to whether a word is in the set or not. Without -v the program is useful for timing. */ #include #include extern const char * in_word_set (const char *, size_t); #define MAX_LEN 80 int main (int argc, char *argv[]) { int verbose = argc > 1 ? 1 : 0; char buf[MAX_LEN]; while (fgets (buf, MAX_LEN, stdin)) { if (strlen (buf) > 0 && buf[strlen (buf) - 1] == '\n') buf[strlen (buf) - 1] = '\0'; if (in_word_set (buf, strlen (buf))) { if (verbose) printf ("in word set %s\n", buf); } else { if (verbose) printf ("NOT in word set %s\n", buf); } } return 0; } gperf-3.2.1/tests/adadefs.gperf0000664000000000000000000000073113074402054012027 boolean character constraint_error false float integer natural numeric_error positive program_error storage_error string tasking_error true address aft base callable constrained count delta digits emax epsilon first firstbit fore image large last lastbit length machine_emax machine_emin machine_mantissa machine_overflows machine_radix machine_rounds mantissa pos position pred range safe_emax safe_large safe_small size small storage_size succ terminated val value width gperf-3.2.1/tests/ada-pred.exp0000664000000000000000000000214113074402054011603 in word set boolean in word set character in word set constraint_error in word set false in word set float in word set integer in word set natural in word set numeric_error in word set positive in word set program_error in word set storage_error in word set string in word set tasking_error in word set true in word set address in word set aft in word set base in word set callable in word set constrained in word set count in word set delta in word set digits in word set emax in word set epsilon in word set first in word set firstbit in word set fore in word set image in word set large in word set last in word set lastbit in word set length in word set machine_emax in word set machine_emin in word set machine_mantissa in word set machine_overflows in word set machine_radix in word set machine_rounds in word set mantissa in word set pos in word set position in word set pred in word set range in word set safe_emax in word set safe_large in word set safe_small in word set size in word set small in word set storage_size in word set succ in word set terminated in word set val in word set value in word set width gperf-3.2.1/tests/lang-ucs2.exp0000664000000000000000000000152213074402054011723 in word set: 12A0 121B 122D 129B in word set: 010D 0065 0073 006B 0079 in word set: 0044 0061 006E 0073 006B in word set: 0045 006E 0067 006C 0069 0073 0068 in word set: 0053 0075 006F 006D 0069 in word set: 0046 0072 0061 006E 00E7 0061 0069 0073 in word set: 0044 0065 0075 0074 0073 0063 0068 in word set: 0395 03BB 03BB 03B7 03BD 03B9 03BA 03AC in word set: 05E2 05D1 05E8 05D9 05EA in word set: 0049 0074 0061 006C 0069 0061 006E 006F in word set: 004E 006F 0072 0073 006B in word set: 0420 0443 0441 0441 043A 0438 0439 in word set: 0045 0073 0070 0061 00F1 006F 006C in word set: 0053 0076 0065 006E 0073 006B 0061 in word set: 0E20 0E32 0E29 0E32 0E44 0E17 0E22 in word set: 0054 00FC 0072 006B 00E7 0065 in word set: 0054 0069 1EBF 006E 0067 0020 0056 0069 1EC7 0074 in word set: 65E5 672C 8A9E in word set: 4E2D 6587 in word set: D55C AE00 gperf-3.2.1/tests/c-parse.gperf0000664000000000000000000000452613074402054012000 %{ /* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ %} struct resword { const char *name; short token; enum rid rid; }; %% @class, CLASS, NORID @compatibility_alias, ALIAS, NORID @defs, DEFS, NORID @encode, ENCODE, NORID @end, END, NORID @implementation, IMPLEMENTATION, NORID @interface, INTERFACE, NORID @private, PRIVATE, NORID @protected, PROTECTED, NORID @protocol, PROTOCOL, NORID @public, PUBLIC, NORID @selector, SELECTOR, NORID __alignof, ALIGNOF, NORID __alignof__, ALIGNOF, NORID __asm, ASM_KEYWORD, NORID __asm__, ASM_KEYWORD, NORID __attribute, ATTRIBUTE, NORID __attribute__, ATTRIBUTE, NORID __complex, TYPESPEC, RID_COMPLEX __complex__, TYPESPEC, RID_COMPLEX __const, TYPE_QUAL, RID_CONST __const__, TYPE_QUAL, RID_CONST __extension__, EXTENSION, NORID __imag, IMAGPART, NORID __imag__, IMAGPART, NORID __inline, SCSPEC, RID_INLINE __inline__, SCSPEC, RID_INLINE __iterator, SCSPEC, RID_ITERATOR __iterator__, SCSPEC, RID_ITERATOR __label__, LABEL, NORID __real, REALPART, NORID __real__, REALPART, NORID __restrict, TYPE_QUAL, RID_RESTRICT __restrict__, TYPE_QUAL, RID_RESTRICT __signed, TYPESPEC, RID_SIGNED __signed__, TYPESPEC, RID_SIGNED __typeof, TYPEOF, NORID __typeof__, TYPEOF, NORID __volatile, TYPE_QUAL, RID_VOLATILE __volatile__, TYPE_QUAL, RID_VOLATILE asm, ASM_KEYWORD, NORID auto, SCSPEC, RID_AUTO break, BREAK, NORID bycopy, TYPE_QUAL, RID_BYCOPY byref, TYPE_QUAL, RID_BYREF case, CASE, NORID char, TYPESPEC, RID_CHAR const, TYPE_QUAL, RID_CONST continue, CONTINUE, NORID default, DEFAULT, NORID do, DO, NORID double, TYPESPEC, RID_DOUBLE else, ELSE, NORID enum, ENUM, NORID extern, SCSPEC, RID_EXTERN float, TYPESPEC, RID_FLOAT for, FOR, NORID goto, GOTO, NORID id, OBJECTNAME, RID_ID if, IF, NORID in, TYPE_QUAL, RID_IN inout, TYPE_QUAL, RID_INOUT inline, SCSPEC, RID_INLINE int, TYPESPEC, RID_INT long, TYPESPEC, RID_LONG oneway, TYPE_QUAL, RID_ONEWAY out, TYPE_QUAL, RID_OUT register, SCSPEC, RID_REGISTER restrict, TYPE_QUAL, RID_RESTRICT return, RETURN, NORID short, TYPESPEC, RID_SHORT signed, TYPESPEC, RID_SIGNED sizeof, SIZEOF, NORID static, SCSPEC, RID_STATIC struct, STRUCT, NORID switch, SWITCH, NORID typedef, SCSPEC, RID_TYPEDEF typeof, TYPEOF, NORID union, UNION, NORID unsigned, TYPESPEC, RID_UNSIGNED void, TYPESPEC, RID_VOID volatile, TYPE_QUAL, RID_VOLATILE while, WHILE, NORID gperf-3.2.1/tests/gpc.exp0000664000000000000000000001345114776761021010721 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -g -o -j1 -t -N is_reserved_word */ /* Computed positions: -k'1,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* ISO Pascal 7185 reserved words. * * For GNU Pascal compiler (GPC) by jtv@hut.fi * * run this through the Doug Schmidt's gperf program * with command * gperf -g -o -j1 -t -p -N is_reserved_word * */ struct resword { char *name; short token; short iclass;}; #define TOTAL_KEYWORDS 35 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 9 #define MIN_HASH_VALUE 2 #define MAX_HASH_VALUE 37 /* maximum key range = 36, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 14, 32, 16, 13, 9, 1, 32, 38, 9, 38, 38, 22, 26, 16, 3, 2, 38, 7, 23, 0, 19, 25, 23, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 5, 1, 5, 38, 3, 38, 38, 38, 8, 16, 0, 0, 38, 38, 3, 38, 7, 38, 8, 38, 38, 4, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38 }; return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]]; } struct resword * is_reserved_word (register const char *str, register size_t len) { #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static struct resword wordlist[] = { {""}, {""}, {"To", TO, PASCAL_ISO}, {""}, {"Then", THEN, PASCAL_ISO}, {"Type", TYPE, PASCAL_ISO}, {"File", FILE_, PASCAL_ISO}, {"For", FOR, PASCAL_ISO}, {"Or", OR, PASCAL_ISO}, {"Function", FUNCTION, PASCAL_ISO}, {"Of", OF, PASCAL_ISO}, {"In", IN, PASCAL_ISO}, {"Procedure", PROCEDURE, PASCAL_ISO}, {"Packed", PACKED, PASCAL_ISO}, {"Else", ELSE, PASCAL_ISO}, {"Do", DO, PASCAL_ISO}, {"If", IF, PASCAL_ISO}, {"End", END, PASCAL_ISO}, {"Record", RECORD, PASCAL_ISO}, {"Downto", DOWNTO, PASCAL_ISO}, {"Repeat", REPEAT, PASCAL_ISO}, {"Case", CASE, PASCAL_ISO}, {"And", AND, PASCAL_ISO}, {"Array", ARRAY, PASCAL_ISO}, {"Div", DIV, PASCAL_ISO}, {"Program",PROGRAM,PASCAL_ISO}, {"Not", NOT, PASCAL_ISO}, {"Nil", NIL, PASCAL_ISO}, {"Const", CONST, PASCAL_ISO}, {"While", WHILE, PASCAL_ISO}, {"With", WITH, PASCAL_ISO}, {"Var", VAR, PASCAL_ISO}, {"Until", UNTIL, PASCAL_ISO}, {"Set", SET, PASCAL_ISO}, {"Mod", MOD, PASCAL_ISO}, {"Label", LABEL, PASCAL_ISO}, {"Goto", GOTO, PASCAL_ISO}, {"Begin", BEGIN_, PASCAL_ISO} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct resword *) 0; } gperf-3.2.1/tests/chill.exp0000664000000000000000000017627214776761011011255 /* C code produced by gperf version 3.2.1 */ /* Command-line: gperf -L C -F ', 0, 0, 0' -D -E -S1 -j1 -i 1 -g -o -t -k'*' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif struct resword { const char *name; short token; enum rid rid; enum toktype { RESERVED, DIRECTIVE, PREDEF } flags; }; extern tree ridpointers []; /* maximum key range = 1046, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (str, len) register const char *str; register size_t len; { static unsigned short asso_values[] = { 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 40, 45, 59, 88, 61, 11, 128, 5, 2, 199, 8, 102, 101, 8, 11, 24, 33, 11, 13, 4, 34, 10, 105, 83, 75, 155, 1050, 1050, 1050, 1050, 5, 1050, 10, 33, 19, 43, 14, 4, 52, 1, 1, 232, 116, 28, 78, 7, 2, 1, 63, 5, 3, 1, 10, 143, 186, 244, 75, 139, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050, 1050 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[29]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 29: hval += asso_values[(unsigned char)str[28]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 28: hval += asso_values[(unsigned char)str[27]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 27: hval += asso_values[(unsigned char)str[26]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 26: hval += asso_values[(unsigned char)str[25]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 25: hval += asso_values[(unsigned char)str[24]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 24: hval += asso_values[(unsigned char)str[23]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 23: hval += asso_values[(unsigned char)str[22]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 22: hval += asso_values[(unsigned char)str[21]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 21: hval += asso_values[(unsigned char)str[20]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 20: hval += asso_values[(unsigned char)str[19]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 19: hval += asso_values[(unsigned char)str[18]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 18: hval += asso_values[(unsigned char)str[17]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 17: hval += asso_values[(unsigned char)str[16]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 16: hval += asso_values[(unsigned char)str[15]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 15: hval += asso_values[(unsigned char)str[14]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 14: hval += asso_values[(unsigned char)str[13]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 13: hval += asso_values[(unsigned char)str[12]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 12: hval += asso_values[(unsigned char)str[11]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 11: hval += asso_values[(unsigned char)str[10]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval; } struct resword * in_word_set (str, len) register const char *str; register size_t len; { enum { TOTAL_KEYWORDS = 300, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 30, MIN_HASH_VALUE = 4, MAX_HASH_VALUE = 1049 }; static struct resword wordlist[] = { {"to", TO, NORID, RESERVED}, {"in", IN, RID_IN, RESERVED}, {"on", ON, NORID, RESERVED}, {"or", OR, NORID, RESERVED}, {"pos", POS, NORID, RESERVED}, {"init", INIT, NORID, RESERVED}, {"this", THIS, NORID, RESERVED}, {"set", SET, NORID, RESERVED}, {"not", NOT, NORID, RESERVED}, {"for", FOR, NORID, RESERVED}, {"orif", ORIF, NORID, RESERVED}, {"IN", IN, RID_IN, RESERVED}, {"ref", REF, NORID, RESERVED}, {"od", OD, NORID, RESERVED}, {"stop", STOP, NORID, RESERVED}, {"inout", PARAMATTR, RID_INOUT, RESERVED}, {"at", AT, NORID, RESERVED}, {"INIT", INIT, NORID, RESERVED}, {"ON", ON, NORID, RESERVED}, {"THIS", THIS, NORID, RESERVED}, {"OR", OR, NORID, RESERVED}, {"then", THEN, NORID, RESERVED}, {"OUT", PARAMATTR, RID_OUT, RESERVED}, {"proc", PROC, NORID, RESERVED}, {"TO", TO, NORID, RESERVED}, {"SET", SET, NORID, RESERVED}, {"step", STEP, NORID, RESERVED}, {"start", START, NORID, RESERVED}, {"REF", REF, NORID, RESERVED}, {"return", RETURN, NORID, RESERVED}, {"NOT", NOT, NORID, RESERVED}, {"assert", ASSERT, NORID, RESERVED}, {"ORIF", ORIF, NORID, RESERVED}, {"returns", RETURNS, NORID, RESERVED}, {"chars", CHARS, NORID, RESERVED}, {"nonref", NONREF, NORID, RESERVED}, {"far", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"do", DO, NORID, RESERVED}, {"nolist", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"esac", ESAC, NORID, RESERVED}, {"FOR", FOR, NORID, RESERVED}, {"static", STATIC, NORID, RESERVED}, {"loc", LOC, NORID, RESERVED}, {"process", PROCESS, NORID, RESERVED}, {"struct", STRUCT, NORID, RESERVED}, {"if", IF, NORID, RESERVED}, {"of", OF, NORID, RESERVED}, {"result", RESULT, NORID, RESERVED}, {"and", AND, NORID, RESERVED}, {"inline", INLINE, RID_INLINE, RESERVED}, {"goto", GOTO, NORID, RESERVED}, {"send", SEND, NORID, RESERVED}, {"end", END, NORID, RESERVED}, {"reentrant", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"POS", POS, NORID, RESERVED}, {"andif", ANDIF, NORID, RESERVED}, {"read", READ, RID_READ, RESERVED}, {"INOUT", PARAMATTR, RID_INOUT, RESERVED}, {"continue", CONTINUE, NORID, RESERVED}, {"UP", UP, NORID, RESERVED}, {"FAR", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"bools", BOOLS, RID_BOOLS, RESERVED}, {"case", CASE, NORID, RESERVED}, {"OD", OD, NORID, RESERVED}, {"up", UP, NORID, RESERVED}, {"AT", AT, NORID, RESERVED}, {"region", REGION, NORID, RESERVED}, {"grant", GRANT, NORID, RESERVED}, {"THEN", THEN, NORID, RESERVED}, {"small", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ccitt_os", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"cause", CAUSE, NORID, RESERVED}, {"RETURN", RETURN, NORID, RESERVED}, {"STOP", STOP, NORID, RESERVED}, {"after", AFTER, NORID, RESERVED}, {"rem", REM, NORID, RESERVED}, {"asm", ASM_KEYWORD, NORID, RESERVED}, {"forbid", FORBID, NORID, RESERVED}, {"exit", EXIT, NORID, RESERVED}, {"state_routine", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"priority", PRIORITY, NORID, RESERVED}, {"access", ACCESS, NORID, RESERVED}, {"RETURNS", RETURNS, NORID, RESERVED}, {"begin", BEGINTOKEN, NORID, RESERVED}, {"spec", SPEC, NORID, RESERVED}, {"page", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"elsif", ELSIF, NORID, RESERVED}, {"TEXT", TEXT, NORID, RESERVED}, {"START", START, NORID, RESERVED}, {"array", ARRAY, NORID, RESERVED}, {"remote", REMOTE, NORID, RESERVED}, {"PROC", PROC, NORID, RESERVED}, {"call", CALL, NORID, RESERVED}, {"else", ELSE, NORID, RESERVED}, {"DO", DO, NORID, RESERVED}, {"print_o_code", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"range", RANGE, NORID, RESERVED}, {"dcl", DCL, NORID, RESERVED}, {"all", ALL, NORID, RESERVED}, {"empty_on", EMPTY_ON, NORID, DIRECTIVE}, {"XOR", XOR, NORID, RESERVED}, {"empty_off", EMPTY_OFF, NORID, DIRECTIVE}, {"SEND", SEND, NORID, RESERVED}, {"mod", MOD, NORID, RESERVED}, {"REM", REM, NORID, RESERVED}, {"general", GENERAL, NORID, RESERVED}, {"NONREF", NONREF, NORID, RESERVED}, {"CHARS", CHARS, NORID, RESERVED}, {"based", BASED, NORID, RESERVED}, {"IF", IF, NORID, RESERVED}, {"range_on", RANGE_ON, NORID, DIRECTIVE}, {"range_off", RANGE_OFF, NORID, DIRECTIVE}, {"STEP", STEP, NORID, RESERVED}, {"large", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"reentrant_all", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ASSERT", ASSERT, NORID, RESERVED}, {"PACK", PACK, NORID, RESERVED}, {"OF", OF, NORID, RESERVED}, {"AND", AND, NORID, RESERVED}, {"ROW", ROW, NORID, RESERVED}, {"EXIT", EXIT, NORID, RESERVED}, {"exceptions", EXCEPTIONS, NORID, RESERVED}, {"ASM", ASM_KEYWORD, NORID, RESERVED}, {"out", PARAMATTR, RID_OUT, RESERVED}, {"PRIORITY", PRIORITY, NORID, RESERVED}, {"short_pred_succ", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"syn", SYN, NORID, RESERVED}, {"process_type", PROCESS_TYPE_TOKEN, NORID, DIRECTIVE}, {"READ", READ, RID_READ, RESERVED}, {"BUFFER", BUFFER, NORID, RESERVED}, {"body", BODY, NORID, RESERVED}, {"ANDIF", ANDIF, NORID, RESERVED}, {"STATIC", STATIC, NORID, RESERVED}, {"NOLIST", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"nopack", NOPACK, NORID, RESERVED}, {"STRUCT", STRUCT, NORID, RESERVED}, {"END", END, NORID, RESERVED}, {"delay", DELAY, NORID, RESERVED}, {"seize", SEIZE, NORID, RESERVED}, {"REENTRANT", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ESAC", ESAC, NORID, RESERVED}, {"NOPACK", NOPACK, NORID, RESERVED}, {"SPEC", SPEC, NORID, RESERVED}, {"GOTO", GOTO, NORID, RESERVED}, {"pack", PACK, NORID, RESERVED}, {"by", BY, NORID, RESERVED}, {"REGION", REGION, NORID, RESERVED}, {"SYN", SYN, NORID, RESERVED}, {"module", MODULE, NORID, RESERVED}, {"RESULT", RESULT, NORID, RESERVED}, {"CASE", CASE, NORID, RESERVED}, {"all_static_on", ALL_STATIC_ON, NORID, DIRECTIVE}, {"ARRAY", ARRAY, NORID, RESERVED}, {"all_static_off", ALL_STATIC_OFF, NORID, DIRECTIVE}, {"FORBID", FORBID, NORID, RESERVED}, {"LOC", LOC, NORID, RESERVED}, {"INLINE", INLINE, RID_INLINE, RESERVED}, {"ELSIF", ELSIF, NORID, RESERVED}, {"CCITT_OS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"row", ROW, NORID, RESERVED}, {"GRANT", GRANT, NORID, RESERVED}, {"BEGIN", BEGINTOKEN, NORID, RESERVED}, {"BOOLS", BOOLS, RID_BOOLS, RESERVED}, {"PROCESS", PROCESS, NORID, RESERVED}, {"BY", BY, NORID, RESERVED}, {"EMPTY_ON", EMPTY_ON, NORID, DIRECTIVE}, {"REMOTE", REMOTE, NORID, RESERVED}, {"receive", RECEIVE, NORID, RESERVED}, {"CONTINUE", CONTINUE, NORID, RESERVED}, {"buffer", BUFFER, NORID, RESERVED}, {"debug_lines", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"FI", FI, NORID, RESERVED}, {"recursive", RECURSIVE, NORID, RESERVED}, {"MOD", MOD, NORID, RESERVED}, {"CAUSE", CAUSE, NORID, RESERVED}, {"EMPTY_OFF", EMPTY_OFF, NORID, DIRECTIVE}, {"medium", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"RECURSIVE", RECURSIVE, NORID, RESERVED}, {"RECEIVE", RECEIVE, NORID, RESERVED}, {"ever", EVER, NORID, RESERVED}, {"cycle", CYCLE, NORID, RESERVED}, {"even", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"only_for_target", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"event", EVENT, NORID, RESERVED}, {"DOWN", DOWN, NORID, RESERVED}, {"extra_const_seg", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"powerset", POWERSET, NORID, RESERVED}, {"while", WHILE, NORID, RESERVED}, {"BODY", BODY, NORID, RESERVED}, {"fi", FI, NORID, RESERVED}, {"EVEN", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ELSE", ELSE, NORID, RESERVED}, {"down", DOWN, NORID, RESERVED}, {"EVER", EVER, NORID, RESERVED}, {"EVENT", EVENT, NORID, RESERVED}, {"ALL", ALL, NORID, RESERVED}, {"SEIZE", SEIZE, NORID, RESERVED}, {"AFTER", AFTER, NORID, RESERVED}, {"CONTEXT", CONTEXT, NORID, RESERVED}, {"BIT", BOOLS, RID_BOOLS, PREDEF}, {"debug_types", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"xor", XOR, NORID, RESERVED}, {"text", TEXT, NORID, RESERVED}, {"BIN", BIN, NORID, RESERVED}, {"BASED", BASED, NORID, RESERVED}, {"RANGE", RANGE, NORID, RESERVED}, {"PAGE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"generate_set_names", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"use_seize_file", USE_SEIZE_FILE, NORID, DIRECTIVE}, {"list", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"bit", BOOLS, RID_BOOLS, PREDEF}, {"SMALL", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"bin", BIN, NORID, RESERVED}, {"WHILE", WHILE, NORID, RESERVED}, {"ACCESS", ACCESS, NORID, RESERVED}, {"DCL", DCL, NORID, RESERVED}, {"RANGE_ON", RANGE_ON, NORID, DIRECTIVE}, {"VARYING", VARYING, NORID, RESERVED}, {"only_for_simulation", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"synmode", SYNMODE, NORID, RESERVED}, {"context", CONTEXT, NORID, RESERVED}, {"buffer_code", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"RANGE_OFF", RANGE_OFF, NORID, DIRECTIVE}, {"STATE_ROUTINE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"grant_file_size", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"PRINT_O_CODE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"dynamic", DYNAMIC, RID_DYNAMIC, RESERVED}, {"optimize", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"POWERSET", POWERSET, NORID, RESERVED}, {"CALL", CALL, NORID, RESERVED}, {"event_code", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"WITH", WITH, NORID, RESERVED}, {"DELAY", DELAY, NORID, RESERVED}, {"LIST", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"varying", VARYING, NORID, RESERVED}, {"EXCEPTIONS", EXCEPTIONS, NORID, RESERVED}, {"prefixed", PREFIXED, NORID, RESERVED}, {"signal", SIGNAL, NORID, RESERVED}, {"generate_all_set_names", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"newmode", NEWMODE, NORID, RESERVED}, {"MEDIUM", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"timeout", TIMEOUT, NORID, RESERVED}, {"print_symbol_table", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"PREFIXED", PREFIXED, NORID, RESERVED}, {"LARGE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"simple", SIMPLE, NORID, RESERVED}, {"GENERAL", GENERAL, NORID, RESERVED}, {"send_buffer_default_priority", SEND_BUFFER_DEFAULT_PRIORITY, NORID, DIRECTIVE}, {"PROCESS_TYPE", PROCESS_TYPE_TOKEN, NORID, DIRECTIVE}, {"OPTIMIZE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"debug_symbols", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"BUFFER_CODE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"use_seize_file_restricted", USE_SEIZE_FILE_RESTRICTED, NORID, DIRECTIVE}, {"NEWMODE", NEWMODE, NORID, RESERVED}, {"send_signal_default_priority", SEND_SIGNAL_DEFAULT_PRIORITY, NORID, DIRECTIVE}, {"no_overlap_check", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ALL_STATIC_ON", ALL_STATIC_ON, NORID, DIRECTIVE}, {"support_causing_address", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SHORT_PRED_SUCC", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"MODULE", MODULE, NORID, RESERVED}, {"REENTRANT_ALL", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"TIMEOUT", TIMEOUT, NORID, RESERVED}, {"ALL_STATIC_OFF", ALL_STATIC_OFF, NORID, DIRECTIVE}, {"with", WITH, NORID, RESERVED}, {"signal_code", SIGNAL_CODE, NORID, DIRECTIVE}, {"multiple_const_segs", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"optimize_runtime", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"CYCLE", CYCLE, NORID, RESERVED}, {"SYNMODE", SYNMODE, NORID, RESERVED}, {"multiple_data_segs", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"DYNAMIC", DYNAMIC, RID_DYNAMIC, RESERVED}, {"EVENT_CODE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SIGNAL", SIGNAL, NORID, RESERVED}, {"DEBUG_TYPES", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ONLY_FOR_TARGET", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SIMPLE", SIMPLE, NORID, RESERVED}, {"DEBUG_LINES", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"NO_OVERLAP_CHECK", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"EXTRA_CONST_SEG", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"ONLY_FOR_SIMULATION", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"make_publics_for_discrete_syns", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"USE_SEIZE_FILE", USE_SEIZE_FILE, NORID, DIRECTIVE}, {"OPTIMIZE_RUNTIME", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"GRANT_FILE_SIZE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"GENERATE_SET_NAMES", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"PRINT_SYMBOL_TABLE", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"DEBUG_SYMBOLS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"OPTIMIZATION_WINDOW", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SIGNAL_CODE", SIGNAL_CODE, NORID, DIRECTIVE}, {"SUPPORT_CAUSING_ADDRESS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"MULTIPLE_CONST_SEGS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"optimization_window", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"signal_max_length", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SEND_BUFFER_DEFAULT_PRIORITY", SEND_BUFFER_DEFAULT_PRIORITY, NORID, DIRECTIVE}, {"MULTIPLE_DATA_SEGS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"GENERATE_ALL_SET_NAMES", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"USE_SEIZE_FILE_RESTRICTED", USE_SEIZE_FILE_RESTRICTED, NORID, DIRECTIVE}, {"SEND_SIGNAL_DEFAULT_PRIORITY", SEND_SIGNAL_DEFAULT_PRIORITY, NORID, DIRECTIVE}, {"MAKE_PUBLICS_FOR_DISCRETE_SYNS", IGNORED_DIRECTIVE, NORID, DIRECTIVE}, {"SIGNAL_MAX_LENGTH", IGNORED_DIRECTIVE, NORID, DIRECTIVE} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE && key >= MIN_HASH_VALUE) { register struct resword *resword; switch (key - 4) { case 0: resword = &wordlist[0]; goto compare; case 1: resword = &wordlist[1]; goto compare; case 2: resword = &wordlist[2]; goto compare; case 3: resword = &wordlist[3]; goto compare; case 4: resword = &wordlist[4]; goto compare; case 5: resword = &wordlist[5]; goto compare; case 6: resword = &wordlist[6]; goto compare; case 7: resword = &wordlist[7]; goto compare; case 8: resword = &wordlist[8]; goto compare; case 9: resword = &wordlist[9]; goto compare; case 10: resword = &wordlist[10]; goto compare; case 11: resword = &wordlist[11]; goto compare; case 12: resword = &wordlist[12]; goto compare; case 14: resword = &wordlist[13]; goto compare; case 16: resword = &wordlist[14]; goto compare; case 17: resword = &wordlist[15]; goto compare; case 18: resword = &wordlist[16]; goto compare; case 19: resword = &wordlist[17]; goto compare; case 20: resword = &wordlist[18]; goto compare; case 21: resword = &wordlist[19]; goto compare; case 22: resword = &wordlist[20]; goto compare; case 23: resword = &wordlist[21]; goto compare; case 24: resword = &wordlist[22]; goto compare; case 25: resword = &wordlist[23]; goto compare; case 26: resword = &wordlist[24]; goto compare; case 27: resword = &wordlist[25]; goto compare; case 28: resword = &wordlist[26]; goto compare; case 30: resword = &wordlist[27]; goto compare; case 32: resword = &wordlist[28]; goto compare; case 34: resword = &wordlist[29]; goto compare; case 35: resword = &wordlist[30]; goto compare; case 36: resword = &wordlist[31]; goto compare; case 37: resword = &wordlist[32]; goto compare; case 38: resword = &wordlist[33]; goto compare; case 39: resword = &wordlist[34]; goto compare; case 40: resword = &wordlist[35]; goto compare; case 41: resword = &wordlist[36]; goto compare; case 42: resword = &wordlist[37]; goto compare; case 43: resword = &wordlist[38]; goto compare; case 44: resword = &wordlist[39]; goto compare; case 45: resword = &wordlist[40]; goto compare; case 46: resword = &wordlist[41]; goto compare; case 47: resword = &wordlist[42]; goto compare; case 48: resword = &wordlist[43]; goto compare; case 50: resword = &wordlist[44]; goto compare; case 51: resword = &wordlist[45]; goto compare; case 52: resword = &wordlist[46]; goto compare; case 53: resword = &wordlist[47]; goto compare; case 54: resword = &wordlist[48]; goto compare; case 55: resword = &wordlist[49]; goto compare; case 56: resword = &wordlist[50]; goto compare; case 57: resword = &wordlist[51]; goto compare; case 58: resword = &wordlist[52]; goto compare; case 59: resword = &wordlist[53]; goto compare; case 60: resword = &wordlist[54]; goto compare; case 61: resword = &wordlist[55]; goto compare; case 62: resword = &wordlist[56]; goto compare; case 63: resword = &wordlist[57]; goto compare; case 64: resword = &wordlist[58]; goto compare; case 65: resword = &wordlist[59]; goto compare; case 66: resword = &wordlist[60]; goto compare; case 68: resword = &wordlist[61]; goto compare; case 69: resword = &wordlist[62]; goto compare; case 70: resword = &wordlist[63]; goto compare; case 71: resword = &wordlist[64]; goto compare; case 72: resword = &wordlist[65]; goto compare; case 73: resword = &wordlist[66]; goto compare; case 74: resword = &wordlist[67]; goto compare; case 75: resword = &wordlist[68]; goto compare; case 77: resword = &wordlist[69]; goto compare; case 79: resword = &wordlist[70]; goto compare; case 80: resword = &wordlist[71]; goto compare; case 81: resword = &wordlist[72]; goto compare; case 82: resword = &wordlist[73]; goto compare; case 83: resword = &wordlist[74]; goto compare; case 86: resword = &wordlist[75]; goto compare; case 88: resword = &wordlist[76]; goto compare; case 89: resword = &wordlist[77]; goto compare; case 91: resword = &wordlist[78]; goto compare; case 92: resword = &wordlist[79]; goto compare; case 93: resword = &wordlist[80]; goto compare; case 94: resword = &wordlist[81]; goto compare; case 95: resword = &wordlist[82]; goto compare; case 98: resword = &wordlist[83]; goto compare; case 99: resword = &wordlist[84]; goto compare; case 100: resword = &wordlist[85]; goto compare; case 101: resword = &wordlist[86]; goto compare; case 102: resword = &wordlist[87]; goto compare; case 103: resword = &wordlist[88]; goto compare; case 104: resword = &wordlist[89]; goto compare; case 106: resword = &wordlist[90]; goto compare; case 107: resword = &wordlist[91]; goto compare; case 108: resword = &wordlist[92]; goto compare; case 109: resword = &wordlist[93]; goto compare; case 110: resword = &wordlist[94]; goto compare; case 111: resword = &wordlist[95]; goto compare; case 112: resword = &wordlist[96]; goto compare; case 113: resword = &wordlist[97]; goto compare; case 115: resword = &wordlist[98]; goto compare; case 116: resword = &wordlist[99]; goto compare; case 117: resword = &wordlist[100]; goto compare; case 118: resword = &wordlist[101]; goto compare; case 120: resword = &wordlist[102]; goto compare; case 121: resword = &wordlist[103]; goto compare; case 122: resword = &wordlist[104]; goto compare; case 123: resword = &wordlist[105]; goto compare; case 125: resword = &wordlist[106]; goto compare; case 126: resword = &wordlist[107]; goto compare; case 127: resword = &wordlist[108]; goto compare; case 128: resword = &wordlist[109]; goto compare; case 129: resword = &wordlist[110]; goto compare; case 131: resword = &wordlist[111]; goto compare; case 132: resword = &wordlist[112]; goto compare; case 133: resword = &wordlist[113]; goto compare; case 134: resword = &wordlist[114]; goto compare; case 135: resword = &wordlist[115]; goto compare; case 136: resword = &wordlist[116]; goto compare; case 137: resword = &wordlist[117]; goto compare; case 138: resword = &wordlist[118]; goto compare; case 139: resword = &wordlist[119]; goto compare; case 142: resword = &wordlist[120]; goto compare; case 143: resword = &wordlist[121]; goto compare; case 144: resword = &wordlist[122]; goto compare; case 145: resword = &wordlist[123]; goto compare; case 146: resword = &wordlist[124]; goto compare; case 147: resword = &wordlist[125]; goto compare; case 148: resword = &wordlist[126]; goto compare; case 149: resword = &wordlist[127]; goto compare; case 150: resword = &wordlist[128]; goto compare; case 151: resword = &wordlist[129]; goto compare; case 152: resword = &wordlist[130]; goto compare; case 153: resword = &wordlist[131]; goto compare; case 154: resword = &wordlist[132]; goto compare; case 155: resword = &wordlist[133]; goto compare; case 156: resword = &wordlist[134]; goto compare; case 157: resword = &wordlist[135]; goto compare; case 159: resword = &wordlist[136]; goto compare; case 161: resword = &wordlist[137]; goto compare; case 162: resword = &wordlist[138]; goto compare; case 163: resword = &wordlist[139]; goto compare; case 164: resword = &wordlist[140]; goto compare; case 165: resword = &wordlist[141]; goto compare; case 166: resword = &wordlist[142]; goto compare; case 167: resword = &wordlist[143]; goto compare; case 169: resword = &wordlist[144]; goto compare; case 170: resword = &wordlist[145]; goto compare; case 173: resword = &wordlist[146]; goto compare; case 175: resword = &wordlist[147]; goto compare; case 176: resword = &wordlist[148]; goto compare; case 177: resword = &wordlist[149]; goto compare; case 178: resword = &wordlist[150]; goto compare; case 179: resword = &wordlist[151]; goto compare; case 180: resword = &wordlist[152]; goto compare; case 181: resword = &wordlist[153]; goto compare; case 183: resword = &wordlist[154]; goto compare; case 184: resword = &wordlist[155]; goto compare; case 188: resword = &wordlist[156]; goto compare; case 189: resword = &wordlist[157]; goto compare; case 190: resword = &wordlist[158]; goto compare; case 191: resword = &wordlist[159]; goto compare; case 194: resword = &wordlist[160]; goto compare; case 195: resword = &wordlist[161]; goto compare; case 196: resword = &wordlist[162]; goto compare; case 197: resword = &wordlist[163]; goto compare; case 198: resword = &wordlist[164]; goto compare; case 200: resword = &wordlist[165]; goto compare; case 201: resword = &wordlist[166]; goto compare; case 203: resword = &wordlist[167]; goto compare; case 204: resword = &wordlist[168]; goto compare; case 205: resword = &wordlist[169]; goto compare; case 207: resword = &wordlist[170]; goto compare; case 208: resword = &wordlist[171]; goto compare; case 209: resword = &wordlist[172]; goto compare; case 212: resword = &wordlist[173]; goto compare; case 213: resword = &wordlist[174]; goto compare; case 215: resword = &wordlist[175]; goto compare; case 216: resword = &wordlist[176]; goto compare; case 217: resword = &wordlist[177]; goto compare; case 218: resword = &wordlist[178]; goto compare; case 219: resword = &wordlist[179]; goto compare; case 220: resword = &wordlist[180]; goto compare; case 221: resword = &wordlist[181]; goto compare; case 222: resword = &wordlist[182]; goto compare; case 223: resword = &wordlist[183]; goto compare; case 225: resword = &wordlist[184]; goto compare; case 227: resword = &wordlist[185]; goto compare; case 229: resword = &wordlist[186]; goto compare; case 231: resword = &wordlist[187]; goto compare; case 232: resword = &wordlist[188]; goto compare; case 234: resword = &wordlist[189]; goto compare; case 235: resword = &wordlist[190]; goto compare; case 236: resword = &wordlist[191]; goto compare; case 237: resword = &wordlist[192]; goto compare; case 238: resword = &wordlist[193]; goto compare; case 240: resword = &wordlist[194]; goto compare; case 242: resword = &wordlist[195]; goto compare; case 243: resword = &wordlist[196]; goto compare; case 245: resword = &wordlist[197]; goto compare; case 246: resword = &wordlist[198]; goto compare; case 247: resword = &wordlist[199]; goto compare; case 248: resword = &wordlist[200]; goto compare; case 249: resword = &wordlist[201]; goto compare; case 250: resword = &wordlist[202]; goto compare; case 251: resword = &wordlist[203]; goto compare; case 253: resword = &wordlist[204]; goto compare; case 254: resword = &wordlist[205]; goto compare; case 258: resword = &wordlist[206]; goto compare; case 261: resword = &wordlist[207]; goto compare; case 263: resword = &wordlist[208]; goto compare; case 264: resword = &wordlist[209]; goto compare; case 265: resword = &wordlist[210]; goto compare; case 266: resword = &wordlist[211]; goto compare; case 271: resword = &wordlist[212]; goto compare; case 273: resword = &wordlist[213]; goto compare; case 276: resword = &wordlist[214]; goto compare; case 277: resword = &wordlist[215]; goto compare; case 281: resword = &wordlist[216]; goto compare; case 282: resword = &wordlist[217]; goto compare; case 284: resword = &wordlist[218]; goto compare; case 289: resword = &wordlist[219]; goto compare; case 290: resword = &wordlist[220]; goto compare; case 293: resword = &wordlist[221]; goto compare; case 296: resword = &wordlist[222]; goto compare; case 297: resword = &wordlist[223]; goto compare; case 298: resword = &wordlist[224]; goto compare; case 299: resword = &wordlist[225]; goto compare; case 300: resword = &wordlist[226]; goto compare; case 303: resword = &wordlist[227]; goto compare; case 307: resword = &wordlist[228]; goto compare; case 308: resword = &wordlist[229]; goto compare; case 311: resword = &wordlist[230]; goto compare; case 313: resword = &wordlist[231]; goto compare; case 317: resword = &wordlist[232]; goto compare; case 318: resword = &wordlist[233]; goto compare; case 319: resword = &wordlist[234]; goto compare; case 324: resword = &wordlist[235]; goto compare; case 328: resword = &wordlist[236]; goto compare; case 334: resword = &wordlist[237]; goto compare; case 336: resword = &wordlist[238]; goto compare; case 337: resword = &wordlist[239]; goto compare; case 339: resword = &wordlist[240]; goto compare; case 341: resword = &wordlist[241]; goto compare; case 342: resword = &wordlist[242]; goto compare; case 347: resword = &wordlist[243]; goto compare; case 348: resword = &wordlist[244]; goto compare; case 358: resword = &wordlist[245]; goto compare; case 364: resword = &wordlist[246]; goto compare; case 367: resword = &wordlist[247]; goto compare; case 371: resword = &wordlist[248]; goto compare; case 373: resword = &wordlist[249]; goto compare; case 378: resword = &wordlist[250]; goto compare; case 380: resword = &wordlist[251]; goto compare; case 385: resword = &wordlist[252]; goto compare; case 388: resword = &wordlist[253]; goto compare; case 398: resword = &wordlist[254]; goto compare; case 402: resword = &wordlist[255]; goto compare; case 403: resword = &wordlist[256]; goto compare; case 408: resword = &wordlist[257]; goto compare; case 411: resword = &wordlist[258]; goto compare; case 412: resword = &wordlist[259]; goto compare; case 416: resword = &wordlist[260]; goto compare; case 417: resword = &wordlist[261]; goto compare; case 418: resword = &wordlist[262]; goto compare; case 420: resword = &wordlist[263]; goto compare; case 422: resword = &wordlist[264]; goto compare; case 423: resword = &wordlist[265]; goto compare; case 432: resword = &wordlist[266]; goto compare; case 437: resword = &wordlist[267]; goto compare; case 440: resword = &wordlist[268]; goto compare; case 454: resword = &wordlist[269]; goto compare; case 456: resword = &wordlist[270]; goto compare; case 469: resword = &wordlist[271]; goto compare; case 492: resword = &wordlist[272]; goto compare; case 495: resword = &wordlist[273]; goto compare; case 501: resword = &wordlist[274]; goto compare; case 502: resword = &wordlist[275]; goto compare; case 504: resword = &wordlist[276]; goto compare; case 505: resword = &wordlist[277]; goto compare; case 509: resword = &wordlist[278]; goto compare; case 574: resword = &wordlist[279]; goto compare; case 581: resword = &wordlist[280]; goto compare; case 587: resword = &wordlist[281]; goto compare; case 607: resword = &wordlist[282]; goto compare; case 621: resword = &wordlist[283]; goto compare; case 649: resword = &wordlist[284]; goto compare; case 674: resword = &wordlist[285]; goto compare; case 680: resword = &wordlist[286]; goto compare; case 712: resword = &wordlist[287]; goto compare; case 721: resword = &wordlist[288]; goto compare; case 724: resword = &wordlist[289]; goto compare; case 741: resword = &wordlist[290]; goto compare; case 751: resword = &wordlist[291]; goto compare; case 790: resword = &wordlist[292]; goto compare; case 812: resword = &wordlist[293]; goto compare; case 817: resword = &wordlist[294]; goto compare; case 902: resword = &wordlist[295]; goto compare; case 917: resword = &wordlist[296]; goto compare; case 932: resword = &wordlist[297]; goto compare; case 981: resword = &wordlist[298]; goto compare; case 1045: resword = &wordlist[299]; goto compare; } return (struct resword *) 0; compare: { register const char *s = resword->name; if (*str == *s && !strcmp (str + 1, s + 1)) return resword; } } } return (struct resword *) 0; } gperf-3.2.1/tests/configure0000775000000000000000000044357414774103073011351 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='' PACKAGE_TARNAME='' PACKAGE_VERSION='' PACKAGE_STRING='' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="c-parse.gperf" ac_subst_vars='LTLIBOBJS LIBOBJS CHECK_LANG_SYNTAX CXXCPP ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC SET_MAKE target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then if test "$as_dir$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir$ac_word${1+' '}$@" fi fi fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="clang" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" cpp /lib/cpp do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CPP=$CPP ;; esac fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP ;; esac fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_cv_c_compiler_gnu = yes && test $ac_cv_cxx_compiler_gnu = yes; then CHECK_LANG_SYNTAX='check-lang-syntax' else CHECK_LANG_SYNTAX='' fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[][ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi gperf-3.2.1/tests/Makefile.in0000664000000000000000000004772713347736347011522 # Makefile for gperf/tests # Copyright (C) 1989, 1992-1993, 1995, 1998, 2000, 2002-2004, 2007-2009, 2012, 2016, 2018 Free Software Foundation, Inc. # Written by Douglas C. Schmidt # and Bruno Haible . # # This file is part of GNU GPERF. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . #### Start of system configuration section. #### # Directories used by "make": srcdir = @srcdir@ # Programs used by "make": # C compiler CC = @CC@ CFLAGS = @CFLAGS@ CPP = @CPP@ # C++ compiler CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ CXXCPP = @CXXCPP@ # Both C and C++ compiler CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ OBJEXT = @OBJEXT@ EXEEXT = @EXEEXT@ # Other MV = mv LN = ln RM = rm -f @SET_MAKE@ #### End of system configuration section. #### SHELL = /bin/sh VPATH = $(srcdir) GPERF = ../src/gperf #GPERF = valgrind --num-callers=20 --leak-check=yes --leak-resolution=high --show-reachable=yes ../src/gperf all : install : all installdirs : uninstall : check : check-c check-ada check-modula3 check-pascal check-lang-utf8 check-lang-ucs2 check-smtp check-test @true extracheck : @CHECK_LANG_SYNTAX@ @true check-c: test.$(OBJEXT) @echo "testing ANSI C reserved words, all items should be found in the set" $(GPERF) -c -l -S1 -I -o $(srcdir)/c.gperf > cinset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o cout cinset.c test.$(OBJEXT) ./cout -v < $(srcdir)/c.gperf | LC_ALL=C tr -d '\r' > c.out diff $(srcdir)/c.exp c.out check-ada: test.$(OBJEXT) $(GPERF) -k1,4,'$$' -I $(srcdir)/ada.gperf > adainset.c # double '$$' is only there since make gets confused; program wants only 1 '$' $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o aout adainset.c test.$(OBJEXT) @echo "testing Ada reserved words, all items should be found in the set" ./aout -v < $(srcdir)/ada.gperf | LC_ALL=C tr -d '\r' > ada-res.out diff $(srcdir)/ada-res.exp ada-res.out $(GPERF) -D -k1,'$$' -s 2 -I -o $(srcdir)/adadefs.gperf > preinset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o preout preinset.c test.$(OBJEXT) @echo "testing Ada predefined words, all items should be found in the set" ./preout -v < $(srcdir)/adadefs.gperf | LC_ALL=C tr -d '\r' > ada-pred.out diff $(srcdir)/ada-pred.exp ada-pred.out check-modula3: test.$(OBJEXT) $(GPERF) -k1,2,'$$' -I -o $(srcdir)/modula3.gperf > m3inset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o m3out m3inset.c test.$(OBJEXT) @echo "testing Modula3 reserved words, all items should be found in the set" ./m3out -v < $(srcdir)/modula3.gperf | LC_ALL=C tr -d '\r' > modula.out diff $(srcdir)/modula.exp modula.out check-pascal: test.$(OBJEXT) $(GPERF) -o -S2 -I < $(srcdir)/pascal.gperf > pinset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o pout pinset.c test.$(OBJEXT) @echo "testing Pascal reserved words, all items should be found in the set" ./pout -v < $(srcdir)/pascal.gperf | LC_ALL=C tr -d '\r' > pascal.out diff $(srcdir)/pascal.exp pascal.out # check for 8-bit cleanliness check-lang-utf8: test.$(OBJEXT) $(GPERF) -k1 -t -I -K foreign_name < $(srcdir)/lang-utf8.gperf > lu8inset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o lu8out lu8inset.c test.$(OBJEXT) @echo "testing UTF-8 encoded languages, all items should be found in the set" sed -e '1,6d' -e 's/,.*//' < $(srcdir)/lang-utf8.gperf | ./lu8out -v | LC_ALL=C tr -d '\r' > lang-utf8.out diff $(srcdir)/lang-utf8.exp lang-utf8.out test.$(OBJEXT) : $(srcdir)/test.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $(srcdir)/test.c # check for binary keywords with NUL bytes check-lang-ucs2: test2.$(OBJEXT) $(GPERF) -k4 -t -l -I -K foreign_name < $(srcdir)/lang-ucs2.gperf > lu2inset.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o lu2out lu2inset.c test2.$(OBJEXT) @echo "testing UCS-2 encoded languages, all items should be found in the set" ./lu2out -v < $(srcdir)/lang-ucs2.in | LC_ALL=C tr -d '\r' > lang-ucs2.out diff $(srcdir)/lang-ucs2.exp lang-ucs2.out test2.$(OBJEXT) : $(srcdir)/test2.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $(srcdir)/test2.c # check case-insensitive lookup check-smtp: @echo "testing SMTP keywords, case-insensitive" $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case $(srcdir)/smtp.gperf > smtp.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o smtp smtp.c ./smtp $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case --compare-strncmp $(srcdir)/smtp.gperf > smtp.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o smtp smtp.c ./smtp $(GPERF) --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case --compare-lengths $(srcdir)/smtp.gperf > smtp.c $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -o smtp smtp.c ./smtp # these next 5 are demos that show off the generated code POSTPROCESS_FOR_MINGW = LC_ALL=C tr -d '\r' | LC_ALL=C sed -e 's|[^ ]*[/\\][\\]*src[/\\][\\]*gperf[^ ]*|../src/gperf|' check-test: check-ada $(GPERF) -L C -F ', 0, 0' -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,'$$' < $(srcdir)/c-parse.gperf | $(POSTPROCESS_FOR_MINGW) > c-parse.out diff $(srcdir)/c-parse.exp c-parse.out $(GPERF) -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,'$$' < $(srcdir)/objc.gperf | $(POSTPROCESS_FOR_MINGW) > objc.out diff $(srcdir)/objc.exp objc.out $(GPERF) -L C -F ', 0, 0, 0' -D -E -S1 -j1 -i 1 -g -o -t -k'*' < $(srcdir)/chill.gperf | $(POSTPROCESS_FOR_MINGW) > chill.out diff $(srcdir)/chill.exp chill.out $(GPERF) -L C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,7,'$$' < $(srcdir)/cplusplus.gperf | $(POSTPROCESS_FOR_MINGW) > cplusplus.out diff $(srcdir)/cplusplus.exp cplusplus.out $(GPERF) -L C -F ', 0' -t -j1 -i 1 -g -o -N java_keyword -k1,3,'$$' < $(srcdir)/java.gperf | $(POSTPROCESS_FOR_MINGW) > java.out diff $(srcdir)/java.exp java.out $(GPERF) -n -k1-8 -l < $(srcdir)/modula2.gperf | $(POSTPROCESS_FOR_MINGW) > modula2.out diff $(srcdir)/modula2.exp modula2.out $(GPERF) -D -t -k1,'$$' < $(srcdir)/c-parse.gperf | $(POSTPROCESS_FOR_MINGW) > test-4.out diff $(srcdir)/test-4.exp test-4.out $(GPERF) -g -o -j1 -t -N is_reserved_word < $(srcdir)/gpc.gperf | $(POSTPROCESS_FOR_MINGW) > gpc.out diff $(srcdir)/gpc.exp gpc.out $(GPERF) -m5 < $(srcdir)/permut2.gperf | $(POSTPROCESS_FOR_MINGW) > permut2.out diff $(srcdir)/permut2.exp permut2.out $(GPERF) -m5 < $(srcdir)/permut3.gperf | $(POSTPROCESS_FOR_MINGW) > permut3.out diff $(srcdir)/permut3.exp permut3.out $(GPERF) -m5 --ignore-case < $(srcdir)/permutc2.gperf | $(POSTPROCESS_FOR_MINGW) > permutc2.out diff $(srcdir)/permutc2.exp permutc2.out $(GPERF) -C -E -G -I -t < $(srcdir)/charsets.gperf | $(POSTPROCESS_FOR_MINGW) > charsets.out diff $(srcdir)/charsets.exp charsets.out $(GPERF) -C -E -G -I -t < $(srcdir)/languages.gperf | $(POSTPROCESS_FOR_MINGW) > languages.out diff $(srcdir)/languages.exp languages.out $(GPERF) -t < $(srcdir)/incomplete.gperf | $(POSTPROCESS_FOR_MINGW) > incomplete.out diff $(srcdir)/incomplete.exp incomplete.out # prints out the help message -$(GPERF) -h | $(POSTPROCESS_FOR_MINGW) > test-6.out diff $(srcdir)/test-6.exp test-6.out @echo "only if, do, for, case, goto, else, while, and return should be found " ./aout -v < $(srcdir)/c.gperf | $(POSTPROCESS_FOR_MINGW) > test-7.out diff $(srcdir)/test-7.exp test-7.out # The following validates valid language syntax with different parameters. # Works only with gcc and g++, and only on platforms where "gcc -ansi" is # usable. (There are still platforms where gcc-2.8.0's fixincludes does not # work well enough.) VALIDATE = CC='$(CC)' CFLAGS='$(CFLAGS)' CXX='$(CXX)' CXXFLAGS='$(CXXFLAGS)' CPPFLAGS='$(CPPFLAGS)' GPERF='$(GPERF)' $(srcdir)/validate check-lang-syntax : force $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -G -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -S 1000 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -G -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest1.gperf -P -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -S 1000 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -P -Q auxstrings -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -K key_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -H hash_function_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -W word_list_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest1.gperf -l --length-table-name=length_table_name sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \ $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -N lookup_function_name sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest1.gperf > tmp-jstest1.gperf && \ $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest1.gperf -Z class_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -G -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -c $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -C $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -E $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -G $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -S 10 -D $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k2 $(srcdir)/jstest2.gperf -t -S 10 -D -l $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -S 1000 sed -e 's,name,key_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -K key_name $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 $(srcdir)/jstest2.gperf -t -H hash_function_name sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -N lookup_function_name sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest2.gperf > tmp-jstest2.gperf && \ $(VALIDATE) KR-C,C,ANSI-C,C++ -k1,2 tmp-jstest2.gperf -t -Z class_name $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -G -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest3.gperf -t -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -S 1000 sed -e 's,name,key_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -K key_name $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest3.gperf -t -H hash_function_name sed -e 's,in_word_set,lookup_function_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -N lookup_function_name sed -e 's,Perfect_Hash,class_name,g' < $(srcdir)/jstest3.gperf > tmp-jstest3.gperf && \ $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest3.gperf -t -Z class_name $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -G -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -c $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -C $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -E $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -G $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -S 10 -D $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k2 $(srcdir)/jstest4.gperf -t -P -S 10 -D -l $(VALIDATE) C,ANSI-C,C++ -k1,2 $(srcdir)/jstest4.gperf -t -P -S 1000 sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \ $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings sed -e 's,stringpool,auxstrings,g' < $(srcdir)/jstest4.gperf > tmp-jstest4.gperf && \ $(VALIDATE) C,ANSI-C,C++ -k1,2 tmp-jstest4.gperf -t -P -Q auxstrings -S 10 mostlyclean : clean clean : force $(RM) *.$(OBJEXT) core *inset.c output.* *.out \ aout$(EXEEXT) aout$(EXEEXT).manifest \ cout$(EXEEXT) cout$(EXEEXT).manifest \ lu2out$(EXEEXT) lu2out$(EXEEXT).manifest \ lu8out$(EXEEXT) lu8out$(EXEEXT).manifest \ m3out$(EXEEXT) m3out$(EXEEXT).manifest \ pout$(EXEEXT) pout$(EXEEXT).manifest \ preout$(EXEEXT) preout$(EXEEXT).manifest \ smtp.c smtp$(EXEEXT) smtp$(EXEEXT).manifest \ tmp-* valitest* $(RM) -r *.dSYM distclean : clean $(RM) config.status config.log config.cache Makefile maintainer-clean : distclean # List of source files. SOURCE_FILES = \ configure.ac Makefile.in \ test.c \ c.gperf c.exp \ ada.gperf ada-res.exp adadefs.gperf ada-pred.exp \ modula3.gperf modula.exp \ pascal.gperf pascal.exp \ lang-utf8.gperf lang-utf8.exp \ lang-ucs2.gperf lang-ucs2.in lang-ucs2.exp test2.c \ smtp.gperf \ c-parse.gperf c-parse.exp \ objc.gperf objc.exp \ chill.gperf chill.exp \ cplusplus.gperf cplusplus.exp \ java.gperf java.exp \ modula2.gperf modula2.exp \ test-4.exp \ gpc.gperf gpc.exp \ permut2.gperf permut2.exp \ permut3.gperf permut3.exp \ permutc2.gperf permutc2.exp \ charsets.gperf charsets.exp \ languages.gperf languages.exp \ incomplete.gperf incomplete.exp \ test-6.exp \ test-7.exp \ validate \ jstest1.gperf \ jstest2.gperf \ jstest3.gperf \ jstest4.gperf \ c++.gperf irc.gperf jscript.gperf makeinfo.gperf # List of distributed files imported from other packages. IMPORTED_FILES = # List of distributed files generated by autotools or Makefile.devel. GENERATED_FILES = \ configure # List of distributed files generated by "make". DISTRIBUTED_BUILT_FILES = # List of distributed files. DISTFILES = $(SOURCE_FILES) $(IMPORTED_FILES) $(GENERATED_FILES) $(DISTRIBUTED_BUILT_FILES) distdir : $(DISTFILES) for file in $(DISTFILES); do \ if test -f $$file; then dir='.'; else dir='$(srcdir)'; fi; \ cp -p $$dir/$$file '$(distdir)'/$$file || exit 1; \ done force : gperf-3.2.1/tests/gpc.gperf0000664000000000000000000000214213074402054011207 %{ /* ISO Pascal 7185 reserved words. * * For GNU Pascal compiler (GPC) by jtv@hut.fi * * run this through the Doug Schmidt's gperf program * with command * gperf -g -o -j1 -t -p -N is_reserved_word * */ %} struct resword { char *name; short token; short iclass;}; %% And, AND, PASCAL_ISO Array, ARRAY, PASCAL_ISO Begin, BEGIN_, PASCAL_ISO Case, CASE, PASCAL_ISO Const, CONST, PASCAL_ISO Div, DIV, PASCAL_ISO Do, DO, PASCAL_ISO Downto, DOWNTO, PASCAL_ISO Else, ELSE, PASCAL_ISO End, END, PASCAL_ISO File, FILE_, PASCAL_ISO For, FOR, PASCAL_ISO Function, FUNCTION, PASCAL_ISO Goto, GOTO, PASCAL_ISO If, IF, PASCAL_ISO In, IN, PASCAL_ISO Label, LABEL, PASCAL_ISO Mod, MOD, PASCAL_ISO Nil, NIL, PASCAL_ISO Not, NOT, PASCAL_ISO Of, OF, PASCAL_ISO Or, OR, PASCAL_ISO Packed, PACKED, PASCAL_ISO Procedure, PROCEDURE, PASCAL_ISO Program,PROGRAM,PASCAL_ISO Record, RECORD, PASCAL_ISO Repeat, REPEAT, PASCAL_ISO Set, SET, PASCAL_ISO Then, THEN, PASCAL_ISO To, TO, PASCAL_ISO Type, TYPE, PASCAL_ISO Until, UNTIL, PASCAL_ISO Var, VAR, PASCAL_ISO While, WHILE, PASCAL_ISO With, WITH, PASCAL_ISO gperf-3.2.1/tests/pascal.gperf0000664000000000000000000000027413074402054011705 with array and function case var const until then set record program procedure or packed not nil label in repeat of goto forward for while file else downto do div to type end mod begin if gperf-3.2.1/tests/c.gperf0000664000000000000000000000030613074402054010660 if do int for case char auto goto else long void enum float short union break while const double static extern struct return sizeof switch signed typedef default unsigned continue register volatile gperf-3.2.1/tests/permut2.exp0000664000000000000000000000732414776761056011560 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -m5 */ /* Computed positions: -k'1-2' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #define TOTAL_KEYWORDS 4 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 2 #define MIN_HASH_VALUE 0 #define MAX_HASH_VALUE 3 /* maximum key range = 4, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif /*ARGSUSED*/ static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 1, 0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; (void) len; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; } const char * in_word_set (register const char *str, register size_t len) { static const char * wordlist[] = { "xy", "zx", "yx", "xz" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key]; if (*str == *s && !strcmp (str + 1, s + 1)) return s; } } return (const char *) 0; } gperf-3.2.1/tests/jstest4.gperf0000664000000000000000000000352413074402054012043 struct js_keyword { int name; int token; } %% abstract, 1 boolean, 2 break, 3 byte, 4 case, 5 catch, 6 char, 7 class, 8 const, 9 continue, 10 default, 11 do, 12 double, 13 else, 14 extends, 15 false, 16 final, 17 finally, 18 float, 19 for, 20 function, 21 goto, 22 if, 23 implements, 24 import, 25 in, 26 instanceof, 27 int, 28 interface, 29 long, 30 native, 31 new, 32 null, 33 package, 34 private, 35 protected, 36 public, 37 return, 38 short, 39 static, 40 super, 41 switch, 42 synchronized, 43 this, 44 throw, 45 throws, 46 transient, 47 true, 48 try, 49 var, 50 void, 51 while, 52 with, 53 %% #include #include static const char* testdata[] = { "bogus", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "var", "void", "while", "with" }; int main () { int i; for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++) { #ifdef CPLUSPLUS_TEST const struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i])); #else const struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i])); #endif if (i > 0) { if (!resword) exit (1); if (strcmp(testdata[i],stringpool+resword->name)) exit (1); } else { if (resword) exit (1); } } return 0; } gperf-3.2.1/tests/lang-ucs2.gperf0000664000000000000000000000333013074402054012231 struct language { const char *foreign_name; const char *english_name; const char *locale; }; %% "\x12\xA0\x12\x1B\x12\x2D\x12\x9B", "Amharic", NULL "\x01\x0D\x00\x65\x00\x73\x00\x6B\x00\x79", "Czech", "cs_CZ.UTF-8" "\x00\x44\x00\x61\x00\x6E\x00\x73\x00\x6B", "Danish", "da_DK.UTF-8" "\x00\x45\x00\x6E\x00\x67\x00\x6C\x00\x69\x00\x73\x00\x68", "English", "en_GB.UTF-8" "\x00\x53\x00\x75\x00\x6F\x00\x6D\x00\x69", "Finnish", "fi_FI.UTF-8" "\x00\x46\x00\x72\x00\x61\x00\x6E\x00\xE7\x00\x61\x00\x69\x00\x73", "French", "fr_FR.UTF-8" "\x00\x44\x00\x65\x00\x75\x00\x74\x00\x73\x00\x63\x00\x68", "German", "de_DE.UTF-8" "\x03\x95\x03\xBB\x03\xBB\x03\xB7\x03\xBD\x03\xB9\x03\xBA\x03\xAC", "Greek", "el_GR.UTF-8" "\x05\xE2\x05\xD1\x05\xE8\x05\xD9\x05\xEA", "Hebrew", "he_IL.UTF-8" "\x00\x49\x00\x74\x00\x61\x00\x6C\x00\x69\x00\x61\x00\x6E\x00\x6F", "Italian", "it_IT.UTF-8" "\x00\x4E\x00\x6F\x00\x72\x00\x73\x00\x6B", "Norwegian", "no_NO.UTF-8" "\x04\x20\x04\x43\x04\x41\x04\x41\x04\x3A\x04\x38\x04\x39", "Russian", "ru_RU.UTF-8" "\x00\x45\x00\x73\x00\x70\x00\x61\x00\xF1\x00\x6F\x00\x6C", "Spanish", "es_ES.UTF-8" "\x00\x53\x00\x76\x00\x65\x00\x6E\x00\x73\x00\x6B\x00\x61", "Swedish", "sv_SE.UTF-8" "\x0E\x20\x0E\x32\x0E\x29\x0E\x32\x0E\x44\x0E\x17\x0E\x22", "Thai", "th_TH.UTF-8" "\x00\x54\x00\xFC\x00\x72\x00\x6B\x00\xE7\x00\x65", "Turkish", "tr_TR.UTF-8" "\x00\x54\x00\x69\x1E\xBF\x00\x6E\x00\x67\x00\x20\x00\x56\x00\x69\x1E\xC7\x00\x74", "Vietnamese", "vi_VN.UTF-8" "\x65\xE5\x67\x2C\x8A\x9E", "Japanese", "ja_JP.UTF-8" "\x4E\x2D\x65\x87", "Chinese", "zh_CN.UTF-8" "\xD5\x5C\xAE\x00", "Korean", "ko_KR.UTF-8" gperf-3.2.1/tests/java.gperf0000664000000000000000000000401114665065272011372 %{ /* Keyword definition for the GNU compiler for the Java(TM) language. Copyright (C) 1997, 1998 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ %} struct java_keyword { const char *name; int token; }; %% abstract, ABSTRACT_TK default, DEFAULT_TK if, IF_TK private, PRIVATE_TK throw, THROW_TK boolean, BOOLEAN_TK do, DO_TK implements, IMPLEMENTS_TK protected, PROTECTED_TK throws, THROWS_TK break, BREAK_TK double, DOUBLE_TK import, IMPORT_TK public, PUBLIC_TK transient, TRANSIENT_TK byte, BYTE_TK else, ELSE_TK instanceof, INSTANCEOF_TK return, RETURN_TK try, TRY_TK case, CASE_TK extends, EXTENDS_TK int, INT_TK short, SHORT_TK void, VOID_TK catch, CATCH_TK final, FINAL_TK interface, INTERFACE_TK static, STATIC_TK volatile, VOLATILE_TK char, CHAR_TK finally, FINALLY_TK long, LONG_TK super, SUPER_TK while, WHILE_TK class, CLASS_TK float, FLOAT_TK native, NATIVE_TK switch, SWITCH_TK const, CONST_TK for, FOR_TK new, NEW_TK synchronized, SYNCHRONIZED_TK continue, CONTINUE_TK goto, GOTO_TK package, PACKAGE_TK this, THIS_TK # true, false and null aren't keyword. But we match them easily this way true, TRUE_TK false, FALSE_TK null, NULL_TK gperf-3.2.1/tests/objc.exp0000664000000000000000000001672114776761052011074 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -j1 -i 1 -g -o -t -N is_reserved_word -k'1,3,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Command-line: gperf -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ objc.gperf */ struct resword { char *name; short token; enum rid rid; }; #define TOTAL_KEYWORDS 59 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 15 #define MIN_HASH_VALUE 8 #define MAX_HASH_VALUE 95 /* maximum key range = 88, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 19, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 2, 1, 10, 26, 1, 23, 27, 27, 24, 96, 1, 25, 36, 10, 34, 23, 96, 10, 6, 8, 11, 41, 2, 96, 96, 23, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct resword * is_reserved_word (register const char *str, register size_t len) { #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static struct resword wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"break", BREAK, NORID}, {""}, {""}, {""}, {"else", ELSE, NORID}, {"__asm__", ASM, NORID}, {""}, {""}, {"__attribute", ATTRIBUTE, NORID}, {"__alignof__", ALIGNOF, NORID}, {"__extension__", EXTENSION, NORID}, {"__attribute__", ATTRIBUTE, NORID}, {"__signed__", TYPESPEC, RID_SIGNED}, {"case", CASE, NORID}, {"__typeof__", TYPEOF, NORID}, {"__const__", TYPE_QUAL, RID_CONST}, {"static", SCSPEC, RID_STATIC}, {"extern", SCSPEC, RID_EXTERN}, {"char", TYPESPEC, RID_CHAR}, {"__const", TYPE_QUAL, RID_CONST}, {""}, {"continue", CONTINUE, NORID}, {"struct", STRUCT, NORID}, {"@defs", DEFS, NORID}, {"while", WHILE, NORID}, {"const", TYPE_QUAL, RID_CONST}, {"return", RETURN, NORID}, {"__inline", SCSPEC, RID_INLINE}, {"__alignof", ALIGNOF, NORID}, {"@encode", ENCODE, NORID}, {"__inline__", SCSPEC, RID_INLINE}, {"@selector", SELECTOR, NORID}, {"@interface", INTERFACE, NORID}, {"__typeof", TYPEOF, NORID}, {"__signed", TYPESPEC, RID_SIGNED}, {"int", TYPESPEC, RID_INT}, {"double", TYPESPEC, RID_DOUBLE}, {"__asm", ASM, NORID}, {"for", FOR, NORID}, {"@public", PUBLIC, NORID}, {"auto", SCSPEC, RID_AUTO}, {"if", IF, NORID}, {"union", UNION, NORID}, {"unsigned", TYPESPEC, RID_UNSIGNED}, {"enum", ENUM, NORID}, {"short", TYPESPEC, RID_SHORT}, {"__volatile", TYPE_QUAL, RID_VOLATILE}, {"register", SCSPEC, RID_REGISTER}, {"inline", SCSPEC, RID_INLINE}, {"__volatile__", TYPE_QUAL, RID_VOLATILE}, {"sizeof", SIZEOF, NORID}, {"@end", END, NORID}, {"typeof", TYPEOF, NORID}, {"typedef", SCSPEC, RID_TYPEDEF}, {"do", DO, NORID}, {"switch", SWITCH, NORID}, {"default", DEFAULT, NORID}, {"signed", TYPESPEC, RID_SIGNED}, {"long", TYPESPEC, RID_LONG}, {""}, {""}, {""}, {"float", TYPESPEC, RID_FLOAT}, {""}, {""}, {"goto", GOTO, NORID}, {""}, {"volatile", TYPE_QUAL, RID_VOLATILE}, {""}, {"asm", ASM, NORID}, {""}, {""}, {"@implementation", IMPLEMENTATION, NORID}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"void", TYPESPEC, RID_VOID} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct resword *) 0; } gperf-3.2.1/tests/c-parse.exp0000664000000000000000000002101614776761013011477 /* C code produced by gperf version 3.2.1 */ /* Command-line: gperf -L C -F ', 0, 0' -j1 -i 1 -g -o -t -G -N is_reserved_word -k'1,3,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ struct resword { const char *name; short token; enum rid rid; }; #define TOTAL_KEYWORDS 83 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 20 #define MIN_HASH_VALUE 12 #define MAX_HASH_VALUE 125 /* maximum key range = 114, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (str, len) register const char *str; register size_t len; { static unsigned char asso_values[] = { 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 19, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 1, 126, 12, 50, 17, 22, 18, 51, 37, 5, 10, 126, 15, 35, 49, 27, 40, 28, 126, 2, 20, 1, 33, 64, 7, 11, 4, 7, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } static struct resword wordlist[] = { {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"__real__", REALPART, NORID}, {"__typeof__", TYPEOF, NORID}, {"__restrict", TYPE_QUAL, RID_RESTRICT}, {"int", TYPESPEC, RID_INT}, {"__restrict__", TYPE_QUAL, RID_RESTRICT}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"__imag__", IMAGPART, NORID}, {"__asm__", ASM_KEYWORD, NORID}, {"__inline__", SCSPEC, RID_INLINE}, {"__iterator", SCSPEC, RID_ITERATOR}, {"__iterator__", SCSPEC, RID_ITERATOR}, {"__alignof__", ALIGNOF, NORID}, {"__const", TYPE_QUAL, RID_CONST}, {"__attribute__", ATTRIBUTE, NORID}, {"__const__", TYPE_QUAL, RID_CONST}, {"struct", STRUCT, NORID}, {"__complex__", TYPESPEC, RID_COMPLEX}, {"restrict", TYPE_QUAL, RID_RESTRICT}, {"__signed__", TYPESPEC, RID_SIGNED}, {"__extension__", EXTENSION, NORID}, {"id", OBJECTNAME, RID_ID}, {"char", TYPESPEC, RID_CHAR}, {"return", RETURN, NORID}, {"__inline", SCSPEC, RID_INLINE}, {"__complex", TYPESPEC, RID_COMPLEX}, {"in", TYPE_QUAL, RID_IN}, {"while", WHILE, NORID}, {"switch", SWITCH, NORID}, {"__attribute", ATTRIBUTE, NORID}, {"", 0, 0}, {"__real", REALPART, NORID}, {"out", TYPE_QUAL, RID_OUT}, {"__label__", LABEL, NORID}, {"@private", PRIVATE, NORID}, {"@selector", SELECTOR, NORID}, {"register", SCSPEC, RID_REGISTER}, {"const", TYPE_QUAL, RID_CONST}, {"__signed", TYPESPEC, RID_SIGNED}, {"extern", SCSPEC, RID_EXTERN}, {"@protected", PROTECTED, NORID}, {"__imag", IMAGPART, NORID}, {"static", SCSPEC, RID_STATIC}, {"inout", TYPE_QUAL, RID_INOUT}, {"auto", SCSPEC, RID_AUTO}, {"for", FOR, NORID}, {"case", CASE, NORID}, {"else", ELSE, NORID}, {"__typeof", TYPEOF, NORID}, {"@defs", DEFS, NORID}, {"if", IF, NORID}, {"do", DO, NORID}, {"@protocol", PROTOCOL, NORID}, {"short", TYPESPEC, RID_SHORT}, {"__asm", ASM_KEYWORD, NORID}, {"oneway", TYPE_QUAL, RID_ONEWAY}, {"inline", SCSPEC, RID_INLINE}, {"continue", CONTINUE, NORID}, {"@encode", ENCODE, NORID}, {"@end", END, NORID}, {"__alignof", ALIGNOF, NORID}, {"@interface", INTERFACE, NORID}, {"union", UNION, NORID}, {"@public", PUBLIC, NORID}, {"bycopy", TYPE_QUAL, RID_BYCOPY}, {"__volatile__", TYPE_QUAL, RID_VOLATILE}, {"double", TYPESPEC, RID_DOUBLE}, {"@class", CLASS, NORID}, {"default", DEFAULT, NORID}, {"goto", GOTO, NORID}, {"unsigned", TYPESPEC, RID_UNSIGNED}, {"sizeof", SIZEOF, NORID}, {"signed", TYPESPEC, RID_SIGNED}, {"typeof", TYPEOF, NORID}, {"typedef", SCSPEC, RID_TYPEDEF}, {"break", BREAK, NORID}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"__volatile", TYPE_QUAL, RID_VOLATILE}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"float", TYPESPEC, RID_FLOAT}, {"", 0, 0}, {"@compatibility_alias", ALIAS, NORID}, {"void", TYPESPEC, RID_VOID}, {"", 0, 0}, {"", 0, 0}, {"long", TYPESPEC, RID_LONG}, {"enum", ENUM, NORID}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"byref", TYPE_QUAL, RID_BYREF}, {"", 0, 0}, {"@implementation", IMPLEMENTATION, NORID}, {"", 0, 0}, {"", 0, 0}, {"asm", ASM_KEYWORD, NORID}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"", 0, 0}, {"volatile", TYPE_QUAL, RID_VOLATILE} }; struct resword * is_reserved_word (str, len) register const char *str; register size_t len; { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct resword *) 0; } gperf-3.2.1/tests/lang-utf8.exp0000664000000000000000000000067313074402054011743 in word set አማርኛ in word set česky in word set Dansk in word set English in word set Suomi in word set Français in word set Deutsch in word set Ελληνικά in word set עברית in word set Italiano in word set Norsk in word set Русский in word set Español in word set Svenska in word set ภาษาไทย in word set Türkçe in word set Tiếng Việt in word set 日本語 in word set 中文 in word set 한글 gperf-3.2.1/tests/java.exp0000664000000000000000000001663214776761026011102 /* C code produced by gperf version 3.2.1 */ /* Command-line: gperf -L C -F ', 0' -t -j1 -i 1 -g -o -N java_keyword -k'1,3,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Keyword definition for the GNU compiler for the Java(TM) language. Copyright (C) 1997, 1998 Free Software Foundation, Inc. Contributed by Alexandre Petit-Bianco (apbianco@cygnus.com) This file is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This file is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Java and all Java-based marks are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and other countries. The Free Software Foundation is independent of Sun Microsystems, Inc. */ struct java_keyword { const char *name; int token; }; #define TOTAL_KEYWORDS 50 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 12 #define MIN_HASH_VALUE 7 #define MAX_HASH_VALUE 76 /* maximum key range = 70, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (str, len) register const char *str; register size_t len; { static unsigned char asso_values[] = { 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 7, 30, 7, 12, 1, 14, 28, 41, 3, 77, 16, 11, 77, 16, 23, 1, 77, 15, 1, 1, 34, 30, 18, 77, 11, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } struct java_keyword * java_keyword (str, len) register const char *str; register size_t len; { static struct java_keyword wordlist[] = { {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"else", ELSE_TK}, {"int", INT_TK}, {"this", THIS_TK}, {"extends", EXTENDS_TK}, {"import", IMPORT_TK}, {"private", PRIVATE_TK}, {"case", CASE_TK}, {"interface", INTERFACE_TK}, {"implements", IMPLEMENTS_TK}, {"package", PACKAGE_TK}, {"abstract", ABSTRACT_TK}, {"transient", TRANSIENT_TK}, {"if", IF_TK}, {"class", CLASS_TK}, {"static", STATIC_TK}, {"super", SUPER_TK}, {"throws", THROWS_TK}, {"native", NATIVE_TK}, {"", 0}, {"try", TRY_TK}, {"while", WHILE_TK}, {"instanceof", INSTANCEOF_TK}, {"const", CONST_TK}, {"short", SHORT_TK}, {"false", FALSE_TK}, {"continue", CONTINUE_TK}, {"char", CHAR_TK}, {"default", DEFAULT_TK}, {"", 0}, {"byte", BYTE_TK}, {"do", DO_TK}, {"return", RETURN_TK}, {"throw", THROW_TK}, {"true", TRUE_TK}, {"synchronized", SYNCHRONIZED_TK}, {"null", NULL_TK}, {"float", FLOAT_TK}, {"public", PUBLIC_TK}, {"protected", PROTECTED_TK}, {"final", FINAL_TK}, {"for", FOR_TK}, {"finally", FINALLY_TK}, {"void", VOID_TK}, {"volatile", VOLATILE_TK}, {"switch", SWITCH_TK}, {"break", BREAK_TK}, {"double", DOUBLE_TK}, {"catch", CATCH_TK}, {"new", NEW_TK}, {"goto", GOTO_TK}, {"", 0}, {"", 0}, {"long", LONG_TK}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"", 0}, {"boolean", BOOLEAN_TK} }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct java_keyword *) 0; } gperf-3.2.1/tests/permut2.gperf0000664000000000000000000000001413074402054012030 xy yx xz zx gperf-3.2.1/tests/modula2.gperf0000664000000000000000000000034113074402054012000 AND ARRAY BEGIN BY CASE CONST DEFINITION DIV DO ELSE ELSIF END EXIT EXPORT FOR FROM IF IMPLEMENTATION IMPORT IN LOOP MOD MODULE NOT OF OR POINTER PROCEDURE QUALIFIED RECORD REPEAT RETURN SET THEN TO TYPE UNTIL VAR WHILE WITH gperf-3.2.1/tests/cplusplus.gperf0000664000000000000000000000605113074402054012473 %{ /* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -g -o -t -N is_reserved_word -k1,4,$,7 gplus.gperf */ %} struct resword { const char *name; short token; enum rid rid;}; %% __alignof, ALIGNOF, NORID __alignof__, ALIGNOF, NORID __asm, ASM_KEYWORD, NORID __asm__, ASM_KEYWORD, NORID __attribute, ATTRIBUTE, NORID __attribute__, ATTRIBUTE, NORID __complex, TYPESPEC, RID_COMPLEX __complex__, TYPESPEC, RID_COMPLEX __const, CV_QUALIFIER, RID_CONST __const__, CV_QUALIFIER, RID_CONST __extension__, EXTENSION, NORID __imag, IMAGPART, NORID __imag__, IMAGPART, NORID __inline, SCSPEC, RID_INLINE __inline__, SCSPEC, RID_INLINE __label__, LABEL, NORID __null, CONSTANT, RID_NULL __real, REALPART, NORID __real__, REALPART, NORID __restrict, CV_QUALIFIER, RID_RESTRICT __restrict__, CV_QUALIFIER, RID_RESTRICT __signature__, AGGR, RID_SIGNATURE /* Extension */, __signed, TYPESPEC, RID_SIGNED __signed__, TYPESPEC, RID_SIGNED __sigof__, SIGOF, NORID /* Extension */, __typeof, TYPEOF, NORID __typeof__, TYPEOF, NORID __volatile, CV_QUALIFIER, RID_VOLATILE __volatile__, CV_QUALIFIER, RID_VOLATILE __wchar_t, TYPESPEC, RID_WCHAR /* Unique to ANSI C++ */, asm, ASM_KEYWORD, NORID, and, ANDAND, NORID, and_eq, ASSIGN, NORID, auto, SCSPEC, RID_AUTO, bitand, '&', NORID, bitor, '|', NORID, bool, TYPESPEC, RID_BOOL, break, BREAK, NORID, case, CASE, NORID, catch, CATCH, NORID, char, TYPESPEC, RID_CHAR, class, AGGR, RID_CLASS, compl, '~', NORID, const, CV_QUALIFIER, RID_CONST, const_cast, CONST_CAST, NORID, continue, CONTINUE, NORID, default, DEFAULT, NORID, delete, DELETE, NORID, do, DO, NORID, double, TYPESPEC, RID_DOUBLE, dynamic_cast, DYNAMIC_CAST, NORID, else, ELSE, NORID, enum, ENUM, NORID, explicit, SCSPEC, RID_EXPLICIT, export, SCSPEC, RID_EXPORT, extern, SCSPEC, RID_EXTERN, false, CXX_FALSE, NORID, float, TYPESPEC, RID_FLOAT, for, FOR, NORID, friend, SCSPEC, RID_FRIEND, goto, GOTO, NORID, if, IF, NORID, inline, SCSPEC, RID_INLINE, int, TYPESPEC, RID_INT, long, TYPESPEC, RID_LONG, mutable, SCSPEC, RID_MUTABLE, namespace, NAMESPACE, NORID, new, NEW, NORID, not, '!', NORID, not_eq, EQCOMPARE, NORID, operator, OPERATOR, NORID, or, OROR, NORID, or_eq, ASSIGN, NORID, private, VISSPEC, RID_PRIVATE, protected, VISSPEC, RID_PROTECTED, public, VISSPEC, RID_PUBLIC, register, SCSPEC, RID_REGISTER, reinterpret_cast, REINTERPRET_CAST, NORID, return, RETURN_KEYWORD, NORID, short, TYPESPEC, RID_SHORT, signature, AGGR, RID_SIGNATURE /* Extension */, signed, TYPESPEC, RID_SIGNED, sigof, SIGOF, NORID /* Extension */, sizeof, SIZEOF, NORID, static, SCSPEC, RID_STATIC, static_cast, STATIC_CAST, NORID, struct, AGGR, RID_RECORD, switch, SWITCH, NORID, template, TEMPLATE, RID_TEMPLATE, this, THIS, NORID, throw, THROW, NORID, true, CXX_TRUE, NORID, try, TRY, NORID, typedef, SCSPEC, RID_TYPEDEF, typename, TYPENAME_KEYWORD, NORID, typeid, TYPEID, NORID, typeof, TYPEOF, NORID, union, AGGR, RID_UNION, unsigned, TYPESPEC, RID_UNSIGNED, using, USING, NORID, virtual, SCSPEC, RID_VIRTUAL, void, TYPESPEC, RID_VOID, volatile, CV_QUALIFIER, RID_VOLATILE, while, WHILE, NORID, xor, '^', NORID, xor_eq, ASSIGN, NORID, gperf-3.2.1/tests/test2.c0000664000000000000000000000305314200332723010615 /* Tests the generated perfect hash function. The -v option prints diagnostics as to whether a word is in the set or not. Without -v the program is useful for timing. */ #include /* Support for SET_BINARY. */ #include #if !defined O_BINARY && defined _O_BINARY # define O_BINARY _O_BINARY #endif #ifdef __BEOS__ # undef O_BINARY #endif #if O_BINARY # include # if defined __EMX__ || defined __DJGPP__ || defined __CYGWIN__ # define SET_BINARY(f) setmode (f, O_BINARY) # else # define SET_BINARY(f) _setmode (f, O_BINARY) # endif #else # define SET_BINARY(f) (void)0 #endif extern struct language * in_word_set (const char *, size_t); #define MAX_LEN 80 int main (int argc, char *argv[]) { int verbose = argc > 1 ? 1 : 0; char buf[2*MAX_LEN]; int buflen; /* We need to read stdin in binary mode. */ SET_BINARY (0); for (;;) { /* Simulate gets(buf) with 2 bytes per character. */ char *p = buf; while (fread (p, 2, 1, stdin) == 1) { if (((unsigned char) p[0] << 8) + (unsigned char) p[1] == '\n') break; p += 2; } buflen = p - buf; if (buflen == 0) break; if (in_word_set (buf, buflen)) { if (verbose) printf ("in word set:"); } else { if (verbose) printf ("NOT in word set:"); } for (p = buf; p < buf + buflen; p += 2) printf (" %02X%02X", (unsigned char) p[0], (unsigned char) p[1]); printf("\n"); } return 0; } gperf-3.2.1/tests/languages.gperf0000664000000000000000000007240513347737124012431 %{ /* gperf -CDEGTlot -H language_hash -K code -L ANSI-C -N language_entry */ /* Generated from ISO 639 language data from http://lcweb.loc.gov/standards/iso639-2/langhome.html and from IANA registry at https://www.iana.org/assignments/language-tags by %M% */ /* englangn.html Updated: August 14, 2002 */ /* frenchlangn.html Updated: August 14, 2002 */ /* language-tags last updated 2001-07-17 */ %} struct language { const char *code; const char *name_en; int num_en; const char *name_fr; int num_fr; }; %% cel-gaulish, "Gaulish", 463, "Gaulish", 454 uig, "Uighur", 431, "ougour", 315 ton, "Tonga (Tonga Islands)", 418, "tongan (les Tonga)", 415 rm, "Raeto-Romance", 340, "rhto-roman", 342 pt, "Portuguese", 334, "portugais", 334 mri, "Maori", 265, "maori", 262 ilo, "Iloko", 176, "ilocano", 176 hrv, "Croatian", 93, "croate", 99 i-navajo, "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000", 481, "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000", 472 tg, "Tajik", 401, "tadjik", 392 rn, "Rundi", 347, "rundi", 345 kom, "Komi", 213, "komi", 214 i-tao, "Tao", 483, "Tao", 474 de-at-1901, "German Austrian variant traditional orthography", 466, "German Austrian variant traditional orthography", 457 vai, "Vai", 437, "va", 430 th, "Thai", 408, "tha", 405 ro, "Romanian", 345, "roumain", 344 mag, "Magahi", 252, "magahi", 246 kon, "Kongo", 214, "kongo", 215 nld, "Dutch", 106, "nerlandais", 288 ces, "Czech", 95, "tchque", 398 afh, "Afrihili", 6, "afrihili", 6 aus, "Australian languages", 27, "australiennes, langues", 32 sgn-pt, "Portuguese Sign Language", 506, "Portuguese Sign Language", 497 ti, "Tigrinya", 411, "tigrigna", 409 sux, "Sumerian", 391, "sumrien", 388 mah, "Marshallese", 268, "marshall", 265 hau, "Hausa", 159, "haoussa", 159 ce, "Chechen", 74, "tchtchne", 399 mai, "Maithili", 253, "maithili", 247 gmh, "German, Middle High (ca.1050-1500)", 144, "", 0 am, "Amharic", 15, "amharique", 17 sgn-be-nl, "Belgian-Flemish Sign Language", 489, "Belgian-Flemish Sign Language", 480 tk, "Turkmen", 426, "turkmne", 425 haw, "Hawaiian", 160, "hawaen", 160 zen, "Zenaga", 458, "zenaga", 449 tl, "Tagalog", 398, "tagalog", 393 oss, "Ossetic; Ossetian", 318, "osste", 312 mak, "Makasar", 254, "makassar", 248 kor, "Korean", 216, "coren", 93 ch, "Chamorro", 73, "chamorro", 79 mal, "Malayalam", 257, "malayalam", 250 lez, "Lezghian", 233, "lezghien", 232 kos, "Kosraean", 217, "kosrae", 217 ira, "Iranian (Other)", 184, "iraniennes, autres langues", 184 zh-xiang, "Xiang or Hunanese", 516, "Xiang or Hunanese", 507 tn, "Tswana", 421, "tswana", 420 ru, "Russian", 348, "russe", 346 lim, "Limburgish; Limburger; Limburgan", 236, "limbourgeois", 233 ful, "Fulah", 133, "peul", 329 dak, "Dakota", 96, "dakota", 100 umb, "Umbundu", 433, "umbundu", 429 tsi, "Tsimshian", 419, "tsimshian", 418 to, "Tonga (Tonga Islands)", 418, "tongan (les Tonga)", 415 man, "Mandingo", 261, "mandingue", 257 lin, "Lingala", 237, "lingala", 234 ar, "Arabic", 17, "arabe", 22 bos, "Bosnian", 57, "bosniaque", 65 wln, "Walloon", 444, "wallon", 437 vi, "Vietnamese", 439, "vietnamien", 432 mao, "Maori", 265, "maori", 262 kua, "Kwanyama, Kuanyama", 225, "kwanyama; kuanyama", 225 rw, "Kinyarwanda", 211, "rwanda", 347 ipk, "Inupiaq", 183, "inupiaq", 183 as, "Assamese", 24, "assamais", 29 aym, "Aymara", 32, "aymara", 36 syr, "Syriac", 397, "syriaque", 391 shn, "Shan", 365, "chan", 80 goh, "German, Old High (ca.750-1050)", 145, "", 0 dan, "Danish", 97, "danois", 101 map, "Austronesian (Other)", 28, "malayo-polynsiennes, autres langues", 251 i-tay, "Tayal", 484, "Tayal", 475 tr, "Turkish", 424, "turc", 423 sla, "Slavic (Other)", 376, "slaves, autres langues", 374 ell, "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153 afr, "Afrikaans", 7, "afrikaans", 7 bua, "Buriat", 62, "bouriate", 66 ts, "Tsonga", 420, "tsonga", 419 pol, "Polish", 333, "polonais", 333 mar, "Marathi", 266, "marathe", 263 ga, "Irish", 185, "irlandais", 185 co, "Corsican", 89, "corse", 95 i-ami, "Amis", 473, "Amis", 464 tsn, "Tswana", 421, "tswana", 420 tt, "Tatar", 404, "tatar", 397 mas, "Masai", 270, "massa", 267 ita, "Italian", 189, "italien", 190 her, "Herero", 162, "herero", 162 fur, "Friulian", 132, "frioulan", 134 eng, "English", 114, "anglais", 18 cmc, "Chamic languages", 72, "chames, langues", 78 tso, "Tsonga", 420, "tsonga", 419 pon, "Pohnpeian", 332, "pohnpei", 332 lit, "Lithuanian", 238, "lituanien", 235 sgn-co, "Colombian Sign Language", 492, "Colombian Sign Language", 483 de-1901, "German traditional orthography", 464, "German traditional orthography", 455 xh, "Xhosa", 449, "xhosa", 441 vo, "Volapk", 440, "volapk", 433 gd, "Scottish Gaelic; Gaelic", 360, "galique cossais; galique", 138 za, "Zhuang; Chuang", 459, "zhuang; chuang", 450 ay, "Aymara", 32, "aymara", 36 sgn-gb, "British Sign Language", 497, "British Sign Language", 488 yor, "Yoruba", 454, "yoruba", 445 tw, "Twi", 429, "twi", 427 mga, "Irish, Middle (900-1200)", 186, "irlandais moyen (900-1200)", 187 el, "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153 gon, "Gondi", 149, "gond", 147 az, "Azerbaijani", 33, "azri", 37 cs, "Czech", 95, "tchque", 398 alb, "Albanian", 11, "albanais", 11 ukr, "Ukrainian", 432, "ukrainien", 428 tuk, "Turkmen", 426, "turkmne", 425 raj, "Rajasthani", 341, "rajasthani", 339 bug, "Buginese", 60, "bugi", 69 sgn-za, "South African Sign Language", 509, "South African Sign Language", 500 ty, "Tahitian", 399, "tahitien", 394 sna, "Shona", 366, "shona", 368 por, "Portuguese", 334, "portugais", 334 en, "English", 114, "anglais", 18 tum, "Tumbuka", 422, "tumbuka", 421 nno, "Nynorsk, Norwegian; Norwegian Nynorsk", 309, "nynorsk, norvgien; norvgien nynorsk", 304 may, "Malay", 256, "malais", 249 eo, "Esperanto", 117, "espranto", 120 enm, "English, Middle (1100-1500)", 115, "anglais moyen (1100-1500)", 19 cv, "Chuvash", 86, "tchouvache", 400 ale, "Aleut", 12, "aloute", 12 ven, "Venda", 438, "venda", 431 iro, "Iroquoian languages", 188, "iroquoises, langues (famille)", 188 gor, "Gorontalo", 150, "gorontalo", 148 slk, "Slovak", 377, "slovaque", 375 snd, "Sindhi", 370, "sindhi", 370 kum, "Kumyk", 221, "koumyk", 218 ice, "Icelandic", 172, "islandais", 189 hil, "Hiligaynon", 163, "hiligaynon", 163 gba, "Gbaya", 139, "gbaya", 144 alg, "Algonquian languages", 13, "algonquines, langues", 13 day, "Dayak", 98, "dayak", 102 cy, "Welsh", 447, "gallois", 141 twi, "Twi", 429, "twi", 427 tup, "Tupi languages", 423, "tupi, langues", 422 men, "Mende", 272, "mend", 269 id, "Indonesian", 180, "indonsien", 180 him, "Himachali", 164, "himachali", 164 got, "Gothic", 151, "gothique", 149 del, "Delaware", 99, "delaware", 103 zh, "Chinese", 80, "chinois", 86 bul, "Bulgarian", 61, "bulgare", 70 rap, "Rapanui", 342, "rapanui", 340 ie, "Interlingue", 181, "interlingue", 181 hin, "Hindi", 165, "hindi", 165 gl, "Gallegan", 136, "galicien", 139 elx, "Elamite", 113, "lamite", 117 es, "Spanish; Castilian", 389, "espagnol; castillan", 119 zh-yue, "Cantonese", 517, "Cantonese", 508 xho, "Xhosa", 449, "xhosa", 441 tur, "Turkish", 424, "turc", 423 den, "Slave (Athapascan)", 375, "esclave (athapascan)", 118 et, "Estonian", 118, "estonien", 121 vie, "Vietnamese", 439, "vietnamien", 432 tha, "Thai", 408, "tha", 405 slo, "Slovak", 377, "slovaque", 375 rar, "Rarotongan", 343, "rarotonga", 341 mic, "Micmac", 273, "micmac", 270 gn, "Guarani", 155, "guarani", 155 eu, "Basque", 44, "basque", 50 spa, "Spanish; Castilian", 389, "espagnol; castillan", 119 sgn-ie, "Irish Sign Language", 499, "Irish Sign Language", 490 sgn-es, "Spanish Sign Language", 495, "Spanish Sign Language", 486 kur, "Kurdish", 222, "kurde", 222 ka, "Georgian", 141, "gorgien", 145 tut, "Altaic (Other)", 14, "altaques, autres langues", 16 oji, "Ojibwa", 313, "ojibwa", 308 lol, "Mongo", 279, "mongo", 275 kha, "Khasi", 205, "khasi", 206 snk, "Soninke", 382, "sonink", 380 kut, "Kutenai", 224, "kutenai", 224 epo, "Esperanto", 117, "espranto", 120 ang, "English, Old (ca.450-1100)", 116, "anglo-saxon (ca.450-1100)", 20 bur, "Burmese", 63, "birman", 62 ik, "Inupiaq", 183, "inupiaq", 183 hit, "Hittite", 167, "hittite", 167 apa, "Apache languages", 16, "apache", 21 nah, "Nahuatl", 284, "nahuatl", 281 wak, "Wakashan languages", 442, "wakashennes, langues", 435 nai, "North American Indian (Other)", 299, "", 0 deu, "German", 142, "allemand", 14 sgn-gr, "Greek Sign Language", 498, "Greek Sign Language", 489 wal, "Walamo", 443, "walamo", 436 slv, "Slovenian", 378, "slovne", 376 gu, "Gujarati", 156, "goudjrati", 150 de-ch-1996, "German Swiss variant orthography of 1996", 469, "German Swiss variant orthography of 1996", 460 gv, "Manx", 264, "manx; mannois", 261 mkd, "Macedonian", 250, "macdonien", 244 io, "Ido", 173, "ido", 173 guj, "Gujarati", 156, "goudjrati", 150 cop, "Coptic", 87, "copte", 92 ki, "Kikuyu; Gikuyu", 209, "kikuyu", 210 zu, "Zulu", 460, "zoulou", 451 srd, "Sardinian", 357, "sarde", 361 kj, "Kwanyama, Kuanyama", 225, "kwanyama; kuanyama", 225 khi, "Khoisan (Other)", 207, "khoisan, autres langues", 208 jrb, "Judeo-Arabic", 192, "judo-arabe", 193 dzo, "Dzongkha", 109, "dzongkha", 112 dgr, "Dogrib", 103, "dogrib", 109 cor, "Cornish", 88, "cornique", 94 zh-min, "Min Fuzhou Hokkien Amoy or Taiwanese", 513, "Min Fuzhou Hokkien Amoy or Taiwanese", 504 min, "Minangkabau", 274, "minangkabau", 271 kk, "Kazakh", 204, "kazakh", 205 ara, "Arabic", 17, "arabe", 22 cos, "Corsican", 89, "corse", 95 mkh, "Mon-Khmer (Other)", 278, "mn-khmer, autres langues", 274 lua, "Luba-Lulua", 243, "luba-lulua", 238 kl, "Kalaallisut", 196, "groenlandais", 154 is, "Icelandic", 172, "islandais", 189 hmn, "Hmong", 168, "hmong", 168 war, "Waray", 445, "waray", 438 nap, "Neapolitan", 291, "napolitain", 282 lub, "Luba-Katanga", 242, "luba-katanga", 237 km, "Khmer", 206, "khmer", 207 it, "Italian", 189, "italien", 190 hmo, "Hiri Motu", 166, "hiri motu", 166 arc, "Aramaic", 18, "aramen", 23 din, "Dinka", 100, "dinka", 104 was, "Washo", 446, "washo", 439 sad, "Sandawe", 353, "sandawe", 357 mg, "Malagasy", 255, "malgache", 253 khm, "Khmer", 206, "khmer", 207 kn, "Kannada", 198, "kannada", 199 iu, "Inuktitut", 182, "inuktitut", 182 gwi, "Gwich'in", 157, "gwich'in", 157 de-de-1996, "German German variant orthography of 1996", 471, "German German variant orthography of 1996", 462 pus, "Pushto", 338, "pachto", 318 mh, "Marshallese", 268, "marshall", 265 ko, "Korean", 216, "coren", 93 jpn, "Japanese", 190, "japonais", 191 sgn-it, "Italian Sign Language", 500, "Italian Sign Language", 491 mis, "Miscellaneous languages", 275, "diverses, langues", 106 mi, "Maori", 265, "maori", 262 loz, "Lozi", 241, "lozi", 236 kho, "Khotanese", 208, "khotanais", 209 i-hak, "Hakka Deprecated use IETF zh-hakka registered Jan. 102000", 477, "Hakka Deprecated use IETF zh-hakka registered Jan. 102000", 468 tyv, "Tuvinian", 428, "touva", 416 sag, "Sango", 354, "sango", 358 oc, "Provenal; Occitan (post 1500)", 336, "provenal; occitan (aprs 1500)", 336 sah, "Yakut", 450, "iakoute", 171 bla, "Siksika", 369, "blackfoot", 63 nau, "Nauru", 285, "nauruan", 283 mk, "Macedonian", 250, "macdonien", 244 lug, "Ganda", 137, "ganda", 142 bho, "Bhojpuri", 51, "bhojpuri", 56 sai, "South American Indian (Other)", 386, "", 0 nav, "Navajo; Navaho", 287, "navaho", 284 ml, "Malayalam", 257, "malayalam", 250 ks, "Kashmiri", 202, "kashmiri", 203 jpr, "Judeo-Persian", 193, "judo-persan", 195 scc, "Serbian", 363, "serbe", 366 lui, "Luiseno", 244, "luiseno", 239 zh-min-nan, "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo", 514, "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo", 505 wel, "Welsh", 447, "gallois", 141 mn, "Mongolian", 280, "mongol", 276 ku, "Kurdish", 222, "kurde", 222 div, "Divehi", 101, "maldivien", 252 tli, "Tlingit", 414, "tlingit", 411 srp, "Serbian", 363, "serbe", 366 sal, "Salishan languages", 349, "salish, langues", 348 mo, "Moldavian", 277, "moldave", 273 kv, "Komi", 213, "komi", 214 no-nyn, "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000", 487, "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000", 478 wen, "Sorbian languages", 383, "sorabes, langues", 381 sam, "Samaritan Aramaic", 350, "samaritain", 349 phi, "Philippine (Other)", 330, "philippines, autres langues", 331 arm, "Armenian", 22, "armnien", 27 kw, "Cornish", 88, "cornique", 94 srr, "Serer", 364, "srre", 367 san, "Sanskrit", 355, "sanskrit", 359 fra, "French", 128, "franais", 131 arn, "Araucanian", 20, "araucan", 25 mr, "Marathi", 266, "marathe", 263 lun, "Lunda", 246, "lunda", 240 ky, "Kirghiz", 212, "kirghize", 212 ava, "Avaric", 29, "avar", 33 ath, "Athapascan languages", 26, "athapascanes, langues", 31 zh-guoyu, "Mandarin or Standard Chinese", 511, "Mandarin or Standard Chinese", 502 i-enochian, "Enochian", 476, "Enochian", 467 nia, "Nias", 294, "nias", 292 moh, "Mohawk", 276, "mohawk", 272 ms, "Malay", 256, "malais", 249 luo, "Luo (Kenya and Tanzania)", 247, "luo (Kenya et Tanzanie)", 241 ace, "Achinese", 2, "aceh", 2 arp, "Arapaho", 19, "arapaho", 24 om, "Oromo", 315, "galla", 140 nep, "Nepali", 292, "npalais", 290 mt, "Maltese", 258, "maltais", 254 vol, "Volapk", 440, "volapk", 433 phn, "Phoenician", 331, "phnicien", 330 nic, "Niger-Kordofanian (Other)", 295, "nigro-congolaises, autres langues", 293 fre, "French", 128, "franais", 131 sgn-ch-de, "Swiss German Sign Language", 491, "Swiss German Sign Language", 482 ota, "Turkish, Ottoman (1500-1928)", 425, "turc ottoman (1500-1928)", 424 sas, "Sasak", 358, "sasak", 362 sa, "Sanskrit", 355, "sanskrit", 359 que, "Quechua", 339, "quechua", 338 ach, "Acoli", 3, "acoli", 3 ave, "Avestan", 30, "avestique", 34 doi, "Dogri", 102, "dogri", 108 no-bok, "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000", 486, "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000", 477 sat, "Santali", 356, "santal", 360 ori, "Oriya", 314, "oriya", 309 nzi, "Nzima", 311, "nzema", 306 mol, "Moldavian", 277, "moldave", 273 lus, "Lushai", 248, "lushai", 242 art, "Artificial (Other)", 23, "artificielles, autres langues", 28 sc, "Sardinian", 357, "sarde", 361 gla, "Scottish Gaelic; Gaelic", 360, "galique cossais; galique", 138 sd, "Sindhi", 370, "sindhi", 370 sco, "Scots", 359, "cossais", 113 roa, "Romance (Other)", 344, "romanes, autres langues", 343 or, "Oriya", 314, "oriya", 309 mon, "Mongolian", 280, "mongol", 276 sga, "Irish, Old (to 900)", 187, "irlandais ancien (jusqu' 900)", 186 cus, "Cushitic (Other)", 94, "couchitiques, autres langues", 96 my, "Burmese", 63, "birman", 62 aar, "Afar", 5, "afar", 5 cha, "Chamorro", 73, "chamorro", 79 os, "Ossetic; Ossetian", 318, "osste", 312 se, "Northern Sami", 300, "sami du Nord", 353 msa, "Malay", 256, "malais", 249 chb, "Chibcha", 78, "chibcha", 84 arw, "Arawak", 21, "arawak", 26 ba, "Bashkir", 43, "bachkir", 39 sgn-mx, "Mexican Sign Language", 502, "Mexican Sign Language", 493 i-klingon, "Klingon", 478, "Klingon", 469 zul, "Zulu", 460, "zoulou", 451 orm, "Oromo", 315, "galla", 140 new, "Newari", 293, "newari", 291 kpe, "Kpelle", 218, "kpell", 219 jav, "Javanese", 191, "javanais", 192 de-ch-1901, "German Swiss variant traditional orthography", 468, "German Swiss variant traditional orthography", 459 sg, "Sango", 354, "sango", 358 gle, "Irish", 185, "irlandais", 185 eka, "Ekajuk", 112, "ekajuk", 116 scr, "Croatian", 93, "croate", 99 sgn-se, "Swedish Sign Language", 507, "Swedish Sign Language", 498 zun, "Zuni", 461, "Zuni", 452 vot, "Votic", 441, "vote", 434 tpi, "Tok Pisin", 415, "tok pisin", 412 sel, "Selkup", 361, "selkoupe", 364 frm, "French, Middle (ca.1400-1600)", 129, "franais moyen (1400-1600)", 133 che, "Chechen", 74, "tchtchne", 399 si, "Sinhalese", 371, "singhalais", 371 sem, "Semitic (Other)", 362, "smitiques, autres langues", 365 pli, "Pali", 322, "pali", 321 mos, "Mossi", 281, "mor", 277 glg, "Gallegan", 136, "galicien", 139 be, "Belarusian", 47, "bilorusse", 58 fro, "French, Old (842-ca.1400)", 130, "franais ancien (842-ca.1400)", 132 chg, "Chagatai", 71, "djaghata", 107 sk, "Slovak", 377, "slovaque", 375 roh, "Raeto-Romance", 340, "rhto-roman", 342 bra, "Braj", 58, "braj", 67 bg, "Bulgarian", 61, "bulgare", 70 cym, "Welsh", 447, "gallois", 141 sl, "Slovenian", 378, "slovne", 376 iku, "Inuktitut", 182, "inuktitut", 182 hun, "Hungarian", 169, "hongrois", 169 bh, "Bihari", 52, "bihari", 59 chi, "Chinese", 80, "chinois", 86 da, "Danish", 97, "danois", 101 sm, "Samoan", 352, "samoan", 356 oci, "Provenal; Occitan (post 1500)", 336, "provenal; occitan (aprs 1500)", 336 kaa, "Kara-Kalpak", 200, "karakalpak", 201 fan, "Fang", 121, "fang", 124 bi, "Bislama", 55, "bichlamar", 57 zha, "Zhuang; Chuang", 459, "zhuang; chuang", 450 de-de-1901, "German German variant traditional orthography", 470, "German German variant traditional orthography", 461 ug, "Uighur", 431, "ougour", 315 sid, "Sidamo", 367, "sidamo", 369 sn, "Shona", 366, "shona", 368 qu, "Quechua", 339, "quechua", 338 kab, "Kabyle", 194, "kabyle", 196 hup, "Hupa", 170, "hupa", 170 fao, "Faroese", 123, "froen", 126 dua, "Duala", 105, "douala", 110 chk, "Chuukese", 85, "chuuk", 91 wa, "Walloon", 444, "wallon", 437 so, "Somali", 380, "somali", 378 oto, "Otomian languages", 319, "otomangue, langues", 313 kac, "Kachin", 195, "kachin", 197 aze, "Azerbaijani", 33, "azri", 37 bre, "Breton", 59, "breton", 68 rom, "Romany", 346, "tsigane", 417 chm, "Mari", 267, "mari", 264 de, "German", 142, "allemand", 14 bnt, "Bantu (Other)", 41, "bantoues, autres langues", 46 i-tsu, "Tsou", 485, "Tsou", 476 sgn, "Sign languages", 368, "langues des signes", 228 ron, "Romanian", 345, "roumain", 344 egy, "Egyptian (Ancient)", 111, "gyptien", 115 sq, "Albanian", 11, "albanais", 11 chn, "Chinook jargon", 81, "chinook, jargon", 87 hye, "Armenian", 22, "armnien", 27 zh-hakka, "Hakka", 512, "Hakka", 503 uk, "Ukrainian", 432, "ukrainien", 428 tah, "Tahitian", 399, "tahitien", 394 sr, "Serbian", 363, "serbe", 366 fas, "Persian", 328, "persan", 327 niu, "Niuean", 297, "niu", 295 bad, "Banda", 40, "banda", 45 cho, "Choctaw", 83, "choctaw", 89 bn, "Bengali", 49, "bengali", 54 sgn-de, "German Sign Language", 493, "German Sign Language", 484 bo, "Tibetan", 409, "tibtain", 407 tai, "Tai (Other)", 400, "thaes, autres langues", 406 ss, "Swati", 395, "swati", 390 fa, "Persian", 328, "persan", 327 fat, "Fanti", 122, "fanti", 125 chp, "Chipewyan", 82, "chipewyan", 88 st, "Sotho, Southern", 385, "sotho du Sud", 383 fry, "Frisian", 131, "frison", 135 nob, "Norwegian Bokml; Bokml, Norwegian", 303, "norvgien bokml; bokml, norvgien", 298 su, "Sundanese", 392, "soundanais", 384 chr, "Cherokee", 75, "cherokee", 81 sv, "Swedish", 396, "sudois", 386 pra, "Prakrit languages", 335, "prkrit", 335 br, "Breton", 59, "breton", 68 aka, "Akan", 9, "akan", 9 i-default, "Default Language Context", 475, "Default Language Context", 466 ypk, "Yupik languages", 455, "yupik, langues", 446 tam, "Tamil", 403, "tamoul", 396 sw, "Swahili", 394, "swahili", 389 mul, "Multiple languages", 282, "multilingue", 279 kro, "Kru", 219, "krou", 220 bs, "Bosnian", 57, "bosniaque", 65 bai, "Bamileke languages", 39, "bamilks, langues", 44 und, "Undetermined", 434, "indtermine", 177 sin, "Sinhalese", 371, "singhalais", 371 glv, "Manx", 264, "manx; mannois", 261 kal, "Kalaallisut", 196, "groenlandais", 154 iba, "Iban", 171, "iban", 172 sgn-dk, "Danish Sign Language", 494, "Danish Sign Language", 485 sgn-br, "Brazilian Sign Language", 490, "Brazilian Sign Language", 481 ur, "Urdu", 435, "ourdou", 316 sma, "Southern Sami", 387, "sami du Sud", 354 sio, "Siouan languages", 373, "sioux, langues", 373 mun, "Munda languages", 283, "mounda, langues", 278 kam, "Kamba", 197, "kamba", 198 grb, "Grebo", 152, "grebo", 151 bak, "Bashkir", 43, "bachkir", 39 chv, "Chuvash", 86, "tchouvache", 400 paa, "Papuan (Other)", 327, "papoues, autres langues", 325 kan, "Kannada", 198, "kannada", 199 ha, "Hausa", 159, "haoussa", 159 grc, "Greek, Ancient (to 1453)", 153, "grec ancien (jusqu' 1453)", 152 dum, "Dutch, Middle (ca. 1050-1350)", 107, "nerlandais moyen (ca. 1050-1350)", 289 mya, "Burmese", 63, "birman", 62 bal, "Baluchi", 37, "baloutchi", 41 fi, "Finnish", 125, "finnois", 129 bam, "Bambara", 38, "bambara", 43 zho, "Chinese", 80, "chinois", 86 wol, "Wolof", 448, "wolof", 440 gre, "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153 gaa, "Ga", 134, "ga", 136 fj, "Fijian", 124, "fidjien", 127 btk, "Batak (Indonesia)", 45, "batak (Indonsie)", 51 ban, "Balinese", 35, "balinais", 40 chy, "Cheyenne", 77, "cheyenne", 83 sgn-us, "American Sign Language", 508, "American Sign Language", 499 wo, "Wolof", 448, "wolof", 440 sme, "Northern Sami", 300, "sami du Nord", 353 kru, "Kurukh", 223, "kurukh", 223 yi, "Yiddish", 453, "yiddish", 444 tat, "Tatar", 404, "tatar", 397 sit, "Sino-Tibetan (Other)", 372, "sino-tibtaines, autres langues", 372 kar, "Karen", 201, "karen", 202 he, "Hebrew", 161, "hbreu", 161 mus, "Creek", 91, "muskogee", 280 kas, "Kashmiri", 202, "kashmiri", 203 isl, "Icelandic", 172, "islandais", 189 baq, "Basque", 44, "basque", 50 tvl, "Tuvalu", 427, "tuvalu", 426 pag, "Pangasinan", 324, "pangasinan", 323 non, "Norse, Old", 298, "norrois, vieux", 296 kat, "Georgian", 141, "gorgien", 145 akk, "Akkadian", 10, "akkadien", 10 i-mingo, "Mingo", 480, "Mingo", 471 en-scouse, "English Liverpudlian dialect known as 'Scouse'", 472, "English Liverpudlian dialect known as 'Scouse'", 463 uz, "Uzbek", 436, "ouszbek", 317 smi, "Sami languages (Other)", 351, "sami, autres langues", 350 mdr, "Mandar", 260, "mandar", 256 kau, "Kanuri", 199, "kanouri", 200 ja, "Japanese", 190, "japonais", 191 fo, "Faroese", 123, "froen", 126 dut, "Dutch", 106, "nerlandais", 288 bas, "Basa", 42, "basa", 49 smj, "Lule Sami", 245, "sami de Lule", 351 hi, "Hindi", 165, "hindi", 165 bat, "Baltic (Other)", 36, "baltiques, autres langues", 42 kaw, "Kawi", 203, "kawi", 204 yo, "Yoruba", 454, "yoruba", 445 tel, "Telugu", 405, "tlougou", 401 pro, "Provenal, Old (to 1500)", 337, "provenal ancien (jusqu' 1500)", 337 nor, "Norwegian", 302, "norvgien", 297 mwr, "Marwari", 269, "marvari", 266 fr, "French", 128, "franais", 131 amh, "Amharic", 15, "amharique", 17 znd, "Zande", 456, "zand", 447 tem, "Timne", 412, "temne", 402 rum, "Romanian", 345, "roumain", 344 pal, "Pahlavi", 320, "pahlavi", 319 grn, "Guarani", 155, "guarani", 155 fij, "Fijian", 124, "fidjien", 127 dz, "Dzongkha", 109, "dzongkha", 112 yao, "Yao", 451, "yao", 442 urd, "Urdu", 435, "ourdou", 316 sog, "Sogdian", 379, "sogdien", 377 run, "Rundi", 347, "rundi", 345 pam, "Pampanga", 323, "pampangan", 322 kaz, "Kazakh", 204, "kazakh", 205 smn, "Inari Sami", 177, "sami d'Inari", 352 ibo, "Igbo", 174, "igbo", 174 bej, "Beja", 46, "bedja", 52 sgn-fr, "French Sign Language", 496, "French Sign Language", 487 i-pwn, "Paiwan", 482, "Paiwan", 473 yap, "Yapese", 452, "yapois", 443 smo, "Samoan", 352, "samoan", 356 pan, "Panjabi", 325, "pendjabi", 326 myn, "Mayan languages", 271, "maya, langues", 268 tib, "Tibetan", 409, "tibtain", 407 la, "Latin", 230, "latin", 230 ho, "Hiri Motu", 166, "hiri motu", 166 bel, "Belarusian", 47, "bilorusse", 58 zh-gan, "Kan or Gan", 510, "Kan or Gan", 501 pap, "Papiamento", 326, "papiamento", 324 nub, "Nubian languages", 305, "nubiennes, langues", 300 lb, "Luxembourgish; Letzeburgesch", 249, "luxembourgeois", 243 fin, "Finnish", 125, "finnois", 129 bem, "Bemba", 48, "bemba", 53 art-lojban, "Lojban", 462, "Lojban", 453 ter, "Tereno", 406, "tereno", 403 tgk, "Tajik", 401, "tadjik", 392 ben, "Bengali", 49, "bengali", 54 tgl, "Tagalog", 398, "tagalog", 393 sms, "Skolt Sami", 374, "sami skolt", 355 rus, "Russian", 348, "russe", 346 fy, "Frisian", 131, "frison", 135 hr, "Croatian", 93, "croate", 99 cre, "Cree", 90, "cree", 97 tet, "Tetum", 407, "tetum", 404 som, "Somali", 380, "somali", 378 lad, "Ladino", 226, "judo-espagnol", 194 tig, "Tigre", 410, "tigr", 408 son, "Songhai", 381, "songhai", 379 ido, "Ido", 173, "ido", 173 pau, "Palauan", 321, "palau", 320 ssa, "Nilo-Saharan (Other)", 296, "nilo-sahariennes, autres langues", 294 hu, "Hungarian", 169, "hongrois", 169 ber, "Berber (Other)", 50, "berbres, autres langues", 55 cad, "Caddo", 64, "caddo", 71 nso, "Sotho, Northern", 384, "sotho du Nord", 382 na, "Nauru", 285, "nauruan", 283 sqi, "Albanian", 11, "albanais", 11 de-at-1996, "German Austrian variant orthography of 1996", 467, "German Austrian variant orthography of 1996", 458 nbl, "South Ndebele", 388, "ndbl du Sud", 286 nde, "North Ndebele", 301, "ndbl du Nord", 285 li, "Limburgish; Limburger; Limburgan", 236, "limbourgeois", 233 lah, "Lahnda", 227, "lahnda", 226 fiu, "Finno-Ugrian (Other)", 126, "finno-ougriennes, autres langues", 128 dyu, "Dyula", 108, "dioula", 105 nb, "Norwegian Bokml; Bokml, Norwegian", 303, "norvgien bokml; bokml, norvgien", 298 nd, "North Ndebele", 301, "ndbl du Nord", 285 mlg, "Malagasy", 255, "malgache", 253 bih, "Bihari", 52, "bihari", 59 hy, "Armenian", 22, "armnien", 27 sgn-jp, "Japanese Sign Language", 501, "Japanese Sign Language", 492 sot, "Sotho, Southern", 385, "sotho du Sud", 383 ne, "Nepali", 292, "npalais", 290 hz, "Herero", 162, "herero", 162 kik, "Kikuyu; Gikuyu", 209, "kikuyu", 210 gay, "Gayo", 138, "gayo", 143 ng, "Ndonga", 290, "ndonga", 287 mnc, "Manchu", 259, "mandchou", 255 ln, "Lingala", 237, "lingala", 234 lam, "Lamba", 228, "lamba", 227 ewe, "Ewe", 119, "w", 122 bik, "Bikol", 53, "bikol", 60 peo, "Persian, Old (ca.600-400 B.C.)", 329, "perse, vieux (ca. 600-400 av. J.-C.)", 328 pa, "Panjabi", 325, "pendjabi", 326 lo, "Lao", 229, "lao", 229 kin, "Kinyarwanda", 211, "rwanda", 347 jv, "Javanese", 191, "javanais", 192 gem, "Germanic (Other)", 146, "germaniques, autres langues", 146 est, "Estonian", 118, "estonien", 121 crp, "Creoles and pidgins (Other)", 92, "croles et pidgins divers", 98 nya, "Nyanja; Chichewa; Chewa", 307, "nyanja; chichewa; chewa", 302 yid, "Yiddish", 453, "yiddish", 444 lao, "Lao", 229, "lao", 229 sgn-be-fr, "Belgian-French Sign Language", 488, "Belgian-French Sign Language", 479 tir, "Tigrinya", 411, "tigrigna", 409 kmb, "Kimbundu", 210, "kimbundu", 211 geo, "Georgian", 141, "gorgien", 145 bin, "Bini", 54, "bini", 61 i-lux, "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998", 479, "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998", 470 tkl, "Tokelau", 416, "tokelau", 413 per, "Persian", 328, "persan", 327 zh-wuu, "Shanghaiese or Wu", 515, "Shanghaiese or Wu", 506 sgn-ni, "Nicaraguan Sign Language", 503, "Nicaraguan Sign Language", 494 ndo, "Ndonga", 290, "ndonga", 287 kir, "Kirghiz", 212, "kirghize", 212 nl, "Dutch", 106, "nerlandais", 288 ceb, "Cebuano", 69, "cebuano", 76 mni, "Manipuri", 262, "manipuri", 258 lt, "Lithuanian", 238, "lituanien", 235 ger, "German", 142, "allemand", 14 i-bnn, "Bunun", 474, "Bunun", 465 uga, "Ugaritic", 430, "ougaritique", 314 tiv, "Tiv", 413, "tiv", 410 tmh, "Tamashek", 402, "tamacheq", 395 swa, "Swahili", 394, "swahili", 389 nn, "Nynorsk, Norwegian; Norwegian Nynorsk", 309, "nynorsk, norvgien; norvgien nynorsk", 304 lat, "Latin", 230, "latin", 230 eus, "Basque", 44, "basque", 50 car, "Carib", 65, "caribe", 72 sgn-nl, "Dutch Sign Language", 504, "Dutch Sign Language", 495 osa, "Osage", 316, "osage", 310 no, "Norwegian", 302, "norvgien", 297 lv, "Latvian", 231, "letton", 231 efi, "Efik", 110, "efik", 114 bis, "Bislama", 55, "bichlamar", 57 ada, "Adangme", 4, "adangme", 4 de-1996, "German orthography of 1996", 465, "German orthography of 1996", 456 pi, "Pali", 322, "pali", 321 lav, "Latvian", 231, "letton", 231 nds, "Low Saxon; Low German; Saxon, Low; German, Low", 240, "saxon, bas; allemand, bas; bas saxon; bas allemand", 363 fon, "Fon", 127, "fon", 130 asm, "Assamese", 24, "assamais", 29 cat, "Catalan", 67, "catalan", 74 suk, "Sukuma", 390, "sukuma", 387 mlt, "Maltese", 258, "maltais", 254 ile, "Interlingue", 181, "interlingue", 181 ewo, "Ewondo", 120, "wondo", 123 cau, "Caucasian (Other)", 68, "caucasiennes, autres langues", 75 sgn-no, "Norwegian Sign Language", 505, "Norwegian Sign Language", 496 uzb, "Uzbek", 436, "ouszbek", 317 swe, "Swedish", 396, "sudois", 386 nr, "South Ndebele", 388, "ndbl du Sud", 286 hai, "Haida", 158, "haida", 158 awa, "Awadhi", 31, "awadhi", 35 abk, "Abkhazian", 1, "abkhaze", 1 pl, "Polish", 333, "polonais", 333 mno, "Manobo languages", 263, "manobo, langues", 260 aa, "Afar", 5, "afar", 5 tog, "Tonga (Nyasa)", 417, "tonga (Nyasa)", 414 sun, "Sundanese", 392, "soundanais", 384 nym, "Nyamwezi", 306, "nyamwezi", 301 ijo, "Ijo", 175, "ijo", 175 ab, "Abkhazian", 1, "abkhaze", 1 zap, "Zapotec", 457, "zapotque", 448 bod, "Tibetan", 409, "tibtain", 407 nyn, "Nyankole", 308, "nyankol", 303 gil, "Gilbertese", 148, "kiribati", 213 gez, "Geez", 140, "guze", 156 dra, "Dravidian (Other)", 104, "dravidiennes, autres langues", 111 ta, "Tamil", 403, "tamoul", 396 ssw, "Swati", 395, "swati", 390 nyo, "Nyoro", 310, "nyoro", 305 nv, "Navajo; Navaho", 287, "navaho", 284 inc, "Indic (Other)", 178, "indo-aryennes, autres langues", 178 afa, "Afro-Asiatic (Other)", 8, "afro-asiatiques, autres langues", 8 cel, "Celtic (Other)", 70, "celtiques, autres langues", 77 ltz, "Luxembourgish; Letzeburgesch", 249, "luxembourgeois", 243 ind, "Indonesian", 180, "indonsien", 180 ae, "Avestan", 30, "avestique", 34 ast, "Bable; Asturian", 34, "bable; asturien", 38 ine, "Indo-European (Other)", 179, "indo-europennes, autres langues", 179 af, "Afrikaans", 7, "afrikaans", 7 sus, "Susu", 393, "soussou", 385 mac, "Macedonian", 250, "macdonien", 244 heb, "Hebrew", 161, "hbreu", 161 ny, "Nyanja; Chichewa; Chewa", 307, "nyanja; chichewa; chewa", 302 cze, "Czech", 95, "tchque", 398 te, "Telugu", 405, "tlougou", 401 ps, "Pushto", 338, "pachto", 318 mad, "Madurese", 251, "madourais", 245 kok, "Konkani", 215, "konkani", 216 ca, "Catalan", 67, "catalan", 74 %% gperf-3.2.1/tests/ada-res.exp0000664000000000000000000000214213074402054011443 in word set else in word set exit in word set terminate in word set type in word set raise in word set range in word set reverse in word set declare in word set end in word set record in word set exception in word set not in word set then in word set return in word set separate in word set select in word set digits in word set renames in word set subtype in word set elsif in word set function in word set for in word set package in word set procedure in word set private in word set while in word set when in word set new in word set entry in word set delay in word set case in word set constant in word set at in word set abort in word set accept in word set and in word set delta in word set access in word set abs in word set pragma in word set array in word set use in word set out in word set do in word set others in word set of in word set or in word set all in word set limited in word set loop in word set null in word set task in word set in in word set is in word set if in word set rem in word set mod in word set begin in word set body in word set xor in word set goto in word set generic in word set with gperf-3.2.1/tests/smtp.gperf0000664000000000000000000000753714775447775011472 %{ /* gperf --struct-type --readonly-table --enum --global -K field_name -N header_entry --ignore-case */ /* Contributed by Bruce Lilly derived from http://users.erols.com/blilly/mailparse/fields.gperf */ #include %} struct header_state { const char *field_name; }; %% Accept-Language Action Alternate-Recipient Approved Archive Arrival-Date Autoforwarded Autosubmitted Bcc Cc Comments Complaints-To Content-alternative Content-Base Content-Description Content-Disposition Content-Duration Content-Features Content-ID Content-Language Content-Location Content-MD5 Content-Transfer-Encoding Content-Type Control Conversion Conversion-With-Loss DL-Expansion-History DSN-Gateway Date Deferred-Delivery Delivery-Date Diagnostic-Code Discarded-X400-IPMS-Extensions Discarded-X400-MTS-Extensions Disclose-Recipients Disposition Disposition-Notification-Options Disposition-Notification-To Distribution Encrypted Error Expires Failure Final-Log-ID Final-Recipient Followup-To From Generate-Delivery-Report Importance In-Reply-To Incomplete-Copy Injector-Info Keywords Last-Attempt-Date Latest-Delivery-Time Lines List-Archive List-Help List-ID List-Post List-Owner List-Subscribe List-Unsubscribe MDN-Gateway Media-Accept-Features MIME-Version Mail-Copies-To Message-ID Message-Type Newsgroups Organization Original-Encoded-Information-Types Original-Envelope-ID Original-Message-ID Original-Recipient Originator-Return-Address Path Posted-And-Mailed Prevent-Nondelivery-Report Priority Received Received-content-MIC Received-From-MTA References Remote-MTA Reply-By Reply-To Reporting-MTA Reporting-UA Return-Path Sender Sensitivity Status Subject Summary Supersedes To User-Agent Warning Will-Retry-Until X400-Content-Identifier X400-Content-Return X400-Content-Type X400-MTS-Identifier X400-Originator X400-Received X400-Recipients Xref %% #include #include #include static int my_case_strcmp (const char *s1, const char *s2) { for (;;) { unsigned char c1 = *s1++; unsigned char c2 = *s2++; if (c1 >= 'A' && c1 <= 'Z') c1 += 'a' - 'A'; if (c2 >= 'A' && c2 <= 'Z') c2 += 'a' - 'A'; if (c1 != 0 && c1 == c2) continue; return (int)c1 - (int)c2; } } int main (int argc, char *argv[]) { int i, j, k, n, exitcode; size_t len; const struct header_state *hs; n = 1; if (argc > 1) n = atoi (argv[1]); if (n < 1) n = 1; exitcode = 0; for (i = 0; i < n; i++) { for (j = 0; j <= MAX_HASH_VALUE; j++) { const char *s = wordlist[j].field_name; len = strlen (s); if (len) { hs = header_entry (s, len); if (!(hs && strcmp (hs->field_name, s) == 0)) { fprintf (stderr, "%s != %s\n", s, hs ? hs->field_name : "(null)"); exitcode = 1; } } } for (j = 0; j <= MAX_HASH_VALUE; j++) { char s[MAX_WORD_LENGTH+1]; /* expensive copy with case conversion (for testing) */ strcpy (s, wordlist[j].field_name); len = strlen (s); if (len) { for (k = 0; k < len; k++) if (isupper ((unsigned char) s[k])) s[k] = tolower ((unsigned char) s[k]); else if (islower ((unsigned char) s[k])) s[k] = toupper ((unsigned char) s[k]); hs = header_entry (s, len); if (!(hs && my_case_strcmp (hs->field_name, s) == 0)) { fprintf (stderr, "%s != %s\n", s, hs ? hs->field_name : "(null)"); exitcode = 1; } } } hs = header_entry ("Dave", 4); if (hs) { fprintf (stderr, "Dave == %s\n", hs->field_name); exitcode = 1; } } return exitcode; } gperf-3.2.1/tests/modula.exp0000664000000000000000000000353013074402054011412 in word set AND in word set ARRAY in word set BEGIN in word set BITS in word set BY in word set CASE in word set CONST in word set DIV in word set DO in word set ELSE in word set ELSIF in word set END in word set EVAL in word set EXCEPT in word set EXCEPTION in word set EXIT in word set EXPORTS in word set FINALLY in word set FOR in word set FROM in word set IF in word set IMPORT in word set INTERFACE in word set IN in word set INLINE in word set LOCK in word set METHODS in word set MOD in word set MODULE in word set NOT in word set OBJECT in word set OF in word set OR in word set PROCEDURE in word set RAISES in word set READONLY in word set RECORD in word set REF in word set REPEAT in word set RETURN in word set SET in word set THEN in word set TO in word set TRY in word set TYPE in word set TYPECASE in word set UNSAFE in word set UNTIL in word set UNTRACED in word set VALUE in word set VAR in word set WHILE in word set WITH in word set and in word set array in word set begin in word set bits in word set by in word set case in word set const in word set div in word set do in word set else in word set elsif in word set end in word set eval in word set except in word set exception in word set exit in word set exports in word set finally in word set for in word set from in word set if in word set import in word set interface in word set in in word set inline in word set lock in word set methods in word set mod in word set module in word set not in word set object in word set of in word set or in word set procedure in word set raises in word set readonly in word set record in word set ref in word set repeat in word set return in word set set in word set then in word set to in word set try in word set type in word set typecase in word set unsafe in word set until in word set untraced in word set value in word set var in word set while in word set with gperf-3.2.1/tests/configure.ac0000664000000000000000000000300014630031131011662 dnl autoconf configuration for gperf/tests dnl Copyright (C) 1998-2024 Free Software Foundation, Inc. dnl Written by Douglas C. Schmidt dnl and Bruno Haible . dnl dnl This file is part of GNU GPERF. dnl dnl This program is free software: you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 3 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program. If not, see . AC_PREREQ([2.64]) AC_INIT AC_CONFIG_SRCDIR([c-parse.gperf]) AC_CONFIG_AUX_DIR([../build-aux]) AC_PROG_MAKE_SET dnl dnl checks for programs dnl AC_PROG_CC dnl sets variable CC AC_PROG_CPP dnl sets variable CPP AC_PROG_CXX dnl sets variable CXX AC_PROG_CXXCPP dnl sets variable CXXCPP if test $ac_cv_c_compiler_gnu = yes && test $ac_cv_cxx_compiler_gnu = yes; then CHECK_LANG_SYNTAX='check-lang-syntax' else CHECK_LANG_SYNTAX='' fi AC_SUBST([CHECK_LANG_SYNTAX]) dnl dnl That's it. dnl AC_CONFIG_FILES([Makefile]) AC_OUTPUT gperf-3.2.1/tests/pascal.exp0000664000000000000000000000115413074402054011374 in word set with in word set array in word set and in word set function in word set case in word set var in word set const in word set until in word set then in word set set in word set record in word set program in word set procedure in word set or in word set packed in word set not in word set nil in word set label in word set in in word set repeat in word set of in word set goto in word set forward in word set for in word set while in word set file in word set else in word set downto in word set do in word set div in word set to in word set type in word set end in word set mod in word set begin in word set if gperf-3.2.1/tests/c.exp0000664000000000000000000000110613074402054010350 in word set if in word set do in word set int in word set for in word set case in word set char in word set auto in word set goto in word set else in word set long in word set void in word set enum in word set float in word set short in word set union in word set break in word set while in word set const in word set double in word set static in word set extern in word set struct in word set return in word set sizeof in word set switch in word set signed in word set typedef in word set default in word set unsigned in word set continue in word set register in word set volatile gperf-3.2.1/tests/objc.gperf0000664000000000000000000000315713074402054011362 %{ /* Command-line: gperf -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ objc.gperf */ %} struct resword { char *name; short token; enum rid rid; }; %% @defs, DEFS, NORID @encode, ENCODE, NORID @end, END, NORID @implementation, IMPLEMENTATION, NORID @interface, INTERFACE, NORID @public, PUBLIC, NORID @selector, SELECTOR, NORID __alignof, ALIGNOF, NORID __alignof__, ALIGNOF, NORID __asm, ASM, NORID __asm__, ASM, NORID __attribute, ATTRIBUTE, NORID __attribute__, ATTRIBUTE, NORID __const, TYPE_QUAL, RID_CONST __const__, TYPE_QUAL, RID_CONST __extension__, EXTENSION, NORID __inline, SCSPEC, RID_INLINE __inline__, SCSPEC, RID_INLINE __signed, TYPESPEC, RID_SIGNED __signed__, TYPESPEC, RID_SIGNED __typeof, TYPEOF, NORID __typeof__, TYPEOF, NORID __volatile, TYPE_QUAL, RID_VOLATILE __volatile__, TYPE_QUAL, RID_VOLATILE asm, ASM, NORID auto, SCSPEC, RID_AUTO break, BREAK, NORID case, CASE, NORID char, TYPESPEC, RID_CHAR const, TYPE_QUAL, RID_CONST continue, CONTINUE, NORID default, DEFAULT, NORID do, DO, NORID double, TYPESPEC, RID_DOUBLE else, ELSE, NORID enum, ENUM, NORID extern, SCSPEC, RID_EXTERN float, TYPESPEC, RID_FLOAT for, FOR, NORID goto, GOTO, NORID if, IF, NORID inline, SCSPEC, RID_INLINE int, TYPESPEC, RID_INT long, TYPESPEC, RID_LONG register, SCSPEC, RID_REGISTER return, RETURN, NORID short, TYPESPEC, RID_SHORT signed, TYPESPEC, RID_SIGNED sizeof, SIZEOF, NORID static, SCSPEC, RID_STATIC struct, STRUCT, NORID switch, SWITCH, NORID typedef, SCSPEC, RID_TYPEDEF typeof, TYPEOF, NORID union, UNION, NORID unsigned, TYPESPEC, RID_UNSIGNED void, TYPESPEC, RID_VOID volatile, TYPE_QUAL, RID_VOLATILE while, WHILE, NORID gperf-3.2.1/tests/languages.exp0000664000000000000000000017610314776761030012122 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -C -E -G -I -t */ /* Computed positions: -k'1-3,5,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* gperf -CDEGTlot -H language_hash -K code -L ANSI-C -N language_entry */ /* Generated from ISO 639 language data from http://lcweb.loc.gov/standards/iso639-2/langhome.html and from IANA registry at https://www.iana.org/assignments/language-tags by %M% */ /* englangn.html Updated: August 14, 2002 */ /* frenchlangn.html Updated: August 14, 2002 */ /* language-tags last updated 2001-07-17 */ struct language { const char *code; const char *name_en; int num_en; const char *name_fr; int num_fr; }; #include enum { TOTAL_KEYWORDS = 685, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 11, MIN_HASH_VALUE = 28, MAX_HASH_VALUE = 3860 }; /* maximum key range = 3833, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static const unsigned short asso_values[] = { 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 115, 3861, 3861, 3861, 25, 3861, 3861, 3861, 3861, 55, 3861, 3861, 3861, 0, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 180, 520, 1021, 77, 1006, 757, 660, 146, 950, 155, 25, 220, 20, 5, 775, 745, 331, 60, 0, 85, 895, 351, 447, 965, 866, 585, 87, 877, 480, 670, 1015, 100, 3861, 261, 60, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861, 3861 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[4]+1]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 4: case 3: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+9]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static const struct language wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nds", "Low Saxon; Low German; Saxon, Low; German, Low", 240, "saxon, bas; allemand, bas; bas saxon; bas allemand", 363}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"men", "Mende", 272, "mend", 269}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sem", "Semitic (Other)", 362, "smitiques, autres langues", 365}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sin", "Sinhalese", 371, "singhalais", 371}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mis", "Miscellaneous languages", 275, "diverses, langues", 106}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"min", "Minangkabau", 274, "minangkabau", 271}, {""}, {"den", "Slave (Athapascan)", 375, "esclave (athapascan)", 118}, {""}, {""}, {"kin", "Kinyarwanda", 211, "rwanda", 347}, {"sd", "Sindhi", 370, "sindhi", 370}, {""}, {""}, {""}, {""}, {"nd", "North Ndebele", 301, "ndbl du Nord", 285}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sk", "Slovak", 377, "slovaque", 375}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mk", "Macedonian", 250, "macdonien", 244}, {"tem", "Timne", 412, "temne", 402}, {""}, {""}, {""}, {"kk", "Kazakh", 204, "kazakh", 205}, {"kik", "Kikuyu; Gikuyu", 209, "kikuyu", 210}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sr", "Serbian", 363, "serbe", 366}, {"din", "Dinka", 100, "dinka", 104}, {""}, {""}, {""}, {"nr", "South Ndebele", 388, "ndbl du Sud", 286}, {""}, {""}, {""}, {"sas", "Sasak", 358, "sasak", 362}, {""}, {""}, {""}, {""}, {"mdr", "Mandar", 260, "mandar", 256}, {""}, {""}, {""}, {""}, {"san", "Sanskrit", 355, "sanskrit", 359}, {"mr", "Marathi", 266, "marathe", 263}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mas", "Masai", 270, "massa", 267}, {""}, {""}, {""}, {"kj", "Kwanyama, Kuanyama", 225, "kwanyama; kuanyama", 225}, {"kas", "Kashmiri", 202, "kashmiri", 203}, {""}, {""}, {""}, {""}, {"man", "Mandingo", 261, "mandingue", 257}, {""}, {""}, {""}, {""}, {"kan", "Kannada", 198, "kannada", 199}, {""}, {""}, {""}, {"tk", "Turkmen", 426, "turkmne", 425}, {"sam", "Samaritan Aramaic", 350, "samaritain", 349}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kir", "Kirghiz", 212, "kirghize", 212}, {""}, {"srr", "Serer", 364, "srre", 367}, {""}, {""}, {"ter", "Tereno", 406, "tereno", 403}, {""}, {""}, {""}, {"sid", "Sidamo", 367, "sidamo", 369}, {""}, {"hin", "Hindi", 165, "hindi", 165}, {""}, {""}, {""}, {"kam", "Kamba", 197, "kamba", 198}, {""}, {""}, {""}, {""}, {"mak", "Makasar", 254, "makassar", 248}, {"de-1901", "German traditional orthography", 464, "German traditional orthography", 455}, {""}, {""}, {""}, {"sit", "Sino-Tibetan (Other)", 372, "sino-tibtaines, autres langues", 372}, {"tr", "Turkish", 424, "turc", 423}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mwr", "Marwari", 269, "marvari", 266}, {"srd", "Sardinian", 357, "sarde", 361}, {"dan", "Danish", 97, "danois", 101}, {""}, {""}, {""}, {"him", "Himachali", 164, "himachali", 164}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"abk", "Abkhazian", 1, "abkhaze", 1}, {"de-1996", "German orthography of 1996", 465, "German orthography of 1996", 456}, {""}, {""}, {"mkd", "Macedonian", 250, "macdonien", 244}, {"tet", "Tetum", 407, "tetum", 404}, {""}, {""}, {""}, {""}, {"tir", "Tigrinya", 411, "tigrigna", 409}, {""}, {""}, {""}, {""}, {""}, {"her", "Herero", 162, "herero", 162}, {""}, {""}, {""}, {""}, {"nyn", "Nyankole", 308, "nyankol", 303}, {"arn", "Araucanian", 20, "araucan", 25}, {""}, {""}, {"tam", "Tamil", 403, "tamoul", 396}, {""}, {"dak", "Dakota", 96, "dakota", 100}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"lin", "Lingala", 237, "lingala", 234}, {"myn", "Mayan languages", 271, "maya, langues", 268}, {"hr", "Croatian", 93, "croate", 99}, {""}, {""}, {"mar", "Marathi", 266, "marathe", 263}, {""}, {""}, {""}, {""}, {"kar", "Karen", 201, "karen", 202}, {""}, {""}, {""}, {""}, {""}, {"nym", "Nyamwezi", 306, "nyamwezi", 301}, {"arm", "Armenian", 22, "armnien", 27}, {""}, {"sad", "Sandawe", 353, "sandawe", 357}, {""}, {""}, {""}, {""}, {""}, {"akk", "Akkadian", 10, "akkadien", 10}, {""}, {""}, {""}, {""}, {"lim", "Limburgish; Limburger; Limburgan", 236, "limbourgeois", 233}, {""}, {""}, {""}, {""}, {"sat", "Santali", 356, "santal", 360}, {"ar", "Arabic", 17, "arabe", 22}, {""}, {""}, {"mad", "Madurese", 251, "madourais", 245}, {""}, {""}, {""}, {""}, {"sa", "Sanskrit", 355, "sanskrit", 359}, {"rar", "Rarotongan", 343, "rarotonga", 341}, {""}, {""}, {""}, {"na", "Nauru", 285, "nauruan", 283}, {"scr", "Croatian", 93, "croate", 99}, {"shn", "Shan", 365, "chan", 80}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kat", "Georgian", 141, "gorgien", 145}, {"sms", "Skolt Sami", 374, "sami skolt", 355}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ka", "Georgian", 141, "gorgien", 145}, {""}, {"smn", "Inari Sami", 177, "sami d'Inari", 352}, {""}, {""}, {""}, {""}, {"ven", "Venda", 438, "venda", 431}, {""}, {""}, {""}, {"sm", "Samoan", 352, "samoan", 356}, {""}, {""}, {""}, {""}, {""}, {"hit", "Hittite", 167, "hittite", 167}, {""}, {""}, {""}, {""}, {"syr", "Syriac", 397, "syriaque", 391}, {""}, {""}, {"art-lojban", "Lojban", 462, "Lojban", 453}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"km", "Khmer", 206, "khmer", 207}, {"khm", "Khmer", 206, "khmer", 207}, {"mkh", "Mon-Khmer (Other)", 278, "mn-khmer, autres langues", 274}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tat", "Tatar", 404, "tatar", 397}, {"da", "Danish", 97, "danois", 101}, {""}, {""}, {""}, {"lam", "Lamba", 228, "lamba", 227}, {""}, {""}, {""}, {"ta", "Tamil", 403, "tamoul", 396}, {""}, {""}, {""}, {""}, {""}, {"nia", "Nias", 294, "nias", 292}, {""}, {""}, {""}, {""}, {"rm", "Raeto-Romance", 340, "rhto-roman", 342}, {""}, {""}, {""}, {""}, {""}, {""}, {"art", "Artificial (Other)", 23, "artificielles, autres langues", 28}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sel", "Selkup", 361, "selkoupe", 364}, {""}, {"sah", "Yakut", 450, "iakoute", 171}, {""}, {""}, {"lit", "Lithuanian", 238, "lituanien", 235}, {"sn", "Shona", 366, "shona", 368}, {"nah", "Nahuatl", 284, "nahuatl", 281}, {""}, {""}, {"aar", "Afar", 5, "afar", 5}, {"nn", "Nynorsk, Norwegian; Norwegian Nynorsk", 309, "nynorsk, norvgien; norvgien nynorsk", 304}, {""}, {""}, {""}, {"swa", "Swahili", 394, "swahili", 389}, {""}, {"wen", "Sorbian languages", 383, "sorabes, langues", 381}, {""}, {""}, {""}, {""}, {"mah", "Marshallese", 268, "marshall", 265}, {""}, {""}, {"nbl", "South Ndebele", 388, "ndbl du Sud", 286}, {"mn", "Mongolian", 280, "mongol", 276}, {""}, {""}, {""}, {""}, {"kn", "Kannada", 198, "kannada", 199}, {""}, {""}, {""}, {"ha", "Hausa", 159, "haoussa", 159}, {"aym", "Aymara", 32, "aymara", 36}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ja", "Japanese", 190, "japonais", 191}, {""}, {""}, {""}, {""}, {""}, {""}, {"mh", "Marshallese", 268, "marshall", 265}, {"snk", "Soninke", 382, "sonink", 380}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hmn", "Hmong", 168, "hmong", 168}, {""}, {""}, {""}, {"rn", "Rundi", 347, "rundi", 345}, {""}, {""}, {"aa", "Afar", 5, "afar", 5}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"del", "Delaware", 99, "delaware", 103}, {""}, {"dra", "Dravidian (Other)", 104, "dravidiennes, autres langues", 111}, {"raj", "Rajasthani", 341, "rajasthani", 339}, {""}, {""}, {""}, {"lad", "Ladino", 226, "judo-espagnol", 194}, {"tel", "Telugu", 405, "tlougou", 401}, {""}, {"tah", "Tahitian", 399, "tahitien", 394}, {""}, {""}, {"ben", "Bengali", 49, "bengali", 54}, {"tn", "Tswana", 421, "tswana", 420}, {""}, {""}, {""}, {"kaa", "Kara-Kalpak", 200, "karakalpak", 201}, {""}, {""}, {""}, {""}, {"lat", "Latin", 230, "latin", 230}, {"sw", "Swahili", 394, "swahili", 389}, {""}, {""}, {"nb", "Norwegian Bokml; Bokml, Norwegian", 303, "norvgien bokml; bokml, norvgien", 298}, {"am", "Amharic", 15, "amharique", 17}, {""}, {""}, {""}, {"la", "Latin", 230, "latin", 230}, {""}, {""}, {""}, {""}, {""}, {"ada", "Adangme", 4, "adangme", 4}, {"th", "Thai", 408, "tha", 405}, {""}, {""}, {"st", "Sotho, Southern", 385, "sotho du Sud", 383}, {"bem", "Bemba", 48, "bemba", 53}, {""}, {""}, {""}, {""}, {""}, {"kw", "Cornish", 88, "cornique", 94}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"bis", "Bislama", 55, "bichlamar", 57}, {""}, {""}, {""}, {"mt", "Maltese", 258, "maltais", 254}, {""}, {""}, {""}, {""}, {""}, {"bin", "Bini", 54, "bini", 61}, {""}, {""}, {""}, {""}, {"sal", "Salishan languages", 349, "salish, langues", 348}, {""}, {""}, {""}, {""}, {"zen", "Zenaga", 458, "zenaga", 449}, {"snd", "Sindhi", 370, "sindhi", 370}, {"was", "Washo", 446, "washo", 439}, {""}, {""}, {""}, {"rw", "Kinyarwanda", 211, "rwanda", 347}, {""}, {""}, {""}, {"tkl", "Tokelau", 416, "tokelau", 413}, {""}, {""}, {""}, {""}, {"mal", "Malayalam", 257, "malayalam", 250}, {""}, {""}, {""}, {""}, {"kal", "Kalaallisut", 196, "groenlandais", 154}, {""}, {""}, {""}, {""}, {"aka", "Akan", 9, "akan", 9}, {"nya", "Nyanja; Chichewa; Chewa", 307, "nyanja; chichewa; chewa", 302}, {"ara", "Arabic", 17, "arabe", 22}, {""}, {""}, {"bik", "Bikol", 53, "bikol", 60}, {"tw", "Twi", 429, "twi", 427}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"awa", "Awadhi", 31, "awadhi", 35}, {"mya", "Burmese", 63, "birman", 62}, {""}, {""}, {""}, {"ber", "Berber (Other)", 50, "berbres, autres langues", 55}, {"hil", "Hiligaynon", 163, "hiligaynon", 163}, {""}, {""}, {"tt", "Tatar", 404, "tatar", 397}, {""}, {""}, {"wak", "Wakashan languages", 442, "wakashennes, langues", 435}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"smj", "Lule Sami", 245, "sami de Lule", 351}, {""}, {""}, {""}, {""}, {"br", "Breton", 59, "breton", 68}, {"lah", "Lahnda", 227, "lahnda", 226}, {""}, {""}, {"sus", "Susu", 393, "soussou", 385}, {"ln", "Lingala", 237, "lingala", 234}, {""}, {""}, {""}, {"bas", "Basa", 42, "basa", 49}, {""}, {""}, {""}, {""}, {"sun", "Sundanese", 392, "soundanais", 384}, {""}, {""}, {""}, {""}, {"ban", "Balinese", 35, "balinais", 40}, {""}, {""}, {""}, {""}, {"mus", "Creek", 91, "muskogee", 280}, {""}, {"ach", "Acoli", 3, "acoli", 3}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mun", "Munda languages", 283, "mounda, langues", 278}, {""}, {""}, {""}, {""}, {"gem", "Germanic (Other)", 146, "germaniques, autres langues", 146}, {""}, {""}, {""}, {""}, {""}, {"sma", "Southern Sami", 387, "sami du Sud", 354}, {""}, {""}, {""}, {"bam", "Bambara", 38, "bambara", 43}, {"kha", "Khasi", 205, "khasi", 206}, {""}, {""}, {""}, {"suk", "Sukuma", 390, "sukuma", 387}, {"dz", "Dzongkha", 109, "dzongkha", 112}, {"war", "Waray", 445, "waray", 438}, {""}, {"ab", "Abkhazian", 1, "abkhaze", 1}, {"bak", "Bashkir", 43, "bachkir", 39}, {""}, {""}, {"tmh", "Tamashek", 402, "tamacheq", 395}, {""}, {"rus", "Russian", 348, "russe", 346}, {""}, {""}, {""}, {""}, {"kum", "Kumyk", 221, "koumyk", 218}, {""}, {""}, {""}, {""}, {"run", "Rundi", 347, "rundi", 345}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn", "Sign languages", 368, "langues des signes", 228}, {"gd", "Scottish Gaelic; Gaelic", 360, "galique cossais; galique", 138}, {"grn", "Guarani", 155, "guarani", 155}, {""}, {""}, {""}, {""}, {""}, {""}, {"lb", "Luxembourgish; Letzeburgesch", 249, "luxembourgeois", 243}, {""}, {""}, {""}, {""}, {""}, {"rum", "Romanian", 345, "roumain", 344}, {""}, {""}, {""}, {""}, {""}, {"tha", "Thai", 408, "tha", 405}, {""}, {""}, {""}, {""}, {"wa", "Walloon", 444, "wallon", 437}, {""}, {""}, {"lt", "Lithuanian", 238, "lituanien", 235}, {"ger", "German", 142, "allemand", 14}, {""}, {"dum", "Dutch, Middle (ca. 1050-1350)", 107, "nerlandais moyen (ca. 1050-1350)", 289}, {""}, {""}, {"hz", "Herero", 162, "herero", 162}, {""}, {""}, {""}, {""}, {"tum", "Tumbuka", 422, "tumbuka", 421}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tuk", "Turkmen", 426, "turkmne", 425}, {""}, {"sna", "Shona", 366, "shona", 368}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kur", "Kurdish", 222, "kurde", 222}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"amh", "Amharic", 15, "amharique", 17}, {"az", "Azerbaijani", 33, "azri", 37}, {""}, {"hun", "Hungarian", 169, "hongrois", 169}, {"fin", "Finnish", 125, "finnois", 129}, {""}, {"bad", "Banda", 40, "banda", 45}, {""}, {""}, {""}, {""}, {""}, {"bej", "Beja", 46, "bedja", 52}, {""}, {""}, {""}, {"div", "Divehi", 101, "maldivien", 252}, {""}, {""}, {""}, {""}, {""}, {"bat", "Baltic (Other)", 36, "baltiques, autres langues", 42}, {""}, {"tiv", "Tiv", 413, "tiv", 410}, {""}, {""}, {"aus", "Australian languages", 27, "australiennes, langues", 32}, {""}, {""}, {""}, {"ba", "Bashkir", 43, "bachkir", 39}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nav", "Navajo; Navaho", 287, "navaho", 284}, {""}, {""}, {"kut", "Kutenai", 224, "kutenai", 224}, {""}, {""}, {""}, {""}, {"per", "Persian", 328, "persan", 327}, {""}, {"bih", "Bihari", 52, "bihari", 59}, {""}, {""}, {"tur", "Turkish", 424, "turc", 423}, {"ss", "Swati", 395, "swati", 390}, {""}, {""}, {""}, {"tgk", "Tajik", 401, "tadjik", 392}, {""}, {""}, {""}, {"frm", "French, Middle (ca.1400-1600)", 129, "franais moyen (1400-1600)", 133}, {""}, {""}, {""}, {""}, {""}, {"lus", "Lushai", 248, "lushai", 242}, {""}, {"wel", "Welsh", 447, "gallois", 141}, {""}, {""}, {""}, {"ms", "Malay", 256, "malais", 249}, {""}, {""}, {""}, {"lun", "Lunda", 246, "lunda", 240}, {"ks", "Kashmiri", 202, "kashmiri", 203}, {"orm", "Oromo", 315, "galla", 140}, {"fr", "French", 128, "franais", 131}, {"new", "Newari", 293, "newari", 291}, {""}, {""}, {""}, {""}, {""}, {"pan", "Panjabi", 325, "pendjabi", 326}, {"fj", "Fijian", 124, "fidjien", 127}, {"fas", "Persian", 328, "persan", 327}, {""}, {""}, {"sq", "Albanian", 11, "albanais", 11}, {""}, {"dut", "Dutch", 106, "nerlandais", 288}, {""}, {"za", "Zhuang; Chuang", 459, "zhuang; chuang", 450}, {""}, {"or", "Oriya", 314, "oriya", 309}, {"fan", "Fang", 121, "fang", 124}, {""}, {""}, {"tut", "Altaic (Other)", 14, "altaques, autres langues", 16}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hrv", "Croatian", 93, "croate", 99}, {""}, {""}, {""}, {""}, {"pam", "Pampanga", 323, "pampangan", 322}, {""}, {"dgr", "Dogrib", 103, "dogrib", 109}, {""}, {""}, {"slk", "Slovak", 377, "slovaque", 375}, {""}, {""}, {""}, {""}, {""}, {""}, {"ath", "Athapascan languages", 26, "athapascanes, langues", 31}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-gr", "Greek Sign Language", 498, "Greek Sign Language", 489}, {""}, {"ts", "Tsonga", 420, "tsonga", 419}, {""}, {""}, {""}, {"bel", "Belarusian", 47, "bilorusse", 58}, {""}, {"bra", "Braj", 58, "braj", 67}, {""}, {""}, {""}, {"bn", "Bengali", 49, "bengali", 54}, {"tsn", "Tswana", 421, "tswana", 420}, {""}, {""}, {"son", "Songhai", 381, "songhai", 379}, {""}, {""}, {""}, {""}, {"non", "Norse, Old", 298, "norrois, vieux", 296}, {""}, {""}, {""}, {""}, {"mos", "Mossi", 281, "mor", 277}, {"de-de-1901", "German German variant traditional orthography", 470, "German German variant traditional orthography", 461}, {""}, {""}, {""}, {"kos", "Kosraean", 217, "kosrae", 217}, {""}, {""}, {"sgn-it", "Italian Sign Language", 500, "Italian Sign Language", 491}, {"ga", "Irish", 185, "irlandais", 185}, {"mon", "Mongolian", 280, "mongol", 276}, {"bh", "Bihari", 52, "bihari", 59}, {""}, {""}, {""}, {"kon", "Kongo", 214, "kongo", 215}, {""}, {""}, {""}, {"uk", "Ukrainian", 432, "ukrainien", 428}, {"som", "Somali", 380, "somali", 378}, {""}, {""}, {""}, {"si", "Sinhalese", 371, "singhalais", 371}, {"se", "Northern Sami", 300, "sami du Nord", 353}, {""}, {"jav", "Javanese", 191, "javanais", 192}, {""}, {""}, {"ne", "Nepali", 292, "npalais", 290}, {"de-de-1996", "German German variant orthography of 1996", 471, "German German variant orthography of 1996", 462}, {""}, {""}, {""}, {"sgn-za", "South African Sign Language", 509, "South African Sign Language", 500}, {""}, {""}, {""}, {""}, {""}, {"ces", "Czech", 95, "tchque", 398}, {""}, {""}, {"mi", "Maori", 265, "maori", 262}, {"kom", "Komi", 213, "komi", 214}, {"jpn", "Japanese", 190, "japonais", 191}, {""}, {""}, {"ki", "Kikuyu; Gikuyu", 209, "kikuyu", 210}, {"ron", "Romanian", 345, "roumain", 344}, {""}, {""}, {""}, {""}, {"kok", "Konkani", 215, "konkani", 216}, {"ur", "Urdu", 435, "ourdou", 316}, {"wal", "Walamo", 443, "walamo", 436}, {""}, {""}, {"gba", "Gbaya", 139, "gbaya", 144}, {"id", "Indonesian", 180, "indonsien", 180}, {""}, {"tyv", "Tuvinian", 428, "touva", 416}, {""}, {"btk", "Batak (Indonesia)", 45, "batak (Indonsie)", 51}, {""}, {""}, {""}, {"nld", "Dutch", 106, "nerlandais", 288}, {"kua", "Kwanyama, Kuanyama", 225, "kwanyama; kuanyama", 225}, {"as", "Assamese", 24, "assamais", 29}, {""}, {""}, {"ik", "Inupiaq", 183, "inupiaq", 183}, {"ton", "Tonga (Tonga Islands)", 418, "tongan (les Tonga)", 415}, {"zh", "Chinese", 80, "chinois", 86}, {""}, {""}, {""}, {"rom", "Romany", 346, "tsigane", 417}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kaw", "Kawi", 203, "kawi", 204}, {"afr", "Afrikaans", 7, "afrikaans", 7}, {""}, {"lav", "Latvian", 231, "letton", 231}, {""}, {"pa", "Panjabi", 325, "pendjabi", 326}, {"yid", "Yiddish", 453, "yiddish", 444}, {""}, {"fat", "Fanti", 122, "fanti", 125}, {""}, {""}, {"mlt", "Maltese", 258, "maltais", 254}, {"phn", "Phoenician", 331, "phnicien", 330}, {"de", "German", 142, "allemand", 14}, {""}, {""}, {"nor", "Norwegian", 302, "norvgien", 297}, {"fa", "Persian", 328, "persan", 327}, {""}, {""}, {"ti", "Tigrinya", 411, "tigrigna", 409}, {"te", "Telugu", 405, "tlougou", 401}, {""}, {"asm", "Assamese", 24, "assamais", 29}, {""}, {""}, {"ukr", "Ukrainian", 432, "ukrainien", 428}, {""}, {""}, {""}, {"sgn-us", "American Sign Language", 508, "American Sign Language", 499}, {"sga", "Irish, Old (to 900)", 187, "irlandais ancien (jusqu' 900)", 186}, {""}, {"dua", "Duala", 105, "douala", 110}, {""}, {""}, {"kor", "Korean", 216, "coren", 93}, {"gn", "Guarani", 155, "guarani", 155}, {""}, {""}, {"sl", "Slovenian", 378, "slovne", 376}, {"bal", "Baluchi", 37, "baloutchi", 41}, {""}, {""}, {""}, {"nl", "Dutch", 106, "nerlandais", 288}, {""}, {""}, {""}, {""}, {"de-at-1901", "German Austrian variant traditional orthography", 466, "German Austrian variant traditional orthography", 457}, {"mga", "Irish, Middle (900-1200)", 186, "irlandais moyen (900-1200)", 187}, {""}, {"fij", "Fijian", 124, "fidjien", 127}, {""}, {""}, {"mul", "Multiple languages", 282, "multilingue", 279}, {"ny", "Nyanja; Chichewa; Chewa", 307, "nyanja; chichewa; chewa", 302}, {""}, {""}, {"ml", "Malayalam", 257, "malayalam", 250}, {"sot", "Sotho, Southern", 385, "sotho du Sud", 383}, {"urd", "Urdu", 435, "ourdou", 316}, {"bnt", "Bantu (Other)", 41, "bantoues, autres langues", 46}, {""}, {"kl", "Kalaallisut", 196, "groenlandais", 154}, {""}, {"jpr", "Judeo-Persian", 193, "judo-persan", 195}, {""}, {""}, {""}, {"om", "Oromo", 315, "galla", 140}, {"my", "Burmese", 63, "birman", 62}, {""}, {""}, {""}, {""}, {"ky", "Kirghiz", 212, "kirghize", 212}, {""}, {""}, {"de-at-1996", "German Austrian variant orthography of 1996", 467, "German Austrian variant orthography of 1996", 458}, {"hi", "Hindi", 165, "hindi", 165}, {"he", "Hebrew", 161, "hbreu", 161}, {""}, {""}, {""}, {"gil", "Gilbertese", 148, "kiribati", 213}, {"arw", "Arawak", 21, "arawak", 26}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-pt", "Portuguese Sign Language", 506, "Portuguese Sign Language", 497}, {""}, {""}, {""}, {""}, {""}, {"gaa", "Ga", 134, "ga", 136}, {""}, {""}, {""}, {"de-ch-1901", "German Swiss variant traditional orthography", 468, "German Swiss variant traditional orthography", 459}, {""}, {""}, {""}, {""}, {""}, {"tib", "Tibetan", 409, "tibtain", 407}, {"znd", "Zande", 456, "zand", 447}, {""}, {""}, {""}, {"ae", "Avestan", 30, "avestique", 34}, {"heb", "Hebrew", 161, "hbreu", 161}, {"pra", "Prakrit languages", 335, "prkrit", 335}, {""}, {"zh-min", "Min Fuzhou Hokkien Amoy or Taiwanese", 513, "Min Fuzhou Hokkien Amoy or Taiwanese", 504}, {"haw", "Hawaiian", 160, "hawaen", 160}, {"i-klingon", "Klingon", 478, "Klingon", 469}, {""}, {"zh-min-nan", "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo", 514, "Minnan Hokkien Amoy Taiwanese Southern Min Southern Fujian Hoklo Southern Fukien Ho-lo", 505}, {"tl", "Tagalog", 398, "tagalog", 393}, {""}, {""}, {""}, {""}, {"fra", "French", 128, "franais", 131}, {""}, {""}, {""}, {""}, {"de-ch-1996", "German Swiss variant orthography of 1996", 469, "German Swiss variant orthography of 1996", 460}, {""}, {"ty", "Tahitian", 399, "tahitien", 394}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kab", "Kabyle", 194, "kabyle", 196}, {""}, {""}, {""}, {""}, {""}, {"spa", "Spanish; Castilian", 389, "espagnol; castillan", 119}, {"ast", "Bable; Asturian", 34, "bable; asturien", 38}, {""}, {"li", "Limburgish; Limburger; Limburgan", 236, "limbourgeois", 233}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ssa", "Nilo-Saharan (Other)", 296, "nilo-sahariennes, autres langues", 294}, {""}, {""}, {"sc", "Sardinian", 357, "sarde", 361}, {""}, {""}, {""}, {""}, {""}, {""}, {"afh", "Afrihili", 6, "afrihili", 6}, {""}, {""}, {"lua", "Luba-Lulua", 243, "luba-lulua", 238}, {""}, {""}, {""}, {""}, {"sla", "Slavic (Other)", 376, "slaves, autres langues", 374}, {""}, {"msa", "Malay", 256, "malais", 249}, {""}, {""}, {"paa", "Papuan (Other)", 327, "papoues, autres langues", 325}, {""}, {""}, {""}, {""}, {"zun", "Zuni", 461, "Zuni", 452}, {""}, {""}, {""}, {""}, {"tgl", "Tagalog", 398, "tagalog", 393}, {""}, {"hy", "Armenian", 22, "armnien", 27}, {""}, {""}, {""}, {"zha", "Zhuang; Chuang", 459, "zhuang; chuang", 450}, {"moh", "Mohawk", 276, "mohawk", 272}, {""}, {""}, {""}, {""}, {"jrb", "Judeo-Arabic", 192, "judo-arabe", 193}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"car", "Carib", 65, "caribe", 72}, {""}, {""}, {""}, {""}, {""}, {""}, {"gmh", "German, Middle High (ca.1050-1500)", 144, "", 0}, {""}, {""}, {"ay", "Aymara", 32, "aymara", 36}, {""}, {""}, {"pt", "Portuguese", 334, "portugais", 334}, {"bur", "Burmese", 63, "birman", 62}, {""}, {""}, {""}, {""}, {"afa", "Afro-Asiatic (Other)", 8, "afro-asiatiques, autres langues", 8}, {""}, {"roh", "Raeto-Romance", 340, "rhto-roman", 342}, {""}, {""}, {""}, {""}, {"cym", "Welsh", 447, "gallois", 141}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cad", "Caddo", 64, "caddo", 71}, {""}, {""}, {""}, {""}, {"iba", "Iban", 171, "iban", 172}, {""}, {"baq", "Basque", 44, "basque", 50}, {""}, {""}, {"pal", "Pahlavi", 320, "pahlavi", 319}, {""}, {""}, {""}, {""}, {""}, {"cat", "Catalan", 67, "catalan", 74}, {""}, {""}, {""}, {"kaz", "Kazakh", 204, "kazakh", 205}, {""}, {"wln", "Walloon", 444, "wallon", 437}, {""}, {""}, {"ca", "Catalan", 67, "catalan", 74}, {""}, {""}, {""}, {""}, {"vi", "Vietnamese", 439, "vietnamien", 432}, {""}, {"chn", "Chinook jargon", 81, "chinook, jargon", 87}, {""}, {""}, {"sv", "Swedish", 396, "sudois", 386}, {""}, {""}, {""}, {""}, {"nv", "Navajo; Navaho", 287, "navaho", 284}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"roa", "Romance (Other)", 344, "romanes, autres langues", 343}, {""}, {""}, {""}, {""}, {"kv", "Komi", 213, "komi", 214}, {""}, {"chm", "Mari", 267, "mari", 264}, {""}, {""}, {"lez", "Lezghian", 233, "lezghien", 232}, {"bs", "Bosnian", 57, "bosniaque", 65}, {"ira", "Iranian (Other)", 184, "iraniennes, autres langues", 184}, {"i-hak", "Hakka Deprecated use IETF zh-hakka registered Jan. 102000", 477, "Hakka Deprecated use IETF zh-hakka registered Jan. 102000", 468}, {""}, {""}, {""}, {"chk", "Chuukese", 85, "chuuk", 91}, {""}, {"sg", "Sango", 354, "sango", 358}, {""}, {"apa", "Apache languages", 16, "apache", 21}, {""}, {""}, {"ng", "Ndonga", 290, "ndonga", 287}, {""}, {""}, {""}, {""}, {""}, {"pus", "Pushto", 338, "pachto", 318}, {"kmb", "Kimbundu", 210, "kimbundu", 211}, {""}, {""}, {"sgn-gb", "British Sign Language", 497, "British Sign Language", 488}, {""}, {""}, {""}, {""}, {"mg", "Malagasy", 255, "malgache", 253}, {"mol", "Moldavian", 277, "moldave", 273}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"xh", "Xhosa", 449, "xhosa", 441}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"eka", "Ekajuk", 112, "ekajuk", 116}, {""}, {""}, {""}, {""}, {""}, {"en", "English", 114, "anglais", 18}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tig", "Tigre", 410, "tigr", 408}, {"cel", "Celtic (Other)", 70, "celtiques, autres langues", 77}, {""}, {""}, {""}, {""}, {""}, {"chr", "Cherokee", 75, "cherokee", 81}, {"sgn-fr", "French Sign Language", 496, "French Sign Language", 487}, {""}, {"sag", "Sango", 354, "sango", 358}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"bos", "Bosnian", 57, "bosniaque", 65}, {"vot", "Votic", 441, "vote", 434}, {""}, {""}, {"tg", "Tajik", 401, "tadjik", 392}, {""}, {""}, {""}, {"enm", "English, Middle (1100-1500)", 115, "anglais moyen (1100-1500)", 19}, {""}, {"mag", "Magahi", 252, "magahi", 246}, {"und", "Undetermined", 434, "indtermine", 177}, {"ch", "Chamorro", 73, "chamorro", 79}, {""}, {""}, {"nep", "Nepali", 292, "npalais", 290}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-es", "Spanish Sign Language", 495, "Spanish Sign Language", 486}, {""}, {""}, {""}, {"it", "Italian", 189, "italien", 190}, {""}, {""}, {""}, {""}, {""}, {"jv", "Javanese", 191, "javanais", 192}, {""}, {""}, {"sgn-jp", "Japanese Sign Language", 501, "Japanese Sign Language", 492}, {""}, {""}, {""}, {""}, {""}, {"bi", "Bislama", 55, "bichlamar", 57}, {"be", "Belarusian", 47, "bilorusse", 58}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"uz", "Uzbek", 436, "ouszbek", 317}, {"tvl", "Tuvalu", 427, "tuvalu", 426}, {""}, {""}, {""}, {""}, {""}, {"cel-gaulish", "Gaulish", 463, "Gaulish", 454}, {"fur", "Friulian", 132, "frioulan", 134}, {""}, {""}, {"bua", "Buriat", 62, "bouriate", 66}, {"ind", "Indonesian", 180, "indonsien", 180}, {""}, {""}, {""}, {"ava", "Avaric", 29, "avar", 33}, {""}, {""}, {""}, {"zh-gan", "Kan or Gan", 510, "Kan or Gan", 501}, {""}, {""}, {""}, {""}, {"su", "Sundanese", 392, "soundanais", 384}, {""}, {""}, {""}, {""}, {""}, {"et", "Estonian", 118, "estonien", 121}, {""}, {""}, {""}, {""}, {"ndo", "Ndonga", 290, "ndonga", 287}, {""}, {"srp", "Serbian", 363, "serbe", 366}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"lv", "Latvian", 231, "letton", 231}, {""}, {""}, {""}, {"ku", "Kurdish", 222, "kurde", 222}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"slv", "Slovenian", 378, "slovne", 376}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-co", "Colombian Sign Language", 492, "Colombian Sign Language", 483}, {""}, {""}, {""}, {""}, {"sio", "Siouan languages", 373, "sioux, langues", 373}, {""}, {""}, {""}, {""}, {"ota", "Turkish, Ottoman (1500-1928)", 425, "turc ottoman (1500-1928)", 424}, {""}, {""}, {""}, {""}, {""}, {"ps", "Pushto", 338, "pachto", 318}, {""}, {""}, {"ru", "Russian", 348, "russe", 346}, {"lol", "Mongo", 279, "mongo", 275}, {""}, {""}, {""}, {""}, {"bul", "Bulgarian", 61, "bulgare", 70}, {""}, {""}, {""}, {""}, {"gon", "Gondi", 149, "gond", 147}, {""}, {""}, {""}, {"bod", "Tibetan", 409, "tibtain", 407}, {"guj", "Gujarati", 156, "goudjrati", 150}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nap", "Neapolitan", 291, "napolitain", 282}, {"os", "Ossetic; Ossetian", 318, "osste", 312}, {"oss", "Ossetic; Ossetian", 318, "osste", 312}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"kro", "Kru", 219, "krou", 220}, {""}, {""}, {"map", "Austronesian (Other)", 28, "malayo-polynsiennes, autres langues", 251}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"eus", "Basque", 44, "basque", 50}, {""}, {"no-nyn", "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000", 487, "Norwegian New Norwegian Deprecated use ISO 639 nn registered Feb. 18 2000", 478}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"dzo", "Dzongkha", 109, "dzongkha", 112}, {""}, {""}, {""}, {"cus", "Cushitic (Other)", 94, "couchitiques, autres langues", 96}, {""}, {""}, {""}, {"zul", "Zulu", 460, "zoulou", 451}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"rap", "Rapanui", 342, "rapanui", 340}, {""}, {""}, {""}, {""}, {"hu", "Hungarian", 169, "hongrois", 169}, {"af", "Afrikaans", 7, "afrikaans", 7}, {"cha", "Chamorro", 73, "chamorro", 79}, {""}, {""}, {"nub", "Nubian languages", 305, "nubiennes, langues", 300}, {""}, {""}, {""}, {""}, {"pon", "Pohnpeian", 332, "pohnpei", 332}, {""}, {""}, {"sgn-mx", "Mexican Sign Language", 502, "Mexican Sign Language", 493}, {""}, {"mao", "Maori", 265, "maori", 262}, {""}, {""}, {""}, {""}, {""}, {""}, {"fon", "Fon", 127, "fon", 130}, {""}, {""}, {""}, {"zh-hakka", "Hakka", 512, "Hakka", 503}, {""}, {""}, {"so", "Somali", 380, "somali", 378}, {""}, {""}, {""}, {""}, {"no", "Norwegian", 302, "norvgien", 297}, {"gor", "Gorontalo", 150, "gorontalo", 148}, {""}, {""}, {"sgn-nl", "Dutch Sign Language", 504, "Dutch Sign Language", 495}, {""}, {""}, {""}, {""}, {""}, {"pi", "Pali", 322, "pali", 321}, {""}, {"vol", "Volapk", 440, "volapk", 433}, {"arp", "Arapaho", 19, "arapaho", 24}, {""}, {"mo", "Moldavian", 277, "moldave", 273}, {""}, {""}, {""}, {""}, {"ko", "Korean", 216, "coren", 93}, {""}, {"fi", "Finnish", 125, "finnois", 129}, {""}, {""}, {""}, {"sco", "Scots", 359, "cossais", 113}, {"ssw", "Swati", 395, "swati", 390}, {""}, {""}, {"gl", "Gallegan", 136, "galicien", 139}, {"bla", "Siksika", 369, "blackfoot", 63}, {""}, {""}, {""}, {""}, {""}, {""}, {"ypk", "Yupik languages", 455, "yupik, langues", 446}, {""}, {"sgn-dk", "Danish Sign Language", 494, "Danish Sign Language", 485}, {""}, {""}, {"grb", "Grebo", 152, "grebo", 151}, {""}, {""}, {"ita", "Italian", 189, "italien", 190}, {""}, {""}, {""}, {""}, {"got", "Gothic", 151, "gothique", 149}, {""}, {""}, {""}, {"ro", "Romanian", 345, "roumain", 344}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nyo", "Nyoro", 310, "nyoro", 305}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"to", "Tonga (Tonga Islands)", 418, "tongan (les Tonga)", 415}, {""}, {"is", "Icelandic", 172, "islandais", 189}, {""}, {""}, {""}, {"por", "Portuguese", 334, "portugais", 334}, {""}, {""}, {"i-default", "Default Language Context", 475, "Default Language Context", 466}, {"sgn-br", "Brazilian Sign Language", 490, "Brazilian Sign Language", 481}, {"gez", "Geez", 140, "guze", 156}, {""}, {"sgn-be-fr", "Belgian-French Sign Language", 488, "Belgian-French Sign Language", 479}, {""}, {"sgn-ch-de", "Swiss German Sign Language", 491, "Swiss German Sign Language", 482}, {""}, {""}, {""}, {""}, {"sgn-se", "Swedish Sign Language", 507, "Swedish Sign Language", 498}, {""}, {""}, {""}, {""}, {""}, {""}, {"zh-xiang", "Xiang or Hunanese", 516, "Xiang or Hunanese", 507}, {"wol", "Wolof", 448, "wolof", 440}, {""}, {""}, {"niu", "Niuean", 297, "niu", 295}, {""}, {""}, {"no-bok", "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000", 486, "Norwegian Book language Deprecated use ISO 639 nb registered Feb. 18 2000", 477}, {"pl", "Polish", 333, "polonais", 333}, {""}, {""}, {""}, {""}, {""}, {""}, {"ipk", "Inupiaq", 183, "inupiaq", 183}, {"ful", "Fulah", 133, "peul", 329}, {""}, {""}, {"ltz", "Luxembourgish; Letzeburgesch", 249, "luxembourgeois", 243}, {""}, {"deu", "German", 142, "allemand", 14}, {""}, {""}, {"yi", "Yiddish", 453, "yiddish", 444}, {""}, {""}, {""}, {""}, {""}, {""}, {"es", "Spanish; Castilian", 389, "espagnol; castillan", 119}, {"fy", "Frisian", 131, "frison", 135}, {""}, {"ho", "Hiri Motu", 166, "hiri motu", 166}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"qu", "Quechua", 339, "quechua", 338}, {""}, {"cs", "Czech", 95, "tchque", 398}, {""}, {""}, {""}, {"smo", "Samoan", 352, "samoan", 356}, {"kru", "Kurukh", 223, "kurukh", 223}, {""}, {""}, {""}, {"kho", "Khotanese", 208, "khotanais", 209}, {"may", "Malay", 256, "malais", 249}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-ie", "Irish Sign Language", 499, "Irish Sign Language", 490}, {"gla", "Scottish Gaelic; Gaelic", 360, "galique cossais; galique", 138}, {""}, {"goh", "German, Old High (ca.750-1050)", 145, "", 0}, {""}, {""}, {""}, {""}, {""}, {""}, {"bg", "Bulgarian", 61, "bulgare", 70}, {"lao", "Lao", 229, "lao", 229}, {""}, {""}, {""}, {""}, {"lub", "Luba-Katanga", 242, "luba-katanga", 237}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ang", "English, Old (ca.450-1100)", 116, "anglo-saxon (ca.450-1100)", 20}, {""}, {""}, {"nau", "Nauru", 285, "nauruan", 283}, {"yor", "Yoruba", 454, "yoruba", 445}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"lo", "Lao", 229, "lao", 229}, {"ie", "Interlingue", 181, "interlingue", 181}, {""}, {""}, {""}, {"day", "Dayak", 98, "dayak", 102}, {"nzi", "Nzima", 311, "nzema", 306}, {""}, {""}, {""}, {""}, {"kau", "Kanuri", 199, "kanouri", 200}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cos", "Corsican", 89, "corse", 95}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"uzb", "Uzbek", 436, "ouszbek", 317}, {""}, {"sgn-be-nl", "Belgian-Flemish Sign Language", 489, "Belgian-Flemish Sign Language", 480}, {""}, {""}, {"uga", "Ugaritic", 430, "ougaritique", 314}, {""}, {"nno", "Nynorsk, Norwegian; Norwegian Nynorsk", 309, "nynorsk, norvgien; norvgien nynorsk", 304}, {""}, {""}, {""}, {""}, {"mri", "Maori", 265, "maori", 262}, {""}, {""}, {"nob", "Norwegian Bokml; Bokml, Norwegian", 303, "norvgien bokml; bokml, norvgien", 298}, {""}, {"osa", "Osage", 316, "osage", 310}, {""}, {""}, {"oc", "Provenal; Occitan (post 1500)", 336, "provenal; occitan (aprs 1500)", 336}, {""}, {"mno", "Manobo languages", 263, "manobo, langues", 260}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gv", "Manx", 264, "manx; mannois", 261}, {""}, {""}, {""}, {""}, {""}, {"ce", "Chechen", 74, "tchtchne", 399}, {""}, {""}, {""}, {""}, {""}, {"nde", "North Ndebele", 301, "ndbl du Nord", 285}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hmo", "Hiri Motu", 166, "hiri motu", 166}, {""}, {""}, {""}, {""}, {""}, {"est", "Estonian", 118, "estonien", 121}, {"chv", "Chuvash", 86, "tchouvache", 400}, {"sai", "South American Indian (Other)", 386, "", 0}, {""}, {""}, {""}, {""}, {"nai", "North American Indian (Other)", 299, "", 0}, {""}, {""}, {""}, {""}, {""}, {"ceb", "Cebuano", 69, "cebuano", 76}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mai", "Maithili", 253, "maithili", 247}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"twi", "Twi", 429, "twi", 427}, {""}, {""}, {""}, {""}, {"vo", "Volapk", 440, "volapk", 433}, {"hau", "Hausa", 159, "haoussa", 159}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cor", "Cornish", 88, "cornique", 94}, {"nic", "Niger-Kordofanian (Other)", 295, "nigro-congolaises, autres langues", 293}, {""}, {""}, {""}, {""}, {"swe", "Swedish", 396, "sudois", 386}, {""}, {""}, {"alb", "Albanian", 11, "albanais", 11}, {""}, {""}, {""}, {""}, {"el", "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153}, {""}, {"mic", "Micmac", 273, "micmac", 270}, {""}, {""}, {""}, {""}, {""}, {"dyu", "Dyula", 108, "dioula", 105}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tai", "Tai (Other)", 400, "thaes, autres langues", 406}, {""}, {""}, {""}, {""}, {""}, {""}, {"cy", "Welsh", 447, "gallois", 141}, {""}, {"zu", "Zulu", 460, "zoulou", 451}, {"pol", "Polish", 333, "polonais", 333}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"wo", "Wolof", 448, "wolof", 440}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hai", "Haida", 158, "haida", 158}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"lug", "Ganda", 137, "ganda", 142}, {""}, {""}, {""}, {""}, {"geo", "Georgian", 141, "gorgien", 145}, {""}, {"mac", "Macedonian", 250, "macdonien", 244}, {""}, {""}, {"pag", "Pangasinan", 324, "pangasinan", 323}, {""}, {"kac", "Kachin", 195, "kachin", 197}, {""}, {"gu", "Gujarati", 156, "goudjrati", 150}, {""}, {""}, {""}, {""}, {""}, {"zap", "Zapotec", 457, "zapotque", 448}, {""}, {""}, {""}, {""}, {"mlg", "Malagasy", 255, "malgache", 253}, {""}, {"i-navajo", "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000", 481, "Navajo Deprecated use ISO 639 nv registered Feb. 18 2000", 472}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"tup", "Tupi languages", 423, "tupi, langues", 422}, {""}, {""}, {""}, {""}, {""}, {"smi", "Sami languages (Other)", 351, "sami, autres langues", 350}, {"aze", "Azerbaijani", 33, "azri", 37}, {""}, {""}, {""}, {"khi", "Khoisan (Other)", 207, "khoisan, autres langues", 208}, {"glv", "Manx", 264, "manx; mannois", 261}, {""}, {"bo", "Tibetan", 409, "tibtain", 407}, {""}, {""}, {"scc", "Serbian", 363, "serbe", 366}, {""}, {""}, {""}, {""}, {"isl", "Icelandic", 172, "islandais", 189}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"uig", "Uighur", 431, "ougour", 315}, {""}, {""}, {""}, {""}, {"zh-wuu", "Shanghaiese or Wu", 515, "Shanghaiese or Wu", 506}, {""}, {"zh-guoyu", "Mandarin or Standard Chinese", 511, "Mandarin or Standard Chinese", 502}, {""}, {""}, {"sog", "Sogdian", 379, "sogdien", 377}, {"umb", "Umbundu", 433, "umbundu", 429}, {""}, {""}, {""}, {""}, {""}, {"i-ami", "Amis", 473, "Amis", 464}, {""}, {""}, {""}, {""}, {""}, {""}, {"ug", "Uighur", 431, "ougour", 315}, {"peo", "Persian, Old (ca.600-400 B.C.)", 329, "perse, vieux (ca. 600-400 av. J.-C.)", 328}, {""}, {""}, {"sgn-no", "Norwegian Sign Language", 505, "Norwegian Sign Language", 496}, {""}, {""}, {"hup", "Hupa", 170, "hupa", 170}, {"i-bnn", "Bunun", 474, "Bunun", 465}, {""}, {"arc", "Aramaic", 18, "aramen", 23}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"i-tsu", "Tsou", 485, "Tsou", 476}, {""}, {""}, {"ell", "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"loz", "Lozi", 241, "lozi", 236}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sme", "Northern Sami", 300, "sami du Nord", 353}, {""}, {""}, {""}, {"mni", "Manipuri", 262, "manipuri", 258}, {""}, {""}, {"tog", "Tonga (Nyasa)", 417, "tonga (Nyasa)", 414}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"pro", "Provenal, Old (to 1500)", 337, "provenal ancien (jusqu' 1500)", 337}, {""}, {""}, {""}, {"cv", "Chuvash", 86, "tchouvache", 400}, {""}, {""}, {""}, {"pap", "Papiamento", 326, "papiamento", 324}, {"zh-yue", "Cantonese", 517, "Cantonese", 508}, {"chb", "Chibcha", 78, "chibcha", 84}, {""}, {"fro", "French, Old (842-ca.1400)", 130, "franais ancien (842-ca.1400)", 132}, {"alg", "Algonquian languages", 13, "algonquines, langues", 13}, {""}, {""}, {""}, {""}, {""}, {"bho", "Bhojpuri", 51, "bhojpuri", 56}, {""}, {""}, {""}, {""}, {"vai", "Vai", 437, "va", 430}, {""}, {""}, {""}, {""}, {""}, {"ace", "Achinese", 2, "aceh", 2}, {""}, {""}, {""}, {""}, {""}, {""}, {"hye", "Armenian", 22, "armnien", 27}, {""}, {""}, {""}, {"vie", "Vietnamese", 439, "vietnamien", 432}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nso", "Sotho, Northern", 384, "sotho du Nord", 382}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"luo", "Luo (Kenya and Tanzania)", 247, "luo (Kenya et Tanzanie)", 241}, {""}, {""}, {""}, {""}, {"slo", "Slovak", 377, "slovaque", 375}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"fao", "Faroese", 123, "froen", 126}, {""}, {""}, {""}, {"zho", "Chinese", 80, "chinois", 86}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"sgn-ni", "Nicaraguan Sign Language", 503, "Nicaraguan Sign Language", 494}, {""}, {""}, {""}, {""}, {""}, {""}, {"sqi", "Albanian", 11, "albanais", 11}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"fo", "Faroese", 123, "froen", 126}, {""}, {""}, {""}, {"ijo", "Ijo", 175, "ijo", 175}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mnc", "Manchu", 259, "mandchou", 255}, {"bug", "Buginese", 60, "bugi", 69}, {"yap", "Yapese", 452, "yapois", 443}, {"tso", "Tsonga", 420, "tsonga", 419}, {""}, {"iu", "Inuktitut", 182, "inuktitut", 182}, {""}, {""}, {""}, {""}, {""}, {"ido", "Ido", 173, "ido", 173}, {""}, {""}, {""}, {""}, {"ibo", "Igbo", 174, "igbo", 174}, {""}, {""}, {""}, {""}, {""}, {""}, {"i-pwn", "Paiwan", 482, "Paiwan", 473}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"i-tay", "Tayal", 484, "Tayal", 475}, {""}, {""}, {""}, {"gay", "Gayo", 138, "gayo", 143}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"eu", "Basque", 44, "basque", 50}, {"yao", "Yao", 451, "yao", 442}, {""}, {""}, {""}, {"bai", "Bamileke languages", 39, "bamilks, langues", 44}, {"fry", "Frisian", 131, "frison", 135}, {""}, {""}, {"i-mingo", "Mingo", 480, "Mingo", 471}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iro", "Iroquoian languages", 188, "iroquoises, langues (famille)", 188}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"crp", "Creoles and pidgins (Other)", 92, "croles et pidgins divers", 98}, {""}, {"sux", "Sumerian", 391, "sumrien", 388}, {""}, {""}, {""}, {""}, {"yo", "Yoruba", 454, "yoruba", 445}, {""}, {"fiu", "Finno-Ugrian (Other)", 126, "finno-ougriennes, autres langues", 128}, {""}, {""}, {""}, {""}, {"i-tao", "Tao", 483, "Tao", 474}, {""}, {""}, {""}, {""}, {""}, {""}, {"bre", "Breton", 59, "breton", 68}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ewo", "Ewondo", 120, "wondo", 123}, {"en-scouse", "English Liverpudlian dialect known as 'Scouse'", 472, "English Liverpudlian dialect known as 'Scouse'", 463}, {""}, {""}, {"gwi", "Gwich'in", 157, "gwich'in", 157}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"chg", "Chagatai", 71, "djaghata", 107}, {""}, {""}, {"oji", "Ojibwa", 313, "ojibwa", 308}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"io", "Ido", 173, "ido", 173}, {"pau", "Palauan", 321, "palau", 320}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"eo", "Esperanto", 117, "espranto", 120}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gre", "Greek, Modern (1453-)", 154, "grec moderne (aprs 1453)", 153}, {"co", "Corsican", 89, "corse", 95}, {""}, {"ori", "Oriya", 314, "oriya", 309}, {""}, {""}, {"sgn-de", "German Sign Language", 493, "German Sign Language", 484}, {""}, {""}, {"i-enochian", "Enochian", 476, "Enochian", 467}, {""}, {""}, {""}, {""}, {"eng", "English", 114, "anglais", 18}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"grc", "Greek, Ancient (to 1453)", 153, "grec ancien (jusqu' 1453)", 152}, {"lui", "Luiseno", 244, "luiseno", 239}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"oto", "Otomian languages", 319, "otomangue, langues", 313}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iku", "Inuktitut", 182, "inuktitut", 182}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"chp", "Chipewyan", 82, "chipewyan", 88}, {""}, {""}, {""}, {"xho", "Xhosa", 449, "xhosa", 441}, {""}, {""}, {""}, {""}, {"tpi", "Tok Pisin", 415, "tok pisin", 412}, {""}, {""}, {""}, {""}, {"fre", "French", 128, "franais", 131}, {""}, {""}, {""}, {""}, {""}, {"tsi", "Tsimshian", 419, "tsimshian", 418}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"glg", "Gallegan", 136, "galicien", 139}, {""}, {""}, {""}, {""}, {"tli", "Tlingit", 414, "tlingit", 411}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"oci", "Provenal; Occitan (post 1500)", 336, "provenal; occitan (aprs 1500)", 336}, {""}, {""}, {""}, {""}, {""}, {""}, {"cho", "Choctaw", 83, "choctaw", 89}, {"kpe", "Kpelle", 218, "kpell", 219}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"doi", "Dogri", 102, "dogri", 108}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cau", "Caucasian (Other)", 68, "caucasiennes, autres langues", 75}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"phi", "Philippine (Other)", 330, "philippines, autres langues", 331}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"que", "Quechua", 339, "quechua", 338}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"i-lux", "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998", 479, "Luxembourgish Deprecated use ISO 639 lb registered Sept. 9 1998", 470}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"chy", "Cheyenne", 77, "cheyenne", 83}, {""}, {""}, {"ale", "Aleut", 12, "aloute", 12}, {""}, {""}, {""}, {""}, {""}, {"cze", "Czech", 95, "tchque", 398}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ewe", "Ewe", 119, "w", 122}, {""}, {"cre", "Cree", 90, "cree", 97}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ice", "Icelandic", 172, "islandais", 189}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ave", "Avestan", 30, "avestique", 34}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"chi", "Chinese", 80, "chinois", 86}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"che", "Chechen", 74, "tchtchne", 399}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ilo", "Iloko", 176, "ilocano", 176}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ine", "Indo-European (Other)", 179, "indo-europennes, autres langues", 179}, {""}, {""}, {""}, {""}, {"cmc", "Chamic languages", 72, "chames, langues", 78}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"epo", "Esperanto", 117, "espranto", 120}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"inc", "Indic (Other)", 178, "indo-aryennes, autres langues", 178}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cop", "Coptic", 87, "copte", 92}, {""}, {""}, {""}, {""}, {""}, {""}, {"egy", "Egyptian (Ancient)", 111, "gyptien", 115}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"pli", "Pali", 322, "pali", 321}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gle", "Irish", 185, "irlandais", 185}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"efi", "Efik", 110, "efik", 114}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"elx", "Elamite", 113, "lamite", 117}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ile", "Interlingue", 181, "interlingue", 181} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif const struct language * in_word_set (register const char *str, register size_t len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct language *) 0; } gperf-3.2.1/tests/test-4.exp0000664000000000000000000002242614776761073011301 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -D -t -k'1,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Command-line: gperf -L KR-C -F ', 0, 0' -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */ struct resword { const char *name; short token; enum rid rid; }; #define TOTAL_KEYWORDS 83 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 20 #define MIN_HASH_VALUE 4 #define MAX_HASH_VALUE 127 /* maximum key range = 124, duplicates = 8 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 5, 128, 0, 15, 50, 55, 0, 15, 35, 65, 60, 128, 40, 0, 60, 65, 10, 128, 128, 15, 20, 30, 20, 40, 0, 20, 15, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128 }; return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]]; } struct resword * in_word_set (register const char *str, register size_t len) { #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static struct resword wordlist[] = { {"else", ELSE, NORID}, {"while", WHILE, NORID}, {"@encode", ENCODE, NORID}, {"@private", PRIVATE, NORID}, {"@protocol", PROTOCOL, NORID}, {"@interface", INTERFACE, NORID}, {"__real", REALPART, NORID}, {"__inline", SCSPEC, RID_INLINE}, {"auto", SCSPEC, RID_AUTO}, {"__volatile", TYPE_QUAL, RID_VOLATILE}, {"__attribute", ATTRIBUTE, NORID}, {"__asm__", ASM_KEYWORD, NORID}, {"__imag__", IMAGPART, NORID}, {"__real__", REALPART, NORID}, {"__const__", TYPE_QUAL, RID_CONST}, {"__label__", LABEL, NORID}, {"__inline__", SCSPEC, RID_INLINE}, {"__typeof__", TYPEOF, NORID}, {"__signed__", TYPESPEC, RID_SIGNED}, {"__alignof__", ALIGNOF, NORID}, {"__complex__", TYPESPEC, RID_COMPLEX}, {"__iterator__", SCSPEC, RID_ITERATOR}, {"__volatile__", TYPE_QUAL, RID_VOLATILE}, {"__restrict__", TYPE_QUAL, RID_RESTRICT}, {"__attribute__", ATTRIBUTE, NORID}, {"__extension__", EXTENSION, NORID}, {"@selector", SELECTOR, NORID}, {"@defs", DEFS, NORID}, {"@class", CLASS, NORID}, {"__typeof", TYPEOF, NORID}, {"__alignof", ALIGNOF, NORID}, {"__iterator", SCSPEC, RID_ITERATOR}, {"oneway", TYPE_QUAL, RID_ONEWAY}, {"for", FOR, NORID}, {"__complex", TYPESPEC, RID_COMPLEX}, {"byref", TYPE_QUAL, RID_BYREF}, {"bycopy", TYPE_QUAL, RID_BYCOPY}, {"register", SCSPEC, RID_REGISTER}, {"long", TYPESPEC, RID_LONG}, {"@compatibility_alias", ALIAS, NORID}, {"sizeof", SIZEOF, NORID}, {"__const", TYPE_QUAL, RID_CONST}, {"out", TYPE_QUAL, RID_OUT}, {"__restrict", TYPE_QUAL, RID_RESTRICT}, {"__imag", IMAGPART, NORID}, {"volatile", TYPE_QUAL, RID_VOLATILE}, {"goto", GOTO, NORID}, {"float", TYPESPEC, RID_FLOAT}, {"typeof", TYPEOF, NORID}, {"typedef", SCSPEC, RID_TYPEDEF}, {"restrict", TYPE_QUAL, RID_RESTRICT}, {"case", CASE, NORID}, {"short", TYPESPEC, RID_SHORT}, {"struct", STRUCT, NORID}, {"@public", PUBLIC, NORID}, {"continue", CONTINUE, NORID}, {"@end", END, NORID}, {"break", BREAK, NORID}, {"double", TYPESPEC, RID_DOUBLE}, {"asm", ASM_KEYWORD, NORID}, {"enum", ENUM, NORID}, {"@protected", PROTECTED, NORID}, {"inline", SCSPEC, RID_INLINE}, {"do", DO, NORID}, {"__signed", TYPESPEC, RID_SIGNED}, {"char", TYPESPEC, RID_CHAR}, {"__asm", ASM_KEYWORD, NORID}, {"extern", SCSPEC, RID_EXTERN}, {"static", SCSPEC, RID_STATIC}, {"if", IF, NORID}, {"@implementation", IMPLEMENTATION, NORID}, {"signed", TYPESPEC, RID_SIGNED}, {"unsigned", TYPESPEC, RID_UNSIGNED}, {"const", TYPE_QUAL, RID_CONST}, {"return", RETURN, NORID}, {"union", UNION, NORID}, {"switch", SWITCH, NORID}, {"default", DEFAULT, NORID}, {"int", TYPESPEC, RID_INT}, {"inout", TYPE_QUAL, RID_INOUT}, {"void", TYPESPEC, RID_VOID}, {"id", OBJECTNAME, RID_ID}, {"in", TYPE_QUAL, RID_IN} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif static short lookup[] = { -1, -1, -1, -1, 0, 1, -1, 2, 3, 4, 5, 6, -1, 7, 8, 9, 10, 11, -184, -180, -171, -162, -158, -156, 26, 27, 28, -1, 29, 30, 31, 32, -1, 33, 34, 35, 36, -1, 37, 38, 39, 40, 41, 42, -1, 43, 44, -1, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, -1, 59, 60, 61, 62, 63, 64, 65, 66, 67, -59, -2, -62, -3, 68, 69, -64, -2, 70, 71, -1, 72, -1, 73, 74, -67, -3, -1, 75, 76, 77, 78, -1, 79, -69, -2, -1, 80, -71, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 81, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82 }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register int index = lookup[key]; if (index >= 0) { register const char *s = wordlist[index].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[index]; } else if (index < -TOTAL_KEYWORDS) { register int offset = - 1 - TOTAL_KEYWORDS - index; register struct resword *wordptr = &wordlist[TOTAL_KEYWORDS + lookup[offset]]; register struct resword *wordendptr = wordptr + -lookup[offset + 1]; while (wordptr < wordendptr) { register const char *s = wordptr->name; if (*str == *s && !strcmp (str + 1, s + 1)) return wordptr; wordptr++; } } } } return (struct resword *) 0; } gperf-3.2.1/tests/permutc2.exp0000664000000000000000000001345614776761070011722 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -m5 --ignore-case */ /* Computed positions: -k'1-2' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Test of a hash function which has to deal with permutation and case-independence. Without case-independence, the alpha_inc is 1. With case-independence, the alpha_inc is 3. */ #define TOTAL_KEYWORDS 8 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 2 #define MIN_HASH_VALUE 0 #define MAX_HASH_VALUE 7 /* maximum key range = 8, duplicates = 0 */ #ifndef GPERF_DOWNCASE #define GPERF_DOWNCASE 1 static unsigned char gperf_downcase[256] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 }; #endif #ifndef GPERF_CASE_STRCMP #define GPERF_CASE_STRCMP 1 static int gperf_case_strcmp (register const char *s1, register const char *s2) { for (;;) { unsigned char c1 = gperf_downcase[(unsigned char)*s1++]; unsigned char c2 = gperf_downcase[(unsigned char)*s2++]; if (c1 != 0 && c1 == c2) continue; return (int)c1 - (int)c2; } } #endif #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif /*ARGSUSED*/ static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 1, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 1, 0, 7, 1, 0, 3, 8, 8, 1, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 1, 0, 0, 1, 0, 2, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; (void) len; return asso_values[(unsigned char)str[1]+3] + asso_values[(unsigned char)str[0]]; } const char * in_word_set (register const char *str, register size_t len) { static const char * wordlist[] = { "{w", "az", "ay", "za", "ya", "x{", "x[", "[w" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key]; if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s)) return s; } } return (const char *) 0; } gperf-3.2.1/tests/permut3.exp0000664000000000000000000000733014776761061011552 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -m5 */ /* Computed positions: -k'1-2' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #define TOTAL_KEYWORDS 4 #define MIN_WORD_LENGTH 3 #define MAX_WORD_LENGTH 3 #define MIN_HASH_VALUE 0 #define MAX_HASH_VALUE 3 /* maximum key range = 4, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif /*ARGSUSED*/ static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 0, 1, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 }; (void) len; return asso_values[(unsigned char)str[1]+1] + asso_values[(unsigned char)str[0]]; } const char * in_word_set (register const char *str, register size_t len) { static const char * wordlist[] = { "bca", "cab", "acb", "abc" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key]; if (*str == *s && !strcmp (str + 1, s + 1)) return s; } } return (const char *) 0; } gperf-3.2.1/tests/jstest2.gperf0000664000000000000000000000351413074402054012040 struct js_keyword { char * name; int token; } %% abstract, 1 boolean, 2 break, 3 byte, 4 case, 5 catch, 6 char, 7 class, 8 const, 9 continue, 10 default, 11 do, 12 double, 13 else, 14 extends, 15 false, 16 final, 17 finally, 18 float, 19 for, 20 function, 21 goto, 22 if, 23 implements, 24 import, 25 in, 26 instanceof, 27 int, 28 interface, 29 long, 30 native, 31 new, 32 null, 33 package, 34 private, 35 protected, 36 public, 37 return, 38 short, 39 static, 40 super, 41 switch, 42 synchronized, 43 this, 44 throw, 45 throws, 46 transient, 47 true, 48 try, 49 var, 50 void, 51 while, 52 with, 53 %% #include #include static const char* testdata[] = { "bogus", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "var", "void", "while", "with" }; int main () { int i; for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++) { #ifdef CPLUSPLUS_TEST const struct js_keyword * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i])); #else const struct js_keyword * resword = in_word_set(testdata[i],strlen(testdata[i])); #endif if (i > 0) { if (!resword) exit (1); if (strcmp(testdata[i],resword->name)) exit (1); } else { if (resword) exit (1); } } return 0; } gperf-3.2.1/tests/jstest1.gperf0000664000000000000000000000305413074402054012036 abstract boolean break byte case catch char class const continue default do double else extends false final finally float for function goto if implements import in instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient true try var void while with %% #include #include static const char* testdata[] = { "bogus", "abstract", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "extends", "false", "final", "finally", "float", "for", "function", "goto", "if", "implements", "import", "in", "instanceof", "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return", "short", "static", "super", "switch", "synchronized", "this", "throw", "throws", "transient", "true", "try", "var", "void", "while", "with" }; int main () { int i; for (i = 0; i < sizeof(testdata)/sizeof(testdata[0]); i++) { #ifdef CPLUSPLUS_TEST const char * resword = Perfect_Hash::in_word_set(testdata[i],strlen(testdata[i])); #else const char * resword = in_word_set(testdata[i],strlen(testdata[i])); #endif if (i > 0) { if (!resword) exit (1); if (strcmp(testdata[i],resword)) exit (1); } else { if (resword) exit (1); } } return 0; } gperf-3.2.1/tests/permutc2.gperf0000664000000000000000000000033413074402054012200 %{ /* Test of a hash function which has to deal with permutation and case-independence. Without case-independence, the alpha_inc is 1. With case-independence, the alpha_inc is 3. */ %} %% az za ay ya x{ x[ {w [w gperf-3.2.1/tests/c++.gperf0000664000000000000000000000046013074402054011007 asm auto break case catch char class const continue default delete do double else enum extern float for friend goto if inline int long new operator overload private protected public register return short signed sizeof static struct switch template this typedef union unsigned virtual void volatile while gperf-3.2.1/tests/incomplete.exp0000664000000000000000000001131314776761023012304 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -t */ /* Computed positions: -k'1,3' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif struct month; #define TOTAL_KEYWORDS 12 #define MIN_WORD_LENGTH 3 #define MAX_WORD_LENGTH 9 #define MIN_HASH_VALUE 3 #define MAX_HASH_VALUE 18 /* maximum key range = 16, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 5, 5, 5, 0, 19, 5, 0, 19, 19, 0, 19, 10, 0, 0, 5, 0, 19, 0, 0, 0, 19, 0, 19, 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 }; return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]]; } struct month * in_word_set (register const char *str, register size_t len) { #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static struct month wordlist[] = { {""}, {""}, {""}, {"may", 5, 31, 31}, {"june", 6, 30, 30}, {"march", 3, 31, 31}, {""}, {"january", 1, 31, 31}, {"november", 11, 30, 30}, {"september", 9, 30, 30}, {"april", 4, 30, 30}, {"august", 8, 31, 31}, {"october", 10, 31, 31}, {"december", 12, 31, 31}, {"july", 7, 31, 31}, {""}, {""}, {""}, {"february", 2, 28, 29} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct month *) 0; } gperf-3.2.1/tests/charsets.exp0000664000000000000000000016716314776761006012001 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -C -E -G -I -t */ /* Computed positions: -k'1-11,22,$' */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif /* Generated from IANA charset data from https://www.iana.org/assignments/character-sets by charsets.awk */ /* last updated 2002-06-14 */ /* process with: gperf -CDEGTlot -H charset_hash -K name -L ANSI-C -N charset_entry */ struct charset { const char *name; /* name or alias */ int mib; /* MIBenum for name, -1 * MIBenum for alias */ }; #include enum { TOTAL_KEYWORDS = 790, MIN_WORD_LENGTH = 2, MAX_WORD_LENGTH = 45, MIN_HASH_VALUE = 29, MAX_HASH_VALUE = 5045 }; /* maximum key range = 5017, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static const unsigned short asso_values[] = { 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 0, 5046, 5046, 5046, 0, 930, 70, 90, 20, 15, 500, 40, 5, 0, 120, 85, 300, 906, 1334, 140, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 515, 0, 190, 210, 15, 175, 15, 415, 330, 775, 0, 70, 795, 155, 10, 545, 0, 750, 205, 5, 75, 5, 510, 963, 745, 845, 15, 80, 0, 0, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046, 5046 }; register unsigned int hval = len; switch (hval) { default: hval += asso_values[(unsigned char)str[21]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 21: case 20: case 19: case 18: case 17: case 16: case 15: case 14: case 13: case 12: case 11: hval += asso_values[(unsigned char)str[10]+1]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 10: hval += asso_values[(unsigned char)str[9]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 9: hval += asso_values[(unsigned char)str[8]+1]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 8: hval += asso_values[(unsigned char)str[7]+3]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]+1]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval + asso_values[(unsigned char)str[len - 1]]; } #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmissing-field-initializers" #endif static const struct charset wordlist[] = { {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-25", -46}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-2", -30}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"mnem", 2081}, {""}, {""}, {""}, {"es2", 61}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-21", -24}, {""}, {""}, {""}, {""}, {"iso-ir-15", -22}, {"iso-ir-146", -89}, {""}, {""}, {""}, {""}, {"iso-ir-155", -96}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-152", -93}, {""}, {""}, {""}, {"iso-ir-11", -21}, {"iso-ir-142", -14}, {""}, {"es", 23}, {"855", -2046}, {""}, {"iso-ir-151", -92}, {""}, {""}, {""}, {"iso-ir-14", -42}, {"iso-ir-141", -87}, {""}, {""}, {""}, {"iso-ir-55", -55}, {"iso-ir-102", -75}, {""}, {""}, {""}, {""}, {"iso-ir-111", -77}, {"ibm866", 2086}, {""}, {"852", -2010}, {"t.61", -76}, {"iso-ir-101", -5}, {""}, {""}, {""}, {"iso646-fi", -35}, {""}, {"ibm865", 2052}, {""}, {"851", -2045}, {""}, {""}, {"ibm855", 2046}, {""}, {""}, {"iso646-fr", -26}, {""}, {""}, {""}, {""}, {"iso-ir-51", -53}, {"iso-ir-154", -95}, {"ibm285", 2038}, {""}, {""}, {""}, {"iso-ir-144", -8}, {"ibm862", 2013}, {""}, {""}, {"iso-ir-54", -54}, {""}, {"ibm852", 2010}, {"js", -87}, {""}, {"inis", 51}, {""}, {"ibm861", 2049}, {"ibm1026", 2063}, {""}, {""}, {""}, {"ibm851", 2045}, {"l5", -12}, {""}, {"iso-ir-95", -71}, {""}, {"ibm424", 2043}, {""}, {""}, {"iso-ir-10", -35}, {"iso646-fr1", -46}, {"ibm281", 2036}, {""}, {""}, {""}, {""}, {"ibm275", 2032}, {""}, {"iso-ir-4", -20}, {"iso-ir-16", -43}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"l1", -4}, {""}, {"iso-ir-91", -67}, {""}, {"ibm864", 2051}, {""}, {""}, {""}, {""}, {""}, {"l4", -7}, {""}, {"iso-ir-94", -70}, {""}, {""}, {""}, {"866", -2086}, {""}, {""}, {"ibm284", 2037}, {""}, {""}, {"iso-ir-50", -52}, {"ascii", -3}, {""}, {""}, {"865", -2052}, {""}, {""}, {""}, {""}, {"ibm01142", 2093}, {"iso-ir-37", -48}, {""}, {""}, {""}, {""}, {"iso-ir-27", -47}, {"iso-ir-158", -97}, {""}, {""}, {""}, {""}, {"iso-ir-148", -12}, {""}, {""}, {"862", -2013}, {""}, {"iso-ir-150", -91}, {""}, {""}, {""}, {""}, {""}, {"ibm274", 2031}, {""}, {"861", -2049}, {""}, {""}, {"inis-8", 52}, {""}, {"mac", -2027}, {""}, {"iso-ir-110", -7}, {""}, {""}, {""}, {""}, {"iso-ir-100", -4}, {""}, {""}, {"ibm01141", 2092}, {"iso-ir-17", -23}, {""}, {"ibm420", 2041}, {""}, {"850", -2009}, {"iso-ir-90", 66}, {"iso-ir-138", -11}, {""}, {""}, {""}, {""}, {""}, {"ibm871", 2056}, {"l6", -13}, {""}, {"iso-ir-96", -72}, {""}, {"ibm775", 2087}, {""}, {""}, {""}, {""}, {"ibm868", 2053}, {""}, {""}, {""}, {""}, {""}, {""}, {"ibm01145", 2096}, {""}, {""}, {"ibm860", 2048}, {""}, {""}, {""}, {"iso-ir-157", -13}, {"ibm850", 2009}, {""}, {""}, {""}, {"iso-ir-147", -90}, {"ibm500", 2044}, {"csascii", -3}, {""}, {"iso-ir-57", -56}, {"cp866", -2086}, {"ibm280", 2035}, {""}, {""}, {"csiso51iniscyrillic", -53}, {""}, {""}, {""}, {"iso-ir-6", -3}, {""}, {"cp865", -2052}, {""}, {""}, {"437", -2011}, {"ebcdic-fr", 2071}, {"cp855", -2046}, {""}, {""}, {"857", -2047}, {""}, {""}, {""}, {""}, {""}, {""}, {"cp285", -2038}, {"ibm278", 2034}, {"ebcdic-fi-se", 2069}, {""}, {"ebcdic-br", -2032}, {"cp862", -2013}, {""}, {""}, {""}, {"iso-ir-47", -50}, {"cp852", -2010}, {""}, {""}, {""}, {"iso646-gb", -20}, {"cp861", -2049}, {"cp1026", -2063}, {"tis-620", 2259}, {""}, {"iso-ir-61", -58}, {"cp851", -2045}, {""}, {"csiso5427cyrillic", -48}, {""}, {""}, {"cp424", -2043}, {"ibm857", 2047}, {""}, {"ibm01144", 2095}, {"iso-10646", -1003}, {"cp281", -2036}, {"csa7-2", -79}, {""}, {""}, {""}, {"cp275", -2032}, {""}, {""}, {""}, {""}, {"cp-is", -2049}, {"csa7-1", -78}, {""}, {""}, {""}, {""}, {"ibm880", 2057}, {""}, {""}, {""}, {""}, {""}, {""}, {"860", -2048}, {""}, {"cp864", -2051}, {""}, {"r8", -2004}, {"csibm861", -2049}, {""}, {""}, {""}, {"cp01146", -2097}, {"csibm851", -2045}, {""}, {""}, {""}, {""}, {"904", -2060}, {""}, {"cp284", -2037}, {"ibm277", 2033}, {"cp01145", -2096}, {"csibm281", -2036}, {""}, {"ebcdic-int", -2029}, {""}, {""}, {""}, {""}, {""}, {"ibm870", 2055}, {"ca", -78}, {""}, {""}, {""}, {""}, {""}, {"csibm865", -2052}, {""}, {"cp-ar", -2053}, {""}, {"cp01142", -2093}, {"csibm855", -2046}, {"iso-ir-60", -25}, {"csiso58gb231280", -57}, {"ibm905", 2061}, {""}, {""}, {""}, {""}, {""}, {"cp01141", -2092}, {"csibm285", -2038}, {""}, {"cp274", -2031}, {""}, {""}, {""}, {"iso-ir-18", -44}, {""}, {""}, {"csiso50inis8", -52}, {""}, {""}, {"csiso143iecp271", -88}, {""}, {""}, {""}, {""}, {""}, {"ibm891", 2058}, {""}, {""}, {""}, {"cp420", -2041}, {""}, {""}, {"csibm424", -2043}, {""}, {""}, {""}, {""}, {""}, {""}, {"cp871", -2056}, {""}, {""}, {"csibm275", -2032}, {""}, {"cp775", -2087}, {""}, {"cp01144", -2095}, {""}, {""}, {"cp868", -2053}, {""}, {""}, {""}, {"csibm1026", -2063}, {""}, {""}, {"fi", -35}, {""}, {"iso-ir-58", -57}, {"cp860", -2048}, {""}, {""}, {"csibm864", -2051}, {""}, {"cp850", -2009}, {""}, {"fr", -26}, {""}, {""}, {"cp500", -2044}, {"ibm904", 2060}, {"csiso14jisc6220ro", -42}, {"ibm01146", 2097}, {""}, {"cp280", -2035}, {""}, {"se", -35}, {"csibm284", -2037}, {""}, {""}, {""}, {""}, {"csibm871", -2056}, {"ebcdic-fi-se-a", 2070}, {""}, {""}, {"it", 22}, {""}, {""}, {""}, {"ibm918", 2062}, {""}, {"se2", -21}, {""}, {""}, {"ibm290", 2039}, {""}, {"jp-ocr-b", -68}, {""}, {"cp278", -2034}, {""}, {"csiso122canadian2", -79}, {""}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-latin9--euro", -2090}, {""}, {""}, {"l8", -110}, {"csibm274", -2031}, {"iso-ir-98", -73}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso27latingreek1", -47}, {""}, {"cp857", -2047}, {""}, {"gb", -20}, {""}, {""}, {"iso-ir-126", -10}, {""}, {"cn", -56}, {"t.101-g2", 83}, {""}, {"cp-gr", -2054}, {""}, {"cp01148", -2099}, {""}, {""}, {"csiso87jisx0208", -63}, {""}, {"csiso121canadian1", -78}, {""}, {""}, {"cp880", -2057}, {"csbig5", -2026}, {"cp01140", -2091}, {""}, {""}, {""}, {""}, {"csiso90", -66}, {""}, {"csiso42jisc62261978", -49}, {""}, {"ibm297", 2040}, {""}, {""}, {""}, {"iso-ir-122", -79}, {""}, {"us", -3}, {""}, {""}, {""}, {""}, {""}, {"ecma-114", -9}, {"iso-ir-13", -41}, {"iso-ir-121", -78}, {""}, {""}, {""}, {""}, {"ccsid01146", -2097}, {""}, {"de", -24}, {""}, {""}, {"cp870", -2055}, {""}, {""}, {""}, {""}, {"ccsid01145", -2096}, {"csmnem", -2081}, {""}, {""}, {""}, {""}, {""}, {"csiso123csaz24341985gr", -80}, {"dec", -2008}, {"big5", 2026}, {"cp905", -2061}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csibm866", -2086}, {""}, {"ccsid01142", -2093}, {""}, {"cp01147", -2098}, {""}, {""}, {""}, {""}, {""}, {"ibm01149", 2100}, {"iso646-pt", -43}, {"ccsid01141", -2092}, {""}, {""}, {""}, {""}, {"cp891", -2058}, {""}, {""}, {""}, {"iso-ir-42", -49}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-159", -98}, {""}, {""}, {""}, {""}, {"iso-ir-149", -36}, {""}, {"cp00858", -2089}, {"jp-ocr-a", -67}, {""}, {"iso646-pt2", -60}, {""}, {"l2", -5}, {""}, {"iso-ir-92", -68}, {""}, {""}, {""}, {""}, {"iso646-kr", -102}, {"iso-ir-109", -6}, {"csiso49inis", -51}, {""}, {""}, {""}, {"ccsid01144", -2095}, {""}, {"chinese", -57}, {"ibm00924", 2090}, {"ebcdic-be", -2031}, {""}, {""}, {""}, {"csibm891", -2058}, {""}, {"cp904", -2060}, {""}, {"l3", -6}, {""}, {"iso-ir-93", -69}, {"iso-ir-139", -86}, {"arabic", -9}, {""}, {"ibm01143", 2094}, {""}, {""}, {"csucs4", -1001}, {""}, {""}, {""}, {"iso646-ca2", -79}, {""}, {""}, {"ebcdic-is-871+euro", -2100}, {""}, {"cp918", -2062}, {"ibm869", 2054}, {""}, {"csiso150", -91}, {""}, {"cp290", -2039}, {""}, {""}, {""}, {"iso646-it", -22}, {""}, {""}, {""}, {"csibm905", -2061}, {""}, {"iso-ir-128", -83}, {""}, {"ebcdic-dk-no", 2067}, {""}, {""}, {""}, {"ibm819", -4}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso2033", -73}, {"csiso103t618bit", -76}, {""}, {""}, {""}, {""}, {"csiso102t617bit", -75}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ibm367", -3}, {""}, {"csibm869", -2054}, {""}, {"ccsid01148", -2099}, {""}, {""}, {""}, {""}, {"cp297", -2040}, {""}, {""}, {""}, {""}, {"ccsid01140", -2091}, {""}, {"dec-mcs", 2008}, {""}, {""}, {""}, {"ibm038", 2029}, {""}, {"ibm01140", 2091}, {"iso5427cyrillic1981", -54}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-127", -9}, {""}, {"cp00924", -2090}, {"csibm423", -2042}, {""}, {""}, {""}, {""}, {"869", -2054}, {"ebcdic-jp-kana", -2039}, {""}, {"ibm437", 2011}, {""}, {""}, {"iso646-de", -24}, {""}, {""}, {"jis_c6220-1969-ro", 42}, {""}, {""}, {"ms936", -113}, {""}, {""}, {"ebcdic-fi-278+euro", -2094}, {""}, {""}, {""}, {""}, {"ebcdic-fr-297+euro", -2098}, {""}, {""}, {""}, {""}, {"csibm863", -2050}, {"ebcdic-pt", 2073}, {"ebcdic-cyrillic", -2057}, {""}, {""}, {"ebcdic-gb-285+euro", -2097}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-international-500+euro", -2099}, {"ccsid01147", -2098}, {""}, {""}, {"cyrillic", -8}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ibm037", 2028}, {""}, {""}, {""}, {"iso646-es2", -61}, {"unicode-1-1", 1010}, {"ebcdic-cp-no", -2033}, {""}, {"iso646-ca", -78}, {""}, {""}, {"csiso6937add", -93}, {""}, {""}, {""}, {""}, {""}, {"inis-cyrillic", 53}, {""}, {""}, {""}, {"ebcdic-cp-he", -2043}, {"csibm273", -2030}, {""}, {""}, {""}, {"ebcdic-cp-se", -2034}, {""}, {""}, {""}, {"ebcdic-jp-e", -2036}, {""}, {"csibm420", -2041}, {""}, {""}, {""}, {"ebcdic-cp-be", -2044}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso646-es", -23}, {"cp869", -2054}, {""}, {""}, {""}, {"ebcdic-it", 2072}, {"csmnemonic", -2080}, {"gb2312", 2025}, {"cskoi8r", -2084}, {""}, {""}, {""}, {"latin6", -13}, {""}, {"csibm860", -2048}, {"ebcdic-dk-no-a", 2068}, {""}, {""}, {"arabic7", -65}, {""}, {""}, {"cp819", -4}, {"latin5", -12}, {""}, {"csibm500", -2044}, {""}, {"x0212", -98}, {""}, {""}, {"csibm280", -2035}, {""}, {"csebcdicit", -2072}, {""}, {"ebcdic-cp-it", -2035}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"latin2", -5}, {""}, {""}, {"e13b", -73}, {"csiso91jisc62291984a", -67}, {""}, {""}, {"us-ascii", -3}, {"csiso153gost1976874", -94}, {"ebcdic-cp-roece", -2055}, {"latin1", -4}, {"ebcdic-at-de", 2064}, {""}, {""}, {"cp367", -3}, {"csiso18greek7old", -44}, {""}, {""}, {""}, {"csiso92jisc62991984b", -68}, {""}, {"unicode-1-1-utf-7", 103}, {"csiso88greek7", -64}, {""}, {""}, {"ds2089", -99}, {""}, {""}, {"iso646-us", -3}, {""}, {""}, {""}, {""}, {""}, {"cp038", -2029}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso25french", -46}, {""}, {"dk-us", 101}, {""}, {"cp01149", -2100}, {""}, {"jis_c6226-1978", 49}, {""}, {"latin4", -7}, {""}, {""}, {"nats-sefi", 31}, {"cp437", -2011}, {""}, {"csiso2022jp2", -40}, {"csibm880", -2057}, {"iso646-no", -25}, {""}, {""}, {"ebcdic-cp-is", -2056}, {""}, {"iso646-cn", -56}, {"x0201", -15}, {""}, {""}, {"mnemonic", 2080}, {"iso646-jp", -42}, {"csiso70videotexsupp1", -59}, {""}, {"ebcdic-cp-nl", -2028}, {""}, {""}, {"cp936", -113}, {""}, {"jp", -42}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-70", -59}, {""}, {""}, {""}, {"csksc5636", -102}, {"iso646-no2", -58}, {""}, {""}, {"csibm870", -2055}, {""}, {"iso-celtic", -110}, {""}, {""}, {""}, {""}, {"csiso95jis62291984handadd", -71}, {""}, {""}, {""}, {""}, {"cp037", -2028}, {""}, {""}, {""}, {""}, {"iso-ir-153", -94}, {""}, {"csiso151cuba", -92}, {""}, {""}, {"iso-ir-143", -88}, {""}, {""}, {""}, {"t.61-8bit", 76}, {""}, {""}, {""}, {""}, {""}, {"csebcdicpt", -2073}, {""}, {""}, {""}, {""}, {"iso-ir-103", -76}, {""}, {"csiso94jis62291984hand", -70}, {""}, {""}, {""}, {"ibm423", 2042}, {""}, {""}, {""}, {""}, {"latin8", -110}, {""}, {"ebcdic-cp-ar2", -2062}, {""}, {"iso-2022-cn-ext", 105}, {""}, {""}, {"ebcdic-cp-ar1", -2041}, {"ebcdic-es", 2074}, {"csibmebcdicatde", -2064}, {""}, {""}, {""}, {"t.61-7bit", 75}, {""}, {"ebcdic-es-s", 2076}, {""}, {""}, {""}, {"csiso146serbian", -89}, {""}, {""}, {""}, {"jis_c6220-1969", -41}, {""}, {"ibm863", 2050}, {""}, {""}, {""}, {"iso-ir-9-2", -34}, {""}, {""}, {"csgb2312", -2025}, {""}, {""}, {""}, {"dk", -99}, {""}, {"viscii", 2082}, {"iso-ir-9-1", -33}, {""}, {""}, {""}, {""}, {""}, {"ibm-symbols", 2015}, {""}, {"csibm903", -2059}, {"ebcdic-at-de-a", 2065}, {""}, {""}, {"ebcdic-us-37+euro", -2091}, {""}, {""}, {"x0208", -63}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csibm290", -2039}, {""}, {""}, {""}, {""}, {"ibm-thai", 2016}, {""}, {""}, {""}, {"csiso646basic1983", -28}, {""}, {""}, {""}, {"ibm273", 2030}, {""}, {""}, {"ebcdic-us", 2078}, {"csiso159jisx02121990", -98}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-10646-j-1", 0}, {""}, {"csiso111ecmacyrillic", -77}, {""}, {""}, {""}, {""}, {""}, {"cesu-8", 1016}, {"csibmsymbols", -2015}, {"ecma-cyrillic", 77}, {""}, {"csnatsdano", -33}, {""}, {"ebcdic-cp-fi", -2034}, {""}, {""}, {"csebcdicfr", -2071}, {""}, {"ebcdic-cp-fr", -2040}, {""}, {"csviqr", -2083}, {"ccsid01149", -2100}, {""}, {"ebcdic-ca-fr", 2066}, {"863", -2050}, {""}, {""}, {""}, {"csebcdicfise", -2069}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gb18030", 114}, {""}, {"ibm01147", 2098}, {""}, {""}, {"ebcdic-cp-ca", -2028}, {""}, {""}, {"iso646-jp-ocr-b", -68}, {"csviscii", -2082}, {"x0201-7", -41}, {"ebcdic-dk-277+euro", -2093}, {""}, {"microsoft-publishing", 2023}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"asmo_449", 65}, {""}, {""}, {""}, {"viqr", 2083}, {"ref", -28}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-6", -9}, {""}, {""}, {""}, {""}, {"iso-ir-19", -45}, {""}, {"pt", 43}, {""}, {"ns_4551-1", 25}, {"iso-8859-5", -8}, {""}, {""}, {"csiso69french", -26}, {"csibmthai", -2016}, {""}, {""}, {""}, {""}, {""}, {"cp423", -2042}, {""}, {""}, {"csebcdicatdea", -2065}, {""}, {""}, {"iso-8859-15", 111}, {""}, {""}, {""}, {"iso-8859-2", -5}, {""}, {""}, {"pt2", 60}, {""}, {""}, {"csdecmcs", -2008}, {"no", -25}, {""}, {""}, {"iso-8859-1", -4}, {""}, {""}, {""}, {"csibbm904", -2060}, {""}, {""}, {""}, {"iso_646.basic:1983", 28}, {""}, {"cp863", -2050}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso10367box", -96}, {""}, {""}, {""}, {""}, {""}, {"shift_jis", 17}, {""}, {"iso-8859-14", 110}, {"ksc5636", 102}, {"no2", -58}, {"csiso57gb1988", -56}, {""}, {""}, {""}, {""}, {"iso646-dk", -99}, {""}, {""}, {"csiso88596i", -82}, {""}, {""}, {"iso-8859-4", -7}, {""}, {""}, {""}, {""}, {"iso-ir-49", -51}, {""}, {""}, {"iso-10646-ucs-2", 1000}, {"scsu", 1011}, {"ccsid00924", -2090}, {""}, {"iso-10646-ucs-basic", 1002}, {"iso-10646-utf-1", 27}, {""}, {""}, {""}, {"ebcdic-cp-es", -2037}, {"iso-ir-85", -61}, {""}, {"cp273", -2030}, {""}, {"iso-10646-unicode-latin1", 1003}, {"iso-2022-jp-2", 40}, {"csibm857", -2047}, {"iso-ir-99", -74}, {""}, {""}, {""}, {"csiso4unitedkingdom", -20}, {""}, {""}, {"cseuckr", -38}, {"iso-10646-ucs-4", 1001}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-cp-tr", -2061}, {""}, {""}, {"hz-gb-2312", 2085}, {""}, {""}, {"csebcdicfisea", -2070}, {""}, {""}, {"iso-8859-10", 13}, {""}, {"nats-sefi-add", 32}, {""}, {""}, {""}, {"cp01143", -2094}, {"iso-ir-84", -60}, {""}, {""}, {"iso-8859-16", 112}, {""}, {""}, {""}, {""}, {"greek8", -10}, {""}, {""}, {"csibm277", -2033}, {""}, {""}, {""}, {"csisotextcomm", -14}, {"jis_c6226-1983", 63}, {""}, {""}, {""}, {"ebcdic-it-280+euro", -2095}, {""}, {""}, {"ibm903", 2059}, {"csiso88598i", -85}, {""}, {""}, {"csebcdices", -2074}, {"ebcdic-es-a", 2075}, {""}, {""}, {"csiso646danish", -99}, {"iso-8859-8", -11}, {"csebcdicess", -2076}, {""}, {""}, {""}, {""}, {"iso_646.irv:1991", -3}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso646-se", -35}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-cp-yu", -2055}, {""}, {""}, {""}, {"utf-16", 1015}, {"uk", -20}, {"iso646-se2", -21}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-86", -62}, {""}, {""}, {"greek7", 64}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso96jisc62291984kana", -72}, {""}, {""}, {""}, {"csiso16portuguese", -43}, {""}, {""}, {"yu", -87}, {""}, {"ds_2089", 99}, {"ksc_5601", -36}, {""}, {""}, {""}, {""}, {"ebcdic-de-273+euro", -2092}, {""}, {"iso-8859-7", -10}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso10646utf1", -27}, {""}, {""}, {""}, {""}, {"csiso19latingreek", -45}, {""}, {""}, {"csiso47bsviewdata", -50}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso139csn369103", -86}, {""}, {""}, {"iso-ir-69", -26}, {""}, {"iso646-yu", -87}, {""}, {""}, {"csshiftjis", -17}, {""}, {""}, {"ebcdic-es-284+euro", -2096}, {""}, {""}, {""}, {"csiso141jusib1002", -87}, {""}, {""}, {""}, {""}, {"csiso93jis62291984badd", -69}, {""}, {"csiso15italian", -22}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-87", -63}, {""}, {"iso-ir-123", -80}, {""}, {"csebcdiccafr", -2066}, {""}, {""}, {""}, {"iso-ir-199", -110}, {"jis_c6220-1969-jp", 41}, {""}, {""}, {""}, {""}, {"cuba", -92}, {"csiso85spanish2", -61}, {""}, {""}, {""}, {"bs_4730", 20}, {""}, {""}, {""}, {""}, {""}, {"csnatsdanoadd", -34}, {""}, {""}, {""}, {""}, {""}, {"csibm297", -2040}, {""}, {"csiso2022kr", -37}, {""}, {"csiso84portuguese2", -60}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ccsid01143", -2094}, {""}, {""}, {""}, {""}, {"utf-8", 106}, {""}, {""}, {""}, {"iso_5427", 48}, {"cp903", -2059}, {""}, {""}, {""}, {""}, {"csiso2intlrefversion", -30}, {""}, {"ibm01148", 2099}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-2022-cn", 104}, {"jp-ocr-b-add", -69}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"koi8-r", 2084}, {"ebcdic-cp-gr", -2042}, {""}, {""}, {""}, {""}, {""}, {"cspcp852", -2010}, {""}, {""}, {"csdkus", -101}, {""}, {""}, {"csiso5428greek", -55}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"jis_encoding", 16}, {""}, {""}, {""}, {""}, {"csebcdicdkno", -2067}, {""}, {""}, {""}, {"roman8", -2004}, {"ebcdic-cp-dk", -2033}, {""}, {""}, {"utf-7", 1012}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso88596e", -81}, {""}, {""}, {"extended_unix_code_packed_format_for_japanese", 18}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-no-277+euro", -2093}, {""}, {""}, {""}, {"csiso13jisc6220jp", -41}, {""}, {""}, {""}, {""}, {"ebcdic-cp-wt", -2028}, {"iso_9036", -65}, {""}, {""}, {""}, {"ibm00858", 2089}, {"csiso21german", -24}, {""}, {"greek7-old", 44}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso89asmo449", -65}, {""}, {""}, {""}, {"iso-ir-88", -64}, {""}, {""}, {"csiso2022jp", -39}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ns_4551-2", 58}, {""}, {"csebcdicesa", -2075}, {"csibm868", -2053}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-6", -9}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso88598e", -84}, {""}, {"hp-roman8", 2004}, {"iso_8859-5", -8}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-15", -111}, {"csibm278", -2034}, {""}, {"euc-kr", 38}, {"iso_8859-2", -5}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-1", -4}, {"csisolatin5", -12}, {"ebcdic-cp-ch", -2044}, {""}, {""}, {""}, {"iso-8859-13", 109}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hp-legal", 2017}, {""}, {""}, {"iso_8859-10:1992", -13}, {""}, {"csiso150greekccitt", -91}, {""}, {""}, {"iso_8859-14", -110}, {"asmo-708", -9}, {""}, {""}, {""}, {"csisolatin1", -4}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-cp-gb", -2038}, {""}, {""}, {"iso_8859-4", -7}, {"csisolatin4", -7}, {"ecma-118", -10}, {""}, {"csunicode", -1000}, {"iso-8859-9", -12}, {""}, {""}, {"csebcdicdknoa", -2068}, {"csibm037", -2028}, {""}, {"csunicodeibm1276", -1007}, {""}, {"lap", -97}, {"cseucfixwidjapanese", -19}, {""}, {"csunicodeibm1265", -1009}, {"sen_850200_c", 21}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"jis_c6229-1984-hand", 70}, {"jis_c6229-1984-b-add", 69}, {""}, {""}, {""}, {""}, {"csunicodeibm1261", -1005}, {""}, {""}, {""}, {"latin1-2-5", -95}, {"iso_8859-14:1998", -110}, {"jis_c6229-1984-a", 67}, {""}, {""}, {"jis_c6229-1984-kana", 72}, {""}, {""}, {""}, {""}, {""}, {"csunicode11", -1010}, {""}, {""}, {""}, {"ebcdic-cp-us", -2028}, {"csunicodeibm1264", -1008}, {""}, {""}, {""}, {""}, {""}, {"jis_c6229-1984-b", 68}, {""}, {""}, {"cshproman8", -2004}, {"iso_646.irv:1983", 30}, {""}, {""}, {""}, {""}, {"latin3", -6}, {""}, {"csa_z243.4-1985-gr", 80}, {""}, {""}, {""}, {""}, {""}, {""}, {"gb_1988-80", 56}, {"csisolatin6", -13}, {"csa_z243.4-1985-2", 79}, {"cspc862latinhebrew", -2013}, {""}, {""}, {""}, {"csa_z243.4-1985-1", 78}, {"gbk", 113}, {""}, {""}, {""}, {"iso646-cu", -92}, {""}, {""}, {"iso_8859-8", -11}, {"iso-2022-kr", 37}, {""}, {"cspc775baltic", -2087}, {""}, {""}, {"csunicodeibm1268", -1006}, {"csiso61norwegian2", -58}, {""}, {""}, {""}, {""}, {""}, {"csiso99naplps", -74}, {""}, {""}, {""}, {""}, {""}, {"iec_p27-1", 88}, {""}, {""}, {""}, {""}, {""}, {""}, {"utf-32", 1017}, {""}, {"csebcdicus", -2078}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csibm918", -2062}, {""}, {""}, {"gb_2312-80", 57}, {""}, {"serbian", -89}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"irv", -30}, {"csunicode11utf7", -103}, {""}, {""}, {"csisolatincyrillic", -8}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-7", -10}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csnatssefi", -31}, {""}, {"csiso60norwegian1", -25}, {""}, {""}, {"greek", -10}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ebcdic-uk", 2077}, {""}, {"csisolatinarabic", -9}, {""}, {"csiso128t101g2", -83}, {"csunicodeascii", -1002}, {""}, {"jp-ocr-hand", -70}, {""}, {""}, {""}, {"jp-ocr-hand-add", -71}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"jis_c6229-1984-hand-add", 71}, {""}, {""}, {"cscesu-8", -1016}, {""}, {""}, {""}, {""}, {"sen_850200_b", 35}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"invariant", 29}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-2022-jp", 39}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cswindows31latin5", -2003}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cswindows31latin2", -2002}, {""}, {""}, {""}, {""}, {"cswindows31latin1", -2001}, {""}, {""}, {""}, {""}, {"cswindows30latin1", -2000}, {""}, {""}, {""}, {"ebcdic-se-278+euro", -2094}, {""}, {""}, {"ccsid00858", -2089}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso11swedishfornames", -21}, {""}, {""}, {""}, {""}, {"cspc8danishnorwegian", -2012}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nats-dano", 33}, {""}, {""}, {"cswindows31j", -2024}, {"nf_z_62-010_(1973)", 46}, {""}, {"hp-pi-font", 2018}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ansi_x3.4-1986", -3}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-6-i", -82}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-6-e", -81}, {""}, {"latin-lap", 97}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"jis_x0201", 15}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csunicodelatin1", -1003}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-2-windows-latin-2", 2002}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hu", -62}, {"nf_z_62-010", 26}, {""}, {""}, {""}, {""}, {""}, {"csibm038", -2029}, {""}, {""}, {"iso-8859-3", -6}, {"greek-ccitt", 91}, {""}, {""}, {"ansi_x3.4-1968", 3}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-1-windows-3.1-latin-1", 2001}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-8859-8-i", -85}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"us-dk", 100}, {""}, {"elot_928", -10}, {""}, {""}, {""}, {""}, {"iso-8859-8-e", -84}, {"ms_kanji", -17}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"pc-multilingual-850+euro", -2089}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-8-2", -32}, {"msz_7795.3", 62}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso646-hu", -62}, {""}, {"iso-ir-8-1", -31}, {""}, {"csisolatin2", -5}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"jis_x0212-1990", 98}, {"iso-8859-1-windows-3.0-latin-1", 2000}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csisolatin3", -6}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"adobe-symbol-encoding", 2020}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"latin-greek-1", 47}, {""}, {"iso_8859-9", -12}, {"csusdk", -100}, {""}, {""}, {""}, {""}, {""}, {"csiso17spanish", -23}, {""}, {""}, {""}, {""}, {""}, {"iso_10367-box", 96}, {""}, {""}, {""}, {""}, {""}, {"cshplegal", -2017}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"utf-16le", 1014}, {""}, {""}, {""}, {""}, {"csnatssefiadd", -32}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"macedonian", -90}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"din_66003", 24}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso60danishnorwegian", -25}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"utf-16be", 1013}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csjisencoding", -16}, {""}, {""}, {""}, {""}, {""}, {"csksc56011987", -36}, {""}, {""}, {"windows-1256", 2256}, {""}, {""}, {""}, {""}, {"windows-1255", 2255}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"windows-1252", 2252}, {""}, {""}, {""}, {""}, {"windows-1251", 2251}, {""}, {""}, {""}, {""}, {""}, {""}, {"ks_c_5601-1987", 36}, {""}, {"iso-8859-9-windows-latin-5", 2003}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"windows-1254", 2254}, {"extended_unix_code_fixed_width_for_japanese", 19}, {""}, {""}, {""}, {"macintosh", 2027}, {""}, {"csiso147macedonian", -90}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nats-dano-add", 34}, {""}, {""}, {""}, {""}, {""}, {"iso-ir-89", -65}, {""}, {"csisolatinhebrew", -11}, {""}, {""}, {""}, {""}, {"naplps", -74}, {""}, {""}, {"euc-jp", -18}, {""}, {""}, {"windows-1258", 2258}, {""}, {""}, {""}, {""}, {"windows-1250", 2250}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"windows-1257", 2257}, {""}, {""}, {""}, {""}, {""}, {"csunknown8bit", -2079}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso158lap", -97}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"koi8-u", 2088}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cshalfwidthkatakana", -15}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ks_c_5601-1989", -36}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-6-i", 82}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ansi_x3.110-1983", 74}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-6-e", 81}, {""}, {""}, {""}, {"cspc8codepage437", -2011}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cshppifont", -2018}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-3", -6}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-8-i", 85}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-8-e", 84}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso10swedish", -35}, {""}, {""}, {"iso-unicode-ibm-1276", 1007}, {""}, {""}, {""}, {""}, {"iso-unicode-ibm-1265", 1009}, {""}, {"cspc8turkish", -2014}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"korean", -36}, {""}, {""}, {""}, {"iso-unicode-ibm-1261", 1005}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso-unicode-ibm-1264", 1008}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"utf-32le", 1019}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hebrew", -11}, {""}, {"adobe-standard-encoding", 2005}, {""}, {"iso-unicode-ibm-1268", 1006}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cshpmath8", -2019}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csn_369103", 86}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"utf-32be", 1018}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"windows-1253", 2253}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"pc8-turkish", 2014}, {""}, {""}, {"jis_x0208-1983", -63}, {"jus_i.b1.002", 87}, {""}, {""}, {""}, {"jus_i.b1.003-mac", 90}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csmicrosoftpublishing", -2023}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso8859supp", -95}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"katakana", -41}, {""}, {""}, {""}, {""}, {""}, {""}, {"csventurainternational", -2007}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csmacintosh", -2027}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"latin-greek", 45}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csinvariant", -29}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csadobestandardencoding", -2005}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-5:1988", 8}, {""}, {""}, {""}, {""}, {""}, {"jus_i.b1.003-serb", 89}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-6:1987", 9}, {""}, {""}, {""}, {""}, {"iso_8859-4:1988", 7}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-2:1987", 5}, {""}, {""}, {""}, {""}, {"iso_8859-1:1987", 4}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-8:1988", 11}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cseucpkdfmtjapanese", -18}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-7:1987", 10}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csventuraus", -2006}, {"videotex-suppl", 59}, {"windows-31j", 2024}, {""}, {""}, {""}, {"csisolatingreek", -10}, {""}, {"hp-math8", 2019}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"bs_viewdata", 50}, {""}, {""}, {""}, {"csebcdicuk", -2077}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"big5-hkscs", 2101}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_2033-1983", 73}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cspc850multilingual", -2009}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"nc_nc00-10:81", 92}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-supp", 95}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csa_t500-1983", -74}, {""}, {""}, {""}, {""}, {"iso_8859-3:1988", 6}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_8859-9:1989", 12}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_5427:1981", 54}, {""}, {"st_sev_358-88", -94}, {""}, {""}, {""}, {""}, {"csventuramath", -2022}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"csiso86hungarian", -62}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"unknown-8bit", 2079}, {""}, {""}, {""}, {"cshpdesktop", -2021}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ventura-us", 2006}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"windows-936", -113}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ventura-international", 2007}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"gost_19768-74", 94}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_6937-2-25", 93}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_5428:1980", 55}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"iso_6937-2-add", 14}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"pc8-danish-norwegian", 2012}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"cshppsmath", -2020}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"ventura-math", 2022}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {"hp-desktop", 2021} }; #if (defined __GNUC__ && __GNUC__ + (__GNUC_MINOR__ >= 6) > 4) || (defined __clang__ && __clang_major__ >= 3) #pragma GCC diagnostic pop #endif const struct charset * in_word_set (register const char *str, register size_t len) { if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) { register const char *s = wordlist[key].name; if (*str == *s && !strcmp (str + 1, s + 1)) return &wordlist[key]; } } return (struct charset *) 0; } gperf-3.2.1/tests/lang-utf8.gperf0000664000000000000000000000166713074402054012256 struct language { const char *foreign_name; const char *english_name; const char *locale; }; %% አማርኛ, "Amharic", NULL česky, "Czech", "cs_CZ.UTF-8" Dansk, "Danish", "da_DK.UTF-8" English, "English", "en_GB.UTF-8" Suomi, "Finnish", "fi_FI.UTF-8" Français, "French", "fr_FR.UTF-8" Deutsch, "German", "de_DE.UTF-8" Ελληνικά, "Greek", "el_GR.UTF-8" עברית, "Hebrew", "he_IL.UTF-8" Italiano, "Italian", "it_IT.UTF-8" Norsk, "Norwegian", "no_NO.UTF-8" Русский, "Russian", "ru_RU.UTF-8" Español, "Spanish", "es_ES.UTF-8" Svenska, "Swedish", "sv_SE.UTF-8" ภาษาไทย, "Thai", "th_TH.UTF-8" Türkçe, "Turkish", "tr_TR.UTF-8" Tiếng Việt, "Vietnamese", "vi_VN.UTF-8" 日本語, "Japanese", "ja_JP.UTF-8" 中文, "Chinese", "zh_CN.UTF-8" 한글, "Korean", "ko_KR.UTF-8" gperf-3.2.1/tests/test-6.exp0000664000000000000000000001751113074402054011257 GNU 'gperf' generates perfect hash functions. Usage: ../src/gperf [OPTION]... [INPUT-FILE] If a long option shows an argument as mandatory, then it is mandatory for the equivalent short option also. Output file location: --output-file=FILE Write output to specified file. The results are written to standard output if no output file is specified or if it is -. Input file interpretation: -e, --delimiters=DELIMITER-LIST Allow user to provide a string containing delimiters used to separate keywords from their attributes. Default is ",". -t, --struct-type Allows the user to include a structured type declaration for generated code. Any text before %% is considered part of the type declaration. Key words and additional fields may follow this, one group of fields per line. --ignore-case Consider upper and lower case ASCII characters as equivalent. Note that locale dependent case mappings are ignored. Language for the output code: -L, --language=LANGUAGE-NAME Generates code in the specified language. Languages handled are currently C++, ANSI-C, C, and KR-C. The default is ANSI-C. Details in the output code: -K, --slot-name=NAME Select name of the keyword component in the keyword structure. -F, --initializer-suffix=INITIALIZERS Initializers for additional components in the keyword structure. -H, --hash-function-name=NAME Specify name of generated hash function. Default is 'hash'. -N, --lookup-function-name=NAME Specify name of generated lookup function. Default name is 'in_word_set'. -Z, --class-name=NAME Specify name of generated C++ class. Default name is 'Perfect_Hash'. -7, --seven-bit Assume 7-bit characters. -l, --compare-lengths Compare key lengths before trying a string comparison. This is necessary if the keywords contain NUL bytes. It also helps cut down on the number of string comparisons made during the lookup. -c, --compare-strncmp Generate comparison code using strncmp rather than strcmp. -C, --readonly-tables Make the contents of generated lookup tables constant, i.e., readonly. -E, --enum Define constant values using an enum local to the lookup function rather than with defines. -I, --includes Include the necessary system include file at the beginning of the code. -G, --global-table Generate the static table of keywords as a static global variable, rather than hiding it inside of the lookup function (which is the default behavior). -P, --pic Optimize the generated table for inclusion in shared libraries. This reduces the startup time of programs using a shared library containing the generated code. -Q, --string-pool-name=NAME Specify name of string pool generated by option --pic. Default name is 'stringpool'. --null-strings Use NULL strings instead of empty strings for empty keyword table entries. --constants-prefix=PREFIX Specify prefix for the constants like TOTAL_KEYWORDS. -W, --word-array-name=NAME Specify name of word list array. Default name is 'wordlist'. --length-table-name=NAME Specify name of length table array. Default name is 'lengthtable'. -S, --switch=COUNT Causes the generated C code to use a switch statement scheme, rather than an array lookup table. This can lead to a reduction in both time and space requirements for some keyfiles. The COUNT argument determines how many switch statements are generated. A value of 1 generates 1 switch containing all the elements, a value of 2 generates 2 tables with 1/2 the elements in each table, etc. If COUNT is very large, say 1000000, the generated C code does a binary search. -T, --omit-struct-type Prevents the transfer of the type declaration to the output file. Use this option if the type is already defined elsewhere. Algorithm employed by gperf: -k, --key-positions=KEYS Select the key positions used in the hash function. The allowable choices range between 1-255, inclusive. The positions are separated by commas, ranges may be used, and key positions may occur in any order. Also, the meta-character '*' causes the generated hash function to consider ALL key positions, and $ indicates the "final character" of a key, e.g., $,1,2,4,6-10. -D, --duplicates Handle keywords that hash to duplicate values. This is useful for certain highly redundant keyword sets. -m, --multiple-iterations=ITERATIONS Perform multiple choices of the -i and -j values, and choose the best results. This increases the running time by a factor of ITERATIONS but does a good job minimizing the generated table size. -i, --initial-asso=N Provide an initial value for the associate values array. Default is 0. Setting this value larger helps inflate the size of the final table. -j, --jump=JUMP-VALUE Affects the "jump value", i.e., how far to advance the associated character value upon collisions. Must be an odd number, default is 5. -n, --no-strlen Do not include the length of the keyword when computing the hash function. -r, --random Utilizes randomness to initialize the associated values table. -s, --size-multiple=N Affects the size of the generated hash table. The numeric argument N indicates "how many times larger or smaller" the associated value range should be, in relationship to the number of keys, e.g. a value of 3 means "allow the maximum associated value to be about 3 times larger than the number of input keys". Conversely, a value of 1/3 means "make the maximum associated value about 3 times smaller than the number of input keys". A larger table should decrease the time required for an unsuccessful search, at the expense of extra table space. Default value is 1. Informative output: -h, --help Print this message. -v, --version Print the gperf version number. -d, --debug Enables the debugging option (produces verbose output to the standard error). Report bugs to . gperf-3.2.1/tests/irc.gperf0000664000000000000000000000350213074402054011214 %{ extern int m_text(), m_private(), m_who(), m_whois(), m_user(), m_list(); extern int m_topic(), m_invite(), m_channel(), m_version(), m_quit(); extern int m_server(), m_kill(), m_info(), m_links(), m_summon(), m_stats(); extern int m_users(), m_nick(), m_error(), m_help(), m_whoreply(); extern int m_squit(), m_restart(), m_away(), m_die(), m_connect(); extern int m_ping(), m_pong(), m_oper(), m_pass(), m_wall(), m_trace(); extern int m_time(), m_rehash(), m_names(), m_namreply(), m_admin(); extern int m_linreply(), m_notice(), m_lusers(), m_voice(), m_grph(); extern int m_xtra(), m_motd(); %} struct Message { char *cmd; int (* func)(); int count; int parameters; }; %% NICK, m_nick, 0, 1 MSG, m_text, 0, 1 PRIVMSG, m_private, 0, 2 WHO, m_who, 0, 1 WHOIS, m_whois, 0, 4 USER, m_user, 0, 4 SERVER, m_server, 0, 2 LIST, m_list, 0, 1 TOPIC, m_topic, 0, 1 INVITE, m_invite, 0, 2 CHANNEL, m_channel, 0, 1 VERSION, m_version, 0, 1 QUIT, m_quit, 0, 2 SQUIT, m_squit, 0, 2 KILL, m_kill, 0, 2 INFO, m_info, 0, 1 LINKS, m_links, 0, 1 SUMMON, m_summon, 0, 1 STATS, m_stats, 0, 1 USERS, m_users, 0, 1 RESTART, m_restart, 0, 1 WHOREPLY,m_whoreply, 0, 7 HELP, m_help, 0, 2 ERROR, m_error, 0, 1 AWAY, m_away, 0, 1 DIE, m_die, 0, 1 CONNECT, m_connect, 0, 3 PING, m_ping, 0, 2 PONG, m_pong, 0, 3 OPER, m_oper, 0, 3 PASS, m_pass, 0, 2 WALL, m_wall, 0, 1 TIME, m_time, 0, 1 REHASH, m_rehash, 0, 1 NAMES, m_names, 0, 1 NAMREPLY,m_namreply, 0, 3 ADMIN, m_admin, 0, 1 TRACE, m_trace, 0, 1 LINREPLY,m_linreply, 0, 2 NOTICE, m_notice, 0, 2 LUSERS, m_lusers, 0, 1 VOICE, m_voice, 0, 2 GRPH, m_grph, 0, 2 XTRA, m_xtra, 0, 2 MOTD, m_motd, 0, 2 gperf-3.2.1/tests/lang-ucs2.in0000664000000000000000000000042413074402054011535 -  esky Dansk English Suomi Franais Deutsch   Italiano Norsk  CAA:89 Espaol Svenska  2)2D" Trke Ting Vit eg, N-e \ gperf-3.2.1/tests/jscript.gperf0000664000000000000000000000244713074402054012124 %{ /* Command-line: gperf -k'1,2,$' -t -p -K 'name' -H 'js_kw_hash' -N 'js_kw_lookup' -a -g jscript.gperf */ %} struct js_keyword { char * name; int token; } %% # Javascript reserved words, see "keywords.html" abstract, TK_ABSTRACT boolean, TK_BOOLEAN break, TK_BREAK byte, TK_BYTE case, TK_CASE catch, TK_CATCH char, TK_CHAR class, TK_CLASS const, TK_CONST continue, TK_CONTINUE default, TK_DEFAULT do, TK_DO double, TK_DOUBLE else, TK_ELSE extends, TK_EXTENDS false, TK_FALSE final, TK_FINAL finally, TK_FINALLY float, TK_FLOAT for, TK_FOR function, TK_FUNCTION goto, TK_GOTO if, TK_IF implements, TK_IMPLEMENTS import, TK_IMPORT in, TK_IN instanceof, TK_INSTANCEOF int, TK_INT interface, TK_INTERFACE long, TK_LONG native, TK_NATIVE new, TK_NEW null, TK_NULL package, TK_PACKAGE private, TK_PRIVATE protected, TK_PROTECTED public, TK_PUBLIC return, TK_RETURN short, TK_SHORT static, TK_STATIC super, TK_SUPER switch, TK_SWITCH synchronized, TK_SYNCHRONIZED this, TK_THIS throw, TK_THROW throws, TK_THROWS transient, TK_TRANSIENT true, TK_TRUE try, TK_TRY var, TK_VAR void, TK_VOID while, TK_WHILE with, TK_WITH %% int js_keyword_lookup (register const char *str, register int len) { struct js_keyword * keyword = js_kw_lookup(str,len); if (keyword) return keyword->token; else return TK_IDENT; } gperf-3.2.1/tests/ada.gperf0000664000000000000000000000055613074402054011172 else exit terminate type raise range reverse declare end record exception not then return separate select digits renames subtype elsif function for package procedure private while when new entry delay case constant at abort accept and delta access abs pragma array use out do others of or all limited loop null task in is if rem mod begin body xor goto generic with gperf-3.2.1/tests/validate0000775000000000000000000000351514476330453011147 #! /bin/sh # Validate gperf's operation on a given input file. # Usage: validate languages input.gperf [more gperf options] # Uses the environment variables GPERF, CC, CFLAGS, CXX, CXXFLAGS. # Supposes gcc and g++. # Exit on error set -e verbose () { echo "$@" "$@" } languages=$1 shift # On old systems, it's worth trying gcc -traditional. # On glibc-2.1 systems, gcc -traditional doesn't work any more. use_traditional=false for lang in `echo $languages | sed -e 's/,/ /g'`; do case "$lang" in KR-C ) echo "${GPERF} -I -L KR-C $@ > valitest.c" ${GPERF} -I -L KR-C "$@" > valitest.c if test $use_traditional = true; then verbose ${CC} ${CFLAGS} ${CPPFLAGS} -traditional valitest.c -o valitest ./valitest fi verbose ${CC} ${CFLAGS} ${CPPFLAGS} -ansi -pedantic valitest.c -o valitest ./valitest ;; C ) echo "${GPERF} -I -L C $@ > valitest.c" ${GPERF} -I -L C "$@" > valitest.c if test $use_traditional = true; then verbose ${CC} ${CFLAGS} ${CPPFLAGS} -traditional -Dconst= valitest.c -o valitest ./valitest fi verbose ${CC} ${CFLAGS} ${CPPFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest ./valitest ;; ANSI-C ) echo "${GPERF} -I -L ANSI-C $@ > valitest.c" ${GPERF} -I -L ANSI-C "$@" > valitest.c verbose ${CC} ${CFLAGS} ${CPPFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest ./valitest verbose ${CXX} ${CXXFLAGS} ${CPPFLAGS} -ansi -pedantic -pedantic-errors valitest.c -o valitest ./valitest ;; "C++" ) echo "${GPERF} -I -L C++ $@ > valitest.c" ${GPERF} -I -L C++ "$@" > valitest.c verbose ${CXX} ${CXXFLAGS} ${CPPFLAGS} -ansi -pedantic -pedantic-errors -DCPLUSPLUS_TEST valitest.c -o valitest ./valitest ;; esac done exit 0 gperf-3.2.1/tests/chill.gperf0000664000000000000000000002723413074402054011542 struct resword { const char *name; short token; enum rid rid; enum toktype { RESERVED, DIRECTIVE, PREDEF } flags; }; extern tree ridpointers []; %% access, ACCESS, NORID, RESERVED after, AFTER, NORID, RESERVED all, ALL, NORID, RESERVED all_static_off, ALL_STATIC_OFF, NORID, DIRECTIVE all_static_on, ALL_STATIC_ON, NORID, DIRECTIVE and, AND, NORID, RESERVED andif, ANDIF, NORID, RESERVED array, ARRAY, NORID, RESERVED asm, ASM_KEYWORD, NORID, RESERVED assert, ASSERT, NORID, RESERVED at, AT, NORID, RESERVED based, BASED, NORID, RESERVED begin, BEGINTOKEN, NORID, RESERVED bin, BIN, NORID, RESERVED bit, BOOLS, RID_BOOLS, PREDEF body, BODY, NORID, RESERVED bools, BOOLS, RID_BOOLS, RESERVED buffer, BUFFER, NORID, RESERVED buffer_code, IGNORED_DIRECTIVE, NORID, DIRECTIVE by, BY, NORID, RESERVED call, CALL, NORID, RESERVED case, CASE, NORID, RESERVED cause, CAUSE, NORID, RESERVED ccitt_os, IGNORED_DIRECTIVE, NORID, DIRECTIVE chars, CHARS, NORID, RESERVED context, CONTEXT, NORID, RESERVED continue, CONTINUE, NORID, RESERVED cycle, CYCLE, NORID, RESERVED dcl, DCL, NORID, RESERVED debug_lines, IGNORED_DIRECTIVE, NORID, DIRECTIVE debug_symbols, IGNORED_DIRECTIVE, NORID, DIRECTIVE debug_types, IGNORED_DIRECTIVE, NORID, DIRECTIVE delay, DELAY, NORID, RESERVED do, DO, NORID, RESERVED down, DOWN, NORID, RESERVED dynamic, DYNAMIC, RID_DYNAMIC, RESERVED else, ELSE, NORID, RESERVED elsif, ELSIF, NORID, RESERVED empty_off, EMPTY_OFF, NORID, DIRECTIVE empty_on, EMPTY_ON, NORID, DIRECTIVE end, END, NORID, RESERVED esac, ESAC, NORID, RESERVED even, IGNORED_DIRECTIVE, NORID, DIRECTIVE event, EVENT, NORID, RESERVED event_code, IGNORED_DIRECTIVE, NORID, DIRECTIVE ever, EVER, NORID, RESERVED exceptions, EXCEPTIONS, NORID, RESERVED exit, EXIT, NORID, RESERVED extra_const_seg, IGNORED_DIRECTIVE, NORID, DIRECTIVE far, IGNORED_DIRECTIVE, NORID, DIRECTIVE fi, FI, NORID, RESERVED for, FOR, NORID, RESERVED forbid, FORBID, NORID, RESERVED general, GENERAL, NORID, RESERVED generate_all_set_names, IGNORED_DIRECTIVE, NORID, DIRECTIVE generate_set_names, IGNORED_DIRECTIVE, NORID, DIRECTIVE goto, GOTO, NORID, RESERVED grant, GRANT, NORID, RESERVED grant_file_size, IGNORED_DIRECTIVE, NORID, DIRECTIVE if, IF, NORID, RESERVED in, IN, RID_IN, RESERVED init, INIT, NORID, RESERVED inline, INLINE, RID_INLINE, RESERVED inout, PARAMATTR, RID_INOUT, RESERVED large, IGNORED_DIRECTIVE, NORID, DIRECTIVE list, IGNORED_DIRECTIVE, NORID, DIRECTIVE loc, LOC, NORID, RESERVED make_publics_for_discrete_syns, IGNORED_DIRECTIVE, NORID, DIRECTIVE medium, IGNORED_DIRECTIVE, NORID, DIRECTIVE mod, MOD, NORID, RESERVED module, MODULE, NORID, RESERVED multiple_const_segs, IGNORED_DIRECTIVE, NORID, DIRECTIVE multiple_data_segs, IGNORED_DIRECTIVE, NORID, DIRECTIVE newmode, NEWMODE, NORID, RESERVED nolist, IGNORED_DIRECTIVE, NORID, DIRECTIVE no_overlap_check, IGNORED_DIRECTIVE, NORID, DIRECTIVE nonref, NONREF, NORID, RESERVED nopack, NOPACK, NORID, RESERVED not, NOT, NORID, RESERVED od, OD, NORID, RESERVED of, OF, NORID, RESERVED on, ON, NORID, RESERVED only_for_simulation, IGNORED_DIRECTIVE, NORID, DIRECTIVE only_for_target, IGNORED_DIRECTIVE, NORID, DIRECTIVE optimize, IGNORED_DIRECTIVE, NORID, DIRECTIVE optimize_runtime, IGNORED_DIRECTIVE, NORID, DIRECTIVE optimization_window, IGNORED_DIRECTIVE, NORID, DIRECTIVE or, OR, NORID, RESERVED orif, ORIF, NORID, RESERVED out, PARAMATTR, RID_OUT, RESERVED pack, PACK, NORID, RESERVED page, IGNORED_DIRECTIVE, NORID, DIRECTIVE pos, POS, NORID, RESERVED powerset, POWERSET, NORID, RESERVED prefixed, PREFIXED, NORID, RESERVED print_o_code, IGNORED_DIRECTIVE, NORID, DIRECTIVE print_symbol_table, IGNORED_DIRECTIVE, NORID, DIRECTIVE priority, PRIORITY, NORID, RESERVED proc, PROC, NORID, RESERVED process, PROCESS, NORID, RESERVED process_type, PROCESS_TYPE_TOKEN, NORID, DIRECTIVE range, RANGE, NORID, RESERVED range_off, RANGE_OFF, NORID, DIRECTIVE range_on, RANGE_ON, NORID, DIRECTIVE read, READ, RID_READ, RESERVED receive, RECEIVE, NORID, RESERVED recursive, RECURSIVE, NORID, RESERVED reentrant, IGNORED_DIRECTIVE, NORID, DIRECTIVE reentrant_all, IGNORED_DIRECTIVE, NORID, DIRECTIVE ref, REF, NORID, RESERVED region, REGION, NORID, RESERVED rem, REM, NORID, RESERVED remote, REMOTE, NORID, RESERVED result, RESULT, NORID, RESERVED return, RETURN, NORID, RESERVED returns, RETURNS, NORID, RESERVED row, ROW, NORID, RESERVED seize, SEIZE, NORID, RESERVED send, SEND, NORID, RESERVED send_buffer_default_priority, SEND_BUFFER_DEFAULT_PRIORITY, NORID, DIRECTIVE send_signal_default_priority, SEND_SIGNAL_DEFAULT_PRIORITY, NORID, DIRECTIVE set, SET, NORID, RESERVED short_pred_succ, IGNORED_DIRECTIVE, NORID, DIRECTIVE signal, SIGNAL, NORID, RESERVED signal_code, SIGNAL_CODE, NORID, DIRECTIVE signal_max_length, IGNORED_DIRECTIVE, NORID, DIRECTIVE simple, SIMPLE, NORID, RESERVED small, IGNORED_DIRECTIVE, NORID, DIRECTIVE spec, SPEC, NORID, RESERVED start, START, NORID, RESERVED state_routine, IGNORED_DIRECTIVE, NORID, DIRECTIVE static, STATIC, NORID, RESERVED step, STEP, NORID, RESERVED stop, STOP, NORID, RESERVED struct, STRUCT, NORID, RESERVED support_causing_address, IGNORED_DIRECTIVE, NORID, DIRECTIVE syn, SYN, NORID, RESERVED synmode, SYNMODE, NORID, RESERVED text, TEXT, NORID, RESERVED then, THEN, NORID, RESERVED this, THIS, NORID, RESERVED timeout, TIMEOUT, NORID, RESERVED to, TO, NORID, RESERVED up, UP, NORID, RESERVED use_seize_file, USE_SEIZE_FILE, NORID, DIRECTIVE use_seize_file_restricted, USE_SEIZE_FILE_RESTRICTED, NORID, DIRECTIVE varying, VARYING, NORID, RESERVED while, WHILE, NORID, RESERVED with, WITH, NORID, RESERVED xor, XOR, NORID, RESERVED ACCESS, ACCESS, NORID, RESERVED AFTER, AFTER, NORID, RESERVED ALL, ALL, NORID, RESERVED ALL_STATIC_OFF, ALL_STATIC_OFF, NORID, DIRECTIVE ALL_STATIC_ON, ALL_STATIC_ON, NORID, DIRECTIVE AND, AND, NORID, RESERVED ANDIF, ANDIF, NORID, RESERVED ARRAY, ARRAY, NORID, RESERVED ASM, ASM_KEYWORD, NORID, RESERVED ASSERT, ASSERT, NORID, RESERVED AT, AT, NORID, RESERVED BASED, BASED, NORID, RESERVED BEGIN, BEGINTOKEN, NORID, RESERVED BIN, BIN, NORID, RESERVED BIT, BOOLS, RID_BOOLS, PREDEF BODY, BODY, NORID, RESERVED BOOLS, BOOLS, RID_BOOLS, RESERVED BUFFER, BUFFER, NORID, RESERVED BUFFER_CODE, IGNORED_DIRECTIVE, NORID, DIRECTIVE BY, BY, NORID, RESERVED CALL, CALL, NORID, RESERVED CASE, CASE, NORID, RESERVED CAUSE, CAUSE, NORID, RESERVED CCITT_OS, IGNORED_DIRECTIVE, NORID, DIRECTIVE CHARS, CHARS, NORID, RESERVED CONTEXT, CONTEXT, NORID, RESERVED CONTINUE, CONTINUE, NORID, RESERVED CYCLE, CYCLE, NORID, RESERVED DCL, DCL, NORID, RESERVED DEBUG_LINES, IGNORED_DIRECTIVE, NORID, DIRECTIVE DEBUG_SYMBOLS, IGNORED_DIRECTIVE, NORID, DIRECTIVE DEBUG_TYPES, IGNORED_DIRECTIVE, NORID, DIRECTIVE DELAY, DELAY, NORID, RESERVED DO, DO, NORID, RESERVED DOWN, DOWN, NORID, RESERVED DYNAMIC, DYNAMIC, RID_DYNAMIC, RESERVED ELSE, ELSE, NORID, RESERVED ELSIF, ELSIF, NORID, RESERVED EMPTY_OFF, EMPTY_OFF, NORID, DIRECTIVE EMPTY_ON, EMPTY_ON, NORID, DIRECTIVE END, END, NORID, RESERVED ESAC, ESAC, NORID, RESERVED EVEN, IGNORED_DIRECTIVE, NORID, DIRECTIVE EVENT, EVENT, NORID, RESERVED EVENT_CODE, IGNORED_DIRECTIVE, NORID, DIRECTIVE EVER, EVER, NORID, RESERVED EXCEPTIONS, EXCEPTIONS, NORID, RESERVED EXIT, EXIT, NORID, RESERVED EXTRA_CONST_SEG, IGNORED_DIRECTIVE, NORID, DIRECTIVE FAR, IGNORED_DIRECTIVE, NORID, DIRECTIVE FI, FI, NORID, RESERVED FOR, FOR, NORID, RESERVED FORBID, FORBID, NORID, RESERVED GENERAL, GENERAL, NORID, RESERVED GENERATE_ALL_SET_NAMES, IGNORED_DIRECTIVE, NORID, DIRECTIVE GENERATE_SET_NAMES, IGNORED_DIRECTIVE, NORID, DIRECTIVE GOTO, GOTO, NORID, RESERVED GRANT, GRANT, NORID, RESERVED GRANT_FILE_SIZE, IGNORED_DIRECTIVE, NORID, DIRECTIVE IF, IF, NORID, RESERVED IN, IN, RID_IN, RESERVED INIT, INIT, NORID, RESERVED INLINE, INLINE, RID_INLINE, RESERVED INOUT, PARAMATTR, RID_INOUT, RESERVED LARGE, IGNORED_DIRECTIVE, NORID, DIRECTIVE LIST, IGNORED_DIRECTIVE, NORID, DIRECTIVE LOC, LOC, NORID, RESERVED MAKE_PUBLICS_FOR_DISCRETE_SYNS, IGNORED_DIRECTIVE, NORID, DIRECTIVE MEDIUM, IGNORED_DIRECTIVE, NORID, DIRECTIVE MOD, MOD, NORID, RESERVED MODULE, MODULE, NORID, RESERVED MULTIPLE_CONST_SEGS, IGNORED_DIRECTIVE, NORID, DIRECTIVE MULTIPLE_DATA_SEGS, IGNORED_DIRECTIVE, NORID, DIRECTIVE NEWMODE, NEWMODE, NORID, RESERVED NOLIST, IGNORED_DIRECTIVE, NORID, DIRECTIVE NO_OVERLAP_CHECK, IGNORED_DIRECTIVE, NORID, DIRECTIVE NONREF, NONREF, NORID, RESERVED NOPACK, NOPACK, NORID, RESERVED NOT, NOT, NORID, RESERVED OD, OD, NORID, RESERVED OF, OF, NORID, RESERVED ON, ON, NORID, RESERVED ONLY_FOR_SIMULATION, IGNORED_DIRECTIVE, NORID, DIRECTIVE ONLY_FOR_TARGET, IGNORED_DIRECTIVE, NORID, DIRECTIVE OPTIMIZE, IGNORED_DIRECTIVE, NORID, DIRECTIVE OPTIMIZE_RUNTIME, IGNORED_DIRECTIVE, NORID, DIRECTIVE OPTIMIZATION_WINDOW, IGNORED_DIRECTIVE, NORID, DIRECTIVE OR, OR, NORID, RESERVED ORIF, ORIF, NORID, RESERVED OUT, PARAMATTR, RID_OUT, RESERVED PACK, PACK, NORID, RESERVED PAGE, IGNORED_DIRECTIVE, NORID, DIRECTIVE POS, POS, NORID, RESERVED POWERSET, POWERSET, NORID, RESERVED PREFIXED, PREFIXED, NORID, RESERVED PRINT_O_CODE, IGNORED_DIRECTIVE, NORID, DIRECTIVE PRINT_SYMBOL_TABLE, IGNORED_DIRECTIVE, NORID, DIRECTIVE PRIORITY, PRIORITY, NORID, RESERVED PROC, PROC, NORID, RESERVED PROCESS, PROCESS, NORID, RESERVED PROCESS_TYPE, PROCESS_TYPE_TOKEN, NORID, DIRECTIVE RANGE, RANGE, NORID, RESERVED RANGE_OFF, RANGE_OFF, NORID, DIRECTIVE RANGE_ON, RANGE_ON, NORID, DIRECTIVE READ, READ, RID_READ, RESERVED RECEIVE, RECEIVE, NORID, RESERVED RECURSIVE, RECURSIVE, NORID, RESERVED REENTRANT, IGNORED_DIRECTIVE, NORID, DIRECTIVE REENTRANT_ALL, IGNORED_DIRECTIVE, NORID, DIRECTIVE REF, REF, NORID, RESERVED REGION, REGION, NORID, RESERVED REM, REM, NORID, RESERVED REMOTE, REMOTE, NORID, RESERVED RESULT, RESULT, NORID, RESERVED RETURN, RETURN, NORID, RESERVED RETURNS, RETURNS, NORID, RESERVED ROW, ROW, NORID, RESERVED SEIZE, SEIZE, NORID, RESERVED SEND, SEND, NORID, RESERVED SEND_BUFFER_DEFAULT_PRIORITY, SEND_BUFFER_DEFAULT_PRIORITY, NORID, DIRECTIVE SEND_SIGNAL_DEFAULT_PRIORITY, SEND_SIGNAL_DEFAULT_PRIORITY, NORID, DIRECTIVE SET, SET, NORID, RESERVED SHORT_PRED_SUCC, IGNORED_DIRECTIVE, NORID, DIRECTIVE SIGNAL, SIGNAL, NORID, RESERVED SIGNAL_CODE, SIGNAL_CODE, NORID, DIRECTIVE SIGNAL_MAX_LENGTH, IGNORED_DIRECTIVE, NORID, DIRECTIVE SIMPLE, SIMPLE, NORID, RESERVED SMALL, IGNORED_DIRECTIVE, NORID, DIRECTIVE SPEC, SPEC, NORID, RESERVED START, START, NORID, RESERVED STATE_ROUTINE, IGNORED_DIRECTIVE, NORID, DIRECTIVE STATIC, STATIC, NORID, RESERVED STEP, STEP, NORID, RESERVED STOP, STOP, NORID, RESERVED STRUCT, STRUCT, NORID, RESERVED SUPPORT_CAUSING_ADDRESS, IGNORED_DIRECTIVE, NORID, DIRECTIVE SYN, SYN, NORID, RESERVED SYNMODE, SYNMODE, NORID, RESERVED TEXT, TEXT, NORID, RESERVED THEN, THEN, NORID, RESERVED THIS, THIS, NORID, RESERVED TIMEOUT, TIMEOUT, NORID, RESERVED TO, TO, NORID, RESERVED UP, UP, NORID, RESERVED USE_SEIZE_FILE, USE_SEIZE_FILE, NORID, DIRECTIVE USE_SEIZE_FILE_RESTRICTED, USE_SEIZE_FILE_RESTRICTED, NORID, DIRECTIVE VARYING, VARYING, NORID, RESERVED WHILE, WHILE, NORID, RESERVED WITH, WITH, NORID, RESERVED XOR, XOR, NORID, RESERVED gperf-3.2.1/tests/modula2.exp0000664000000000000000000002366114776761041011521 /* ANSI-C code produced by gperf version 3.2.1 */ /* Command-line: gperf -n -k1-8 -l */ #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) /* The character set is not based on ISO-646. */ #error "gperf generated tables don't work with this execution character set. Please report a bug to ." #endif #define TOTAL_KEYWORDS 40 #define MIN_WORD_LENGTH 2 #define MAX_WORD_LENGTH 14 #define MIN_HASH_VALUE 1 #define MAX_HASH_VALUE 155 /* maximum key range = 155, duplicates = 0 */ #ifdef __GNUC__ __inline #else #ifdef __cplusplus inline #endif #endif static unsigned int hash (register const char *str, register size_t len) { static unsigned char asso_values[] = { 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 1, 10, 30, 25, 0, 10, 55, 6, 0, 156, 156, 15, 15, 35, 15, 30, 0, 5, 1, 0, 45, 21, 45, 6, 1, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, 156 }; register unsigned int hval = 0; switch (len) { default: hval += asso_values[(unsigned char)str[7]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 7: hval += asso_values[(unsigned char)str[6]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 6: hval += asso_values[(unsigned char)str[5]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 5: hval += asso_values[(unsigned char)str[4]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 4: hval += asso_values[(unsigned char)str[3]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 3: hval += asso_values[(unsigned char)str[2]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 2: hval += asso_values[(unsigned char)str[1]]; #if (defined __cplusplus && (__cplusplus >= 201703L || (__cplusplus >= 201103L && defined __clang__ && __clang_major__ + (__clang_minor__ >= 9) > 3))) || (defined __STDC_VERSION__ && __STDC_VERSION__ >= 202000L && ((defined __GNUC__ && __GNUC__ >= 10) || (defined __clang__ && __clang_major__ >= 9))) [[fallthrough]]; #elif (defined __GNUC__ && __GNUC__ >= 7) || (defined __clang__ && __clang_major__ >= 10) __attribute__ ((__fallthrough__)); #endif /*FALLTHROUGH*/ case 1: hval += asso_values[(unsigned char)str[0]]; break; } return hval; } const char * in_word_set (register const char *str, register size_t len) { static unsigned char lengthtable[] = { 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 2, 2, 0, 5, 0, 2, 4, 0, 0, 0, 2, 0, 0, 0, 0, 2, 5, 3, 0, 0, 3, 4, 4, 0, 0, 2, 6, 0, 0, 0, 2, 4, 0, 0, 0, 4, 3, 0, 0, 0, 3, 4, 0, 0, 0, 3, 6, 0, 0, 0, 3, 3, 0, 0, 0, 6, 5, 0, 0, 0, 10, 9, 0, 0, 0, 4, 0, 0, 0, 0, 6, 5, 0, 0, 0, 7, 0, 0, 0, 0, 6, 0, 0, 0, 0, 5, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 }; static const char * wordlist[] = { "", "SET", "", "", "", "", "EXIT", "", "", "", "IF", "BY", "", "ARRAY", "", "TO", "ELSE", "", "", "", "OR", "", "", "", "", "OF", "ELSIF", "VAR", "", "", "FOR", "TYPE", "CASE", "", "", "IN", "REPEAT", "", "", "", "DO", "THEN", "", "", "", "FROM", "DIV", "", "", "", "NOT", "WITH", "", "", "", "MOD", "EXPORT", "", "", "", "END", "AND", "", "", "", "IMPORT", "WHILE", "", "", "", "DEFINITION", "QUALIFIED", "", "", "", "LOOP", "", "", "", "", "RECORD", "CONST", "", "", "", "POINTER", "", "", "", "", "RETURN", "", "", "", "", "UNTIL", "", "", "", "", "BEGIN", "", "", "", "", "", "", "", "", "", "IMPLEMENTATION", "", "", "", "", "MODULE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "PROCEDURE" }; if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) { register unsigned int key = hash (str, len); if (key <= MAX_HASH_VALUE) if (len == lengthtable[key]) { register const char *s = wordlist[key]; if (*str == *s && !memcmp (str + 1, s + 1, len - 1)) return s; } } return (const char *) 0; } gperf-3.2.1/COPYING0000664000000000000000000010451313074402054007307 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read .